濮阳杆衣贸易有限公司

主頁 > 知識庫 > mongodb 常見問題處理方法收集

mongodb 常見問題處理方法收集

熱門標簽:濟南電銷機器人加盟公司 電銷機器人是什么軟件 杭州人工電銷機器人價格 云南外呼系統(tǒng) 老虎洗衣店地圖標注 蘋果汽車租賃店地圖標注 怎么投訴地圖標注 廣州長安公司怎樣申請400電話 呼和浩特電銷外呼系統(tǒng)加盟

1 非正常關(guān)閉服務或關(guān)機后 mongod服務無法正常啟動

在使用中發(fā)現(xiàn)mongodb 的服務很容易因為非正常關(guān)閉而啟動不了,不過解決也很容易
刪除data目錄下的 *.lock文件,再運行下 /mongodb_binpath/mongod -repair -f config文件路徑 再啟動即可
也可以在/etc/init.d/mongod 服務啟動的文件中加入 啟動前刪除該文件 如下:

start() {
rm -f /usr/mongodb/data/master/mongod.lock
/usr/mongodb/bin/mongod --config /usr/mongodb/config/master.conf
}

2、server-side JavaScript execution is disabled

完整信息:JavaScript execution failed: group command failed: { "ok" : 0, "errmsg" : "server-side JavaScript execution is disabled" }
解決方法:mongod.conf 這個配置文件里 noscripting:false 如果true 就是禁止

3、 Decimal轉(zhuǎn)換成BsonValue值異常

BsonValue 暫不支持 Decimal類型,轉(zhuǎn)換前強制轉(zhuǎn)換類型,

if (type==typeof(Decimal))
{
return Convert.ToDouble(value);
}

如果用MongoDB,最好不要用decimal類型,否則在序列化的時候也有問題,可用double

4、MONGO Replica 頻繁插入大數(shù)據(jù)的問題

MONGO Replica 頻繁插入大數(shù)據(jù)的問題,當在復制集中頻繁插入大數(shù)據(jù)時有可能出現(xiàn) “error RS102 too stale to catch up"出現(xiàn)這個錯誤的原因是SECONDARY即副節(jié)點的復制速度跟不上了,當需要批量頻繁向副本集中寫入數(shù)據(jù)時最好先移除副本節(jié)點,待插入完后重新同步。

5 Mongo集群沒有primary但有secondary時連接不上且不能讀數(shù)據(jù)

#mongodb默認是從主節(jié)點讀寫數(shù)據(jù)的,副本節(jié)點上不允許讀,需要設置副本節(jié)點可以讀。
shell
1 repset:SECONDARY> db.getMongo().setSlaveOk(); #要在primary上執(zhí)行
2 rs.slaveOk()
其他客戶端
從secondary 讀數(shù)據(jù)
如果應用程序沒有設置相應的ReadReference也可能不能進行讀取操作

MongoClientSettings set = new MongoClientSettings();
ListMongoServerAddress> servers = new ListMongoServerAddress>();
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");

注:設置驅(qū)動的ReadReference也可以通過MongoDB連接字符串配置:mongodb://example1.com,example2.com,example3.com/?readPreference=secondary。通過連接字符串指定的read preference是針對整個連接。

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

下面是其他網(wǎng)友的補充:

一、
1. 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 地址。 經(jīng)過檢查發(fā)現(xiàn) route 啟動時,讀取 config 服務是讀取的 localhost 地址: ./mongos –port 40000 –configdb localhost:30000 –fork [...]

1. 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 地址。
經(jīng)過檢查發(fā)現(xiàn) route 啟動時,讀取 config 服務是讀取的 localhost 地址:

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

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

2. 為什么要同時有 config 和 route

一開始看到 config 和 route 的邏輯結(jié)構(gòu)有一點疑惑。既然一個數(shù)據(jù)庫查詢的過程是:

客戶端
|
route
|
config
|
Database

而 config 的作用就是告訴 route 應該去哪一個 Database 取數(shù)據(jù)。那么為什么不能直接由客戶端向 config 發(fā)起請求呢?這時 route 的存在豈不是多余?
簡單的思考之后,得出了以下結(jié)論:

在有多個 route 和多個 config 的情況下,route 與 route 之間是平行的存在,也就是說,一個 route 并不知道另外一個 route 的存在。但是一個 route 知道所有 config 的存在。
那么當要寫入數(shù)據(jù)時,只要你是通過了 route,route 就會通知到所有的 config,那么每一個 config 便會知道數(shù)據(jù)是如何分片的。
如果將 route 這層去掉,那么 config 與 config 之間并不知道彼此的存在。客戶端的請求很可能會只發(fā)向其中的一個 config,那么也只有這一個 config 知道最新的分片狀態(tài)。

這個答案其實經(jīng)不起太多的推敲,比如:

config 是可以從客戶端那里拿到所有 config 的列表的,一旦有了列表之后,config 就可以彼此相互通信了。可以解決數(shù)據(jù)同步的問題。

我還要看多一些文檔。

3. Replica Set 啟動順序
在啟動兩個 rs 機器時,我先啟動了 second,后啟動了 Primary。這是一臺機器上顯示自己為 second,另外一臺為 unreachable。而另外一臺機器顯示兩臺機器均在 second。

這個現(xiàn)象需要驗證,是否 Replica Set 是有啟動順序限制。

二、

昨天到今天一直在嘗試在同一臺機器上用多個IP地址來創(chuàng)建 Replica Set + Shard。 由于 MongoDB 官方用戶驗證方面的文檔說的也不太細。所以走了一些回頭路。 下面整理一些常見的錯誤,以及他們可能表達的意思。描述的順序是按照排錯的邏輯: 1. route 啟動的時候,連接 config 不可以以 localhost 為地址鏈接。不然會遇到以下錯誤: “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″ 2. 如果不以 localhost 為地址鏈接,那么 config 啟動的時候不能加 –auth 選項,不然會在log文件中遇到以下錯誤: ERROR: [...]

昨天到今天一直在嘗試在同一臺機器上用多個IP地址來創(chuàng)建 Replica Set + Shard。
由于 MongoDB 官方用戶驗證方面的文檔說的也不太細。所以走了一些回頭路。
下面整理一些常見的錯誤,以及他們可能表達的意思。描述的順序是按照排錯的邏輯:

1. route 啟動的時候,連接 config 不可以以 localhost 為地址鏈接。不然會遇到以下錯誤:

“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″

2. 如果不以 localhost 為地址鏈接,那么 config 啟動的時候不能加 –auth 選項,不然會在log文件中遇到以下錯誤:

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

此時進程無法啟動

3.在 route 和 config 準備完畢后,通過 route 以遠程 IP 為地址添加shard,則報錯:(有 –auth 參數(shù))

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

4. 去掉 –auth 參數(shù),添加 shard,成功!

5. 依舊保留 –auth 參數(shù),添加用戶后,再添加shard。報錯:

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

總結(jié):MongoDB 2.0 的認證方式

1.Replica Set 之間通過 key 來相互認證。
2.Route 與 Config 之間不存在認證關(guān)系,Route 連接 Config 時不能以 localhost 連接。
3.單個Mongod進程啟動后,如果無 –auth 選項且無用戶,則必須通過 localhost 連接才能添加用戶和做其他操作。如果通過遠程(非127.0.0.1的IP地址)連接,則必須要輸入用戶名、密碼。此時如果還無用戶存在,則無法連接。
4.添加 Shard 時,mongod 不可以帶 –auth 參數(shù),不然會添加失敗。

三、

續(xù)上篇 筆記2 ,還是說一下關(guān)于 MongoDB 認證的問題。 在 王文龍 所寫的 《MongoDB 實戰(zhàn)》 中,寫到: 創(chuàng)建主從 key 文件,用于標識集群的私鑰的完整路徑,如果各個實例的 key file 內(nèi)容不一 致,程序?qū)⒉荒苷S谩?我誤以為 –keyFile 是各個節(jié)點之間的認證方式。其實不是的。各個節(jié)點之間的確認關(guān)系參數(shù)是 –replSet。只要此參數(shù)后面的內(nèi)容一致。Replica Set 就可以創(chuàng)建成功。 在官方文檔中提到: You do not need to use the –auth option, too (although there's no harm in doing so), –keyFile implies –auth. –auth does not imply –keyFile. 也就是說 keyFile 其實包含了 auth 的作用。 [...]

續(xù)上篇 筆記2 ,還是說一下關(guān)于 MongoDB 認證的問題。
在 王文龍 所寫的 《MongoDB 實戰(zhàn)》 中,寫到:

創(chuàng)建主從 key 文件,用于標識集群的私鑰的完整路徑,如果各個實例的 key file 內(nèi)容不一 致,程序?qū)⒉荒苷S谩?/p>

我誤以為 –keyFile 是各個節(jié)點之間的認證方式。其實不是的。各個節(jié)點之間的確認關(guān)系參數(shù)是 –replSet。只要此參數(shù)后面的內(nèi)容一致。Replica Set 就可以創(chuàng)建成功。

在官方文檔中提到:

You do not need to use the –auth option, too (although there's no harm in doing so), –keyFile implies –auth. –auth does not imply –keyFile.

也就是說 keyFile 其實包含了 auth 的作用。

而當你加了 –keyFile 參數(shù)后,如果你要添加 Shard,則會收到報錯:

need to login

這和加了 auth 的報錯一致。

以前沒接觸過 MongoDB,直接從 2.0 使用,所以里面的有些細節(jié)可能還不理解??吹接腥苏f auth 是 2.0 的新功能。而之前只能用 keyFile 驗證。還不太清楚 keyFile 下用戶登陸的一些細節(jié)。

MongoDB 常見問題處理

       說明: 這里的問題是我在看MongoDB官網(wǎng)文章時,從里面總結(jié)出來的。
mongod process "disappeared":
           這個說的是mongodb進行消失,可以理解為死掉等。可以從下面中找問題在
               #grep mongod /var/log/messages
               #grep score /var/log/messages
Socket errors in sharded clusters and replica sets:
         echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time 默認是7200
關(guān)于tomm many open files:
           First:檢查以下幾項:
          lsof | grep mongod
          lsof | grep mongod | grep TCP
          lsof | grep mongod | grep data | wc
       可以用:ulimit解決: ulimit -n X
High TCP Connection Count:
TCP Connection過大時,可以檢查是不是client apps使用連接池問題
Mongod (hard) connection limit
            這個連接數(shù)限制在20000,可以手動調(diào)整大小
Data files count with very large databases
            數(shù)據(jù)在T級以上時,確定是否做了限制(手動增加),再用repairdatabase時,會同時有2 copies
No space left on device
            這個時候reads仍然在進行,要做的是first shutdown servers, then to delete some      data and compact
     Checking Siez of a collection(檢查集合)
              >db.(collectionname).validate();
NUMA:
       Linu,
Numa and MongoDB不能很好的一起工作。如果機器在numa硬件運行的時候,需要把它關(guān)閉。一般出現(xiàn)大規(guī)模性能慢下來或一段時間cpu占用很高的system time 。可以從日志中抓取NUMA字。(我也翻譯不出這個NUMA是什么意思)
關(guān)閉的方法:

一:在啟動mongoDB的時候:
                    numactl --interleave=all ${MONGODB_HOME}/bin/mongod --config conf/mongodb.conf

二:在不關(guān)閉mongoDB時:
                   echo 0 > /proc/sys/vm/zone_reclaim_mod
         案例:

https://www.jb51.net/article/109199.htm

或https://www.jb51.net/article/109198.htm

NFS:
            官網(wǎng)不建意采用NFS系統(tǒng)文件運行mongoDB,因為NFS版本問題會導致性能很低或無法工作
SSD:
          mongoDB在SSD(固態(tài)硬盤)運行很快,但是比RAM低??梢杂胢ongoperf進行硬盤性能狀態(tài)分析。
Virtualization:
            mongoDB在虛擬化上運行的很好,如OpenVZ 兼容EC2 ,VMWare也可以但是clone的時候會出現(xiàn)一些問題由其在a member of a replica set(一個復制節(jié)點上),要想可用的,需要journaling處在可用狀態(tài),再進行clone。如果沒有的開啟journaling的時候,stop m ongod ,clone, and tehn restart    
        注意:在MongoDB中要用IP地址不要使用機器名或localhost,不然會出現(xiàn)鏈接不數(shù)據(jù)庫的。
Journal(日志):
日志的開啟:--journal ;關(guān)閉:--nojournal ,默認時間是100ms
              啟動時會在數(shù)據(jù)目錄下創(chuàng)建一個journal地文件目錄,在受到毀壞時,再啟動mongoDB不需要再運行repair,它會自動恢復的。
               可以通過運行journalLatencyTest測試寫入磁盤的性能和同步性能。
                >use admin
                >db.runCommand("journalLatencyTest")
Backup with --journal 中journal是支持回滾恢復。
journaling的時候,stop m ongod ,clone, and tehn restart    
        注意:在MongoDB中要用IP地址不要使用機器名或localhost,不然會出現(xiàn)鏈接不數(shù)據(jù)庫的。
The Linux Out of Memory OOM Killer:

情況一:

Feb 13 04:33:23 hostm1 kernel: [279318.262555] mongod invoked oom-killer: gfp_mask=0x1201d2, order=0, oomkilladj=0
    這是因為內(nèi)存溢出導致mongodb進程被剎死
 
情況二:

   內(nèi)在沒有溢出,能過db..serverStatus()或mongostat查看內(nèi)存virtualbytes - mappedbytes的界限
  
情況三:

    ulimit的限制
t:minor-latin; mso-fareast-font-family:宋體;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family: Calibri;mso-hansi-theme-font:minor-latin'>中journal是支持回滾恢復。
journaling的時候,stop m ongod ,clone, and tehn restart    
        注意:在MongoDB中要用IP地址不要使用機器名或localhost,不然會出現(xiàn)鏈接不數(shù)據(jù)庫的。

mongodb占用空間過大的原因,在官方的FAQ中,提到有如下幾個方面:
 1、空間的預分配:為避免形成過多的硬盤碎片,mongodb每次空間不足時都會申請生成一大塊的硬盤空間,而且申請的量從64M、128M、256M那樣的指數(shù)遞增,直到2G為單個文件的最大體積。隨著數(shù)據(jù)量的增加,你可以在其數(shù)據(jù)目錄里看到這些整塊生成容量不斷遞增的文件。
         2、字段名所占用的空間:為了保持每個記錄內(nèi)的結(jié)構(gòu)信息用于查詢,mongodb需要把每個字段的key-value都以BSON的形式存儲,如果value域相對于key域并不大,比如存放數(shù)值型的數(shù)據(jù),則數(shù)據(jù)的overhead是最大的。一種減少空間占用的方法是把字段名盡量取短一些,這樣占用空間就小了,但這就要求在易讀性與空間占用上作為權(quán)衡了。我曾建議作者把字段名作個index,每個字段名用一個字節(jié)表示,這樣就不用擔心字段名取多長了。但作者的擔憂也不無道理,這種索引方式需要每次查詢得到結(jié)果后把索引值跟原值作一個替換,再發(fā)送到客戶端,這個替換也是挺耗費時間的?,F(xiàn)在的實現(xiàn)算是拿空間來換取時間吧。
         3、刪除記錄不釋放空間:這很容易理解,為避免記錄刪除后的數(shù)據(jù)的大規(guī)模挪動,原記錄空間不刪除,只標記“已刪除”即可,以后還可以重復利用。
RepairDatabase命令:
  數(shù)據(jù)庫總會出現(xiàn)問題的,關(guān)于修復的方法如下:
運行db.repairDatabase()來整理記錄,但這個過程會比較緩慢。
當MongoDB做的是副本集群時:可以直接把數(shù)據(jù)rm掉,然后再重新啟動。
       當在不是primariy server上運行時,會得到一個"clone failed for wkgbc with error: query failed wkgbc.system.namespaces"
 解決方法:為了修復,需要restart server 不加--replSet選項并且要選用不同的端口
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
   
下面是從網(wǎng)上找的案例:

昨天我訪問mongodb的python程序開始出錯,經(jīng)常拋出AssertionError異常,經(jīng)查證只是master查詢異常,slave正常,可判斷為master的數(shù)據(jù)出了問題。

修復過程:

1、在master做db.repairDatabase(),不起作用; 這個時間很長
2、停止slave的同步;
3、對slave作mongodump,備份數(shù)據(jù);
4、對master作mongostore,把備份數(shù)據(jù)恢復,使用–drop參數(shù)可以先把原表刪除。
5、恢復slave的同步。

實例二:碎片整理-replSet架構(gòu)

1、rs.freeze(60)    在60s內(nèi)該機器無法成為primary
2、在primary機上進行rs.stepDown([120]) 讓該機器成為從節(jié)點且在120s內(nèi)不會成為primary
3、在primary上 ,可以將data的數(shù)據(jù)刪掉 ,啟動。數(shù)據(jù)會自動兩步上去的。

您可能感興趣的文章:
  • Mongodb啟動命令參數(shù)中文說明
  • Mongodb 啟動命令mongod參數(shù)說明(中文翻譯)
  • 解析PHP中常見的mongodb查詢操作
  • Mongodb常見錯誤與解決方法小結(jié)(Mongodb中經(jīng)常出現(xiàn)的錯誤)
  • MongoDB使用小結(jié):一些不常見的經(jīng)驗分享
  • 關(guān)于Mongodb參數(shù)說明與常見錯誤處理的總結(jié)

標簽:雞西 自貢 泰安 玉林 廈門 無錫 遼陽 興安盟

巨人網(wǎng)絡通訊聲明:本文標題《mongodb 常見問題處理方法收集》,本文關(guān)鍵詞  mongodb,常見問題,處理,方法,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《mongodb 常見問題處理方法收集》相關(guān)的同類信息!
  • 本頁收集關(guān)于mongodb 常見問題處理方法收集的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    阿克苏市| 西畴县| 铁岭县| 上林县| 永泰县| 淮北市| 灵寿县| 平乐县| 瑞丽市| 嘉禾县| 宜城市| 磐石市| 简阳市| 阜宁县| 汶川县| 黄冈市| 汝城县| 定日县| 平江县| 呼伦贝尔市| 东城区| 旬阳县| 永嘉县| 汝南县| 张家川| 岳池县| 商洛市| 花莲县| 博爱县| 潞城市| 平罗县| 上林县| 攀枝花市| 泾川县| 滨海县| 柏乡县| 独山县| 福海县| 阿拉善左旗| 高碑店市| 垦利县|