在使用中發現mongodb 的服務可能由於非正常關閉而啓動不了,這時咱們經過
刪除data目錄下的 *.lock文件,再運行下/mongodb_binpath/mongod -repair -f config文件路徑 再啓動便可
也能夠在/etc/init.d/mongod 服務啓動的文件中加入啓動前刪除該文件 以下:python
問題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
若是用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採用16個replWriter線程來重放oplog,可經過啓動時設置replWriterThreadCount參數來定製線程數,當提高線程數到32時,同步的狀況大大改觀,主備寫入的qps基本持平,主備上數據同步的延時控制在1s之內
經過mongod命令行來指定
mongod --setParameter replWriterThreadCount=32
在配置文件中指定
setParameter:
replWriterThreadCount: 32