昨晚將收藏集轉換爲封面收藏集時,我的輔助時間開始落後於小學。它每隔幾分鐘就會緩慢地前進幾秒鐘,最終從主要的oplog窗口中退出。根據指令here,我停止了輔助節點上的mongod,刪除了所有數據文件,並重新啓動了它,但我忘記鎖定主節點。中學經歷了其初始階段,這需要花費很長時間,並且終於恢復了業務,但是當我登錄時,複製現在更加落後了。爲什麼我的MongoDB副本繼續落後?
因爲這是雲,畢竟我創建了一個我的主映像(它應該複製所有數據)的映像,儘管我當時無法運行db.fsyncLock(),因爲它需要一些寫道。新圖像完成後,我會啓動一個基於該圖像的新服務器,將它添加到我的副本集,刪除舊的輔助圖像,並且生活很好,對不對?不完全 - 新的中學落後了大約一個小時,並且在一天中(和今天晚上)最終達到落後14個小時的時間(儘管仍然在oplog窗口內仍然奇怪)。
我從「重新陳舊的成員頁面」開始下一步。在兩臺服務器上關閉mongod,gzip並將我的數據文件夾從主要副本複製到輔助副本,然後解壓並將它們同時激活,db.fsyncLock()是我的主要副本。我的想法是,即使在初始化完成之後,我的輔助者說,它已經落後了1個小時。我將它重新添加到副本集中,並迅速趕上5分鐘後。
所有不錯,對不對?沒有 - 向前閃,中學正在前進,現在落後20分鐘。 Mongostat有95%以上的鎖定率,iostat -xm 2沒有顯示任何瘋狂的情況 - 小學目前由於沒有寫入而處於閒置狀態,二級絕對沒有太多的工作(0.04 WMB /秒)。不知道是否值得一提,但目前初級感覺
狗慢
登錄進mongo shell等反應遲鈍
什麼給Mongo?爲什麼你不能趕上?我試圖讓自己的第二手被抓住,我做錯了什麼?
編輯 回答問題:
- 版本:2.0.4
- 硬件:兩個節點在相同的硬件,靠近我可以告訴大家 - 8GB的內存,四核CPU。我認爲這是虛擬化的東西。
- 寫入速率:不同。如前所述,昨天晚上我轉變爲封頂收藏,這引發了整個事情。一夜之間,有一個過程每小時幾次寫幾百個小文檔(每個大約155字節),所以我估計大約100-200kbytes /小時。在白天,處理更加激烈,更新了數十萬個500字節的文檔,並且編寫了幾十萬個文檔。仍然沒有談論巨大的數據量。 EDIT發現從今天早些時候一些iostat的輸出:
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util xvda 1.00 2564.50 243.50 282.50 8986.00 11388.00 77.47 11.32 21.46 2.36 37.93 0.50 26.50
那一個是在11 WMB/s的特別突發,鋸UTIL%擊中34%與7 WMB/s,並且在52元72%/秒。所以不是飽和的,但肯定是早上的閱讀繁重的工作量。儘管有obj,但它很有趣。大小〜5GB,以及〜1GB的索引(見下文),磁盤活動非常多。不應該全部在RAM中嗎?
- 工作集:我還沒有找到計算工作組接受的方法,但如果它可以幫助:
"collections" : 21, "objects" : 15540092, "avgObjSize" : 325.26198326238995, "dataSize" : 5054601144, "storageSize" : 5874327552, "numExtents" : 132, "indexes" : 43, "indexSize" : 864366720, "fileSize" : 10666115072, "nsSizeMB" : 16, "ok" : 1
我無法想象,這是的RAM 8GB鋪天蓋地,但我可能是錯的。
- 從二級最近的一些mongostat樣本:
insert query update delete getmore command flushes mapped vsize res faults locked % idx miss % qr|qw ar|aw netIn netOut conn set repl time *0 *0 *0 *0 0 1|0 0 22.2g 44.9g 912m 0 99.2 0 0|0 0|1 2k 303b 151 mySet SEC 03:47:54 *0 *0 *0 *0 0 1|0 0 22.2g 44.9g 1.85g 0 101 0 0|0 0|1 3k 303b 151 mySet SEC 03:48:04
編輯
嘗試更多的東西。我關閉了主服務器(現在叫做A,次要服務器會是B),刪除了它的數據,並且解壓了它的快照(現在已經過了幾個小時了,但是現在我們並沒有寫任何新的東西)。開始使用--fastsync,它仍然比B(現在主要)的optime晚了45秒,這個時間大約在02:19:52UTC。最後大約一個小時後,A趕上了,所以我在B上調用了rs.stepDown()。即時地,rs.status()告訴我兩臺服務器在UTC時間04:08左右都有optimes,但是B(現在是次要的)再次滯後17數秒然後在30秒......現在7分鐘...
編輯
採取@ matulef的建議,並幾分鐘後重新創建我的收藏上限指標,以及重新啓動輔助的mongod進程,其運行時間只增加了幾秒鐘。來自mongostat的二級鎖定百分比仍然在95-104%之間徘徊,有趣的是,res size的大小從100M到2GB變得非常大,然後又回到了1GB左右。
EDIT(第二天晚上)
結論的故事 - @matulef是在正確的軌道上,我應該更小心複製的集合轉換爲上限的集合。接下來是發生了什麼,雖然我沒有宣傳這是數據安全的 - 我自由地承認我可能在這個過程中丟失了一些數據,所以YMMV。
在主(A)上創建加蓋集合的索引不會傳播到輔助節點(B),並且偶然發生故障切換(並非有意)。一旦B是主要的,我手動在那裏的封頂集合上創建索引,並且使A與B一致的再同步操作開始快速移動。不幸的是,我的oplog窗口不再排隊,所以我最終不得不將數據從B快照到A.一旦我用相同的數據重新啓動了mongo,A & B又開心了,複製又回來了從此同步。
是次要的硬件明智的主要?也是什麼版本的mongoDB是這樣的? – 2012-07-11 02:56:13
寫入速率是多少?多少內存和什麼是mongos工作集? – Kevin 2012-07-11 03:03:03
你有一個_id指數爲你的封頂集合?默認情況下,它不是創建在加蓋集合上,所以我的猜測是,當你做了「convertToCapped」時,你就失去了它。這是複製滯後的常見(且易於修復)原因。在這裏看到警告:http://www.mongodb.org/display/DOCS/Capped+Collections – matulef 2012-07-11 04:17:15