MongoDB加索引DB崩潰的問題

項目原因,最近在對MongoDB進行數據存儲優化
 
原有問題:
日誌數據量比較大,存到一張表,需要手工定時刪除數據,且刪除數據時間按天算
數據會定時打包到HDFS,查詢時間很慢,需要優化
機器內存佔用過大,副本集主節點內存佔用超過90%,其他節點超過80%
 
解決方法:
對日誌進行按天寫表,定時刪除歷史表
對日誌表增加TTL索引,定時刪除過期數據
一次創建自動增加索引,索引查詢
 
 
本次問題來自增加索引,數據量大表的,增加索引方式,應該爲後臺增加[background: true],TTL TimeToLive 創建方式爲增加expireAfterSeconds,單位爲秒
語句如下:
 db.KafkaFpInfo.createIndex({"TrackTime":1},{background: true,expireAfterSeconds: 1728000})
1、執行語句後,發現主節點,已經看到索引生成進度日誌,服務器內存正常,CPU從100%升級到300%左右;
2、看到主節點索引生成完成後,開始同步從節點
3、此時,主節點日誌報錯,顯示兩個從節點心跳丟失;三副本,兩個節點丟失,副本集進入恢復模式,廢了
4、查看從節點機器進程,發現兩臺MongoDB進程已經崩潰;嘗試啓動服務,發現跑索引,跑到10%時,服務返回超時
 
Job for mongodb.service failed because a timeout was exceeded. See "systemctl status mongodb.service" and "journalctl -xe" for details.

查看明細 "systemctl status mongodb.service"
mongodb.service start operation timed out. Terminating.
mongodb.service stop-final-sigterm timed out. Killing.

 

5、查看索引只跑到了10%,猜測是原因是索引未完成,就超時了,嘗試對服務增加超時配置;
TimeoutSec=0     # 單位是秒,0爲不限制
 
cat /etc/systemd/system/mongodb.service
[Unit]

Description=mongodb_service
After=network.target remote-fs.target nss-lookup.target
[Service]
User=mongodbuser
Group=mongodbuser
# (open files)
LimitNOFILE=64000
Type=forking
ExecStart=/data/mongodb/mongobin/bin/mongod --config /etc/mongodb.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/data/mongodb/mongobin/bin/mongod --shutdown --config /etc/mongodb.conf
PrivateTmp=true
TimeoutSec=0     # 單位是秒,0爲不限制

[Install]
WantedBy=multi-user.target

 

6、再次重啓從節點mongoDB服務,日誌顯示索引生成中,直到報索引生成100%,啓動服務命令未再報超時,服務啓動成功。
 
正常情況下,該問題應該是解決了;但又有的如下的報錯:
“could not find member to sync from” 

 

猜測可能是同步出問題了。
嘗試關閉一個從節點的mongoDB服務,刪除該從節點的上數據。讓數據重新同步過來。
因數據比較大,啓動後IO持續比較高。  [用iotop 查看磁盤IO]
 
經過漫長的幾小時,這個從節點終於恢復了。
 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章