mongodb 常見問題處理方法收集

問題1:非正常關閉服務或關機後 mongod服務沒法正常啓動

在使用中發現mongodb 的服務可能由於非正常關閉而啓動不了,這時咱們經過
刪除data目錄下的 *.lock文件,再運行下/mongodb_binpath/mongod -repair -f config文件路徑 再啓動便可
也能夠在/etc/init.d/mongod 服務啓動的文件中加入啓動前刪除該文件 以下:
python


 1.png

問題2:server-side JavaScript execution is disabledmongodb

完整信息:JavaScript execution failed: group command failed: { "ok" : 0, "errmsg" : "server-side JavaScript execution is disabled" }
解決方法:mongod.conf 這個配置文件裏(配置文件須要本身建立)
shell

noscripting:false 數據庫

若是true 就是禁止架構

 

問題3:Decimal轉換成BsonValue值異常併發

BsonValue 暫不支持 Decimal類型,轉換前強制轉換類型,ide

3.png

若是用MongoDB,最好不要用decimal類型,不然在序列化的時候也有問題,可用double大數據

 

問題4:MONGO Replica 頻繁插入大數據的問題spa

當在複製集中頻繁插入大數據時有可能出現 「error RS102 too stale to catch up",出現這個錯誤的緣由是SECONDARY即副節點的複製速度跟不上了,當須要批量頻繁向副本集中寫入數據時最好先移除副本節點,待插入完後從新同步。命令行

 

問題5:Mongo集羣沒有primary但有secondary時鏈接不上且不能讀數據

#mongodb默認是從主節點讀寫數據的,副本節點上不容許讀,須要設置副本節點能夠讀。
shell
1 repset:SECONDARY> db.getMongo().setSlaveOk(); #要在primary上執行
2 rs.slaveOk()


其餘客戶端
從secondary 讀數據
若是應用程序沒有設置相應的ReadReference也可能不能進行讀取操做

MongoClientSettings set = new MongoClientSettings();
List<MongoServerAddress> servers = new List<MongoServerAddress>();
servers.Add(new MongoServerAddress("192.168.129.129", 37017));
servers.Add(new MongoServerAddress("192.168.129.129", 37018));
servers.Add(new MongoServerAddress("192.168.129.129", 37019));
set.Servers = servers;

//設置副本集名稱
set.ReplicaSetName = "rs0";
//設置超時時間爲3秒
set.ConnectTimeout = new TimeSpan(0, 0, 0, 3, 0);

MongoClient client = new MongoClient(set);
MongoServer server = client.GetServer();
MongoDatabase db = server.GetDatabase("test");
MongoCollection coll = db.GetCollection("test");

注:設置驅動的ReadReference也能夠經過MongoDB鏈接字符串配置:mongodb://example1.com,example2.com,example3.com/?readPreference=secondary。經過鏈接字符串指定的read preference是針對整個鏈接。

set.ReadPreference = new ReadPreference(ReadPreferenceMode.PrimaryPreferred);
將ReadPreferenceMode設置成Secondary或SecondaryPreferred

 

問題6:addshard 遇到的錯誤

db.runCommand({addshard:」172.16.5.104:20000″})
{
「ok」 : 0,
「errmsg」 : 「can't use localhost as a shard since all shards need to communicate. either use all shards and configdbs in localhost or all in actual IPs host: 172.16.5.104:20000 isLocalHost:0″
}

遇到這樣的錯誤是因爲某些服務啓動在 localhost 地址。
通過檢查發現 route 啓動時,讀取 config 服務是讀取的 localhost 地址:

./mongos –port 40000 –configdb localhost:30000 –fork –logpath /data/route/log/route.log –chunkSize 1

將 localhost 修改成 IP 地址,問題解決。

 

另外若是不以 localhost 爲地址連接,那麼 config 啓動的時候不能加 –auth 選項,否則會在log文件中遇到如下錯誤:

ERROR: config servers not in sync! not authorized, did you start with –keyFile?

此時進程沒法啓動

 

問題7:在 route 和 config 準備完畢後,經過 route 以遠程 IP 爲地址添加shard,則報錯:(有 –auth 參數)

db.runCommand({addshard:'a1:28010′})
{
「ok」 : 0,
「errmsg」 : 「failed listing a1:28010′s databases:{ errmsg: \」need to login\」, ok: 0.0 }」
}

去掉 –auth 參數,添加 shard,成功!

 

依舊保留 –auth 參數,添加用戶後,再添加shard。報錯:

「errmsg」 : 「couldn't connect to new shard DBClientBase::findN: transport error: a1:28010 query: { getlasterror: 1 }」

 

問題8:RepairDatabase命令的使用:
數據庫總會出現問題的,關於修復的方法以下:
運行db.repairDatabase()來整理記錄,但這個過程會比較緩慢。
當MongoDB作的是副本集羣時:能夠直接把數據rm掉,而後再從新啓動。

問題9:當在不是primariy server上運行時,會獲得一個"clone failed for wkgbc with error: query failed wkgbc.system.namespaces"

爲了修復,須要restart server 不加--replSet選項而且要選用不一樣的端口

問題10:LINUX下找出哪一個進程形成的IO等待很高的方法,能夠判斷是否是IO問題形成的:
#/etc/init.d/syslog stop
#echo 1 > /proc/sys/vm/block_dump
#dmesg |egrep "READ|WRITE|dirtied"|egrep -o '([a-zA-Z*])'|sort|uniq -c|sort -rn|head
   

問題11:訪問mongodb的python程序開始出錯,常常拋出AssertionError異常

查證是否只是master查詢異常,而slave正常,若是隻是master查詢異常,可判斷爲master的數據出了問題。

修復過程:

1、在master作db.repairDatabase(),不起做用; 這個時間很長
二、中止slave的同步;
三、對slave做mongodump,備份數據;
四、對master做mongostore,把備份數據恢復,使用–drop參數能夠先把原表刪除。
五、恢復slave的同步。

 

問題12:碎片整理-replSet架構

1、rs.freeze(60)    在60s內該機器沒法成爲primary
二、在primary機上進行rs.stepDown([120]) 讓該機器成爲從節點且在120s內不會成爲primary
三、在primary上 ,能夠將data的數據刪掉 ,啓動。數據會自動同步上去。

 

問題13:主備同步滯後

生產環境,最好經過db.printSlaveReplicationInfo()來監控主備同步滯後的狀況,當Secondary落後太多時,要及時調查清楚緣由。

當Secondary同步滯後是由於主上併發寫入過高致使,(db.serverStatus().metrics.repl.buffer.sizeBytes持續接近db.serverStatus().metrics.repl.buffer.maxSizeBytes),可經過調整Secondary上replWriter併發線程數來提高。

 

注意事項:

·  initial sync單線程複製數據,效率比較低,生產環境應該儘可能避免initial sync出現,需合理配置oplog,按默認『5%的可用磁盤空間』來配置oplog在絕大部分場景下都能知足需求,特殊的case(case1, case2)可根據實際狀況設置更大的oplog

 

·  新加入節點時,能夠經過物理複製的方式來避免initial sync,將Primary上的dbpath拷貝到新的節點,直接啓動,這樣效率更高。

·  Secondary上須要的oplog在同步源上已經滾掉時,Secondary的同步將沒法正常進行,會進入RECOVERING的狀態,需向Secondary主動發送resyc命令從新同步。3.2版本目前有個bug,可能致使resync不能正常工做,必須強制(kill -9)重啓節點,詳情參考SERVER-24773

 

問題14:MongoDB Secondary同步慢問題

Primary寫入QPS過高,致使Seconary的同步沒法跟上的問題

默認狀況下,Secondary採用16replWriter線程來重放oplog,可經過啓動時設置replWriterThreadCount參數來定製線程數,當提高線程數到32時,同步的狀況大大改觀,主備寫入的qps基本持平,主備上數據同步的延時控制在1s之內

  1. 經過mongod命令行來指定      

mongod --setParameter replWriterThreadCount=32

 

  1. 在配置文件中指定

setParameter:

replWriterThreadCount: 32

相關文章
相關標籤/搜索