點擊上方“IT那活兒”,關注后了解更多內容,不管IT什么活兒,干就完了!!!
故障現(xiàn)象
1)dropDatabase操作被阻塞,操作界面一直無響應。10min后超時退出。
2)新開啟的mongorestore會話沒法導入數(shù)據(jù)。
以上現(xiàn)象可以看出數(shù)據(jù)庫中,肯定存在阻塞會話,在mongos和數(shù)據(jù)分片的primary節(jié)點上檢查,均沒有發(fā)現(xiàn)阻塞進程,并且數(shù)據(jù)庫日志也未發(fā)現(xiàn)異常。
故障排查
這時檢查從節(jié)點日志,發(fā)現(xiàn)在其中一個分片(數(shù)據(jù)庫主分片)的secondary節(jié)點上可看出數(shù)據(jù)庫正在創(chuàng)建索引。
由上圖可以看出,數(shù)據(jù)庫正在執(zhí)行background創(chuàng)建索引,但是background建索引的方式并不會阻塞會話,該方式之后在global/database/collection三個級別加意向鎖,見下圖:
加了意向鎖,與要執(zhí)行dropDatabase()的庫是同一個庫,而新導入數(shù)據(jù)的是另一個庫,為什么也被阻塞了?
我們繼續(xù)檢查,發(fā)現(xiàn)如下會話存在問題:
該會話持有一個全局獨占鎖,從會話信息上可看出此會話是是一個系統(tǒng)會話,負責復制集的同步。
但是不管建索引還是上圖會話中的全局獨占鎖,都是發(fā)生在secondary節(jié)點上,并且mongodb的復制是讀取的primary節(jié)點的oplog,是異步的。
為什么會出現(xiàn)本文開始的阻塞呢 ??
此時我們查閱官方文檔可發(fā)現(xiàn)如下:
1)mongorestore命令的writeconcern默認值是majority。
在Mongodb復制集架構下,Writeconcern是Mongodb的寫入安全機制,其決定了一個寫操作落到多少個節(jié)點上才算成功,格式如下:
{ w:
1)w選項表示要寫入的mongodb實例的數(shù)量,其取值包含如下:
0:發(fā)起寫操作,不關心是否寫入成功。
1-集群最大數(shù)據(jù)節(jié)點數(shù):寫操作需要復制到指定節(jié)點數(shù)才算成功。取值1是mongodb的默認值。
majority:寫操作需要被復制到大多數(shù)節(jié)點上才上成功。
tags:寫操作需要被復制到指定標簽的節(jié)點上才算成功,一般用于多數(shù)據(jù)中心指定節(jié)點標簽的情況下。
2)j選項表示要寫入journal中,才進行數(shù)據(jù)確認,wtimeout表示超時時間,單位為毫秒,表示寫入要求的全部節(jié)點的超時時間,若不設置則應用會等待直到全部寫入為止,若設置了時間,則超過時間未寫入就會報錯。
上圖表示writeconcern配置為2時,當需要寫入一主一從兩個節(jié)點時,才會想客戶端返回確認信息,在這種三節(jié)點的PSS架構中,配置w:majority也是相同的效果。如果配置w:1,則只需寫入Primary節(jié)點后就像客戶端返回確認信息。
writeconcen的配置可以在數(shù)據(jù)庫端進行默認配置,也可以在驅動上進行配置(連接串上配置),也可以在代碼上進行靈活配置,這個可以根據(jù)某個數(shù)據(jù)的重要程度來決定。
注意事項:
針對PSS架構,設置majority是較優(yōu)的選擇,保證數(shù)據(jù)安全性的同時延遲時間較短,PSA架構則不使用majority,因為從庫故障的時候會導致寫入失敗或者報錯。
不要設置writeconcern等于總結點數(shù),因為一但有一個節(jié)點故障,就會導致寫入報錯或者失敗,跟PSA架構設置majority情形相同。
witeconcern雖然會增加寫操作延遲時間,但是并不會顯著增加集群壓力,因此無論是否等待,寫操作最終都會復制到所有節(jié)點上。設置writeconcern只是讓寫操作等待復制后再返回。
應對重要數(shù)據(jù)應用{w:majority},普通數(shù)據(jù)可以應用{w:1}以確保最佳性能。
通過writeconcern的學習,就可以對此次故障作出解釋,原因是:
發(fā)現(xiàn)導入數(shù)據(jù)寫入的庫錯誤后,終止了mongorestore進程,但是主分片的從節(jié)點依然在后臺創(chuàng)建大表的索引,終止mongorestore并不能立即取消建索引操作。
mongodb的復制是串行的,由于創(chuàng)建索引操作長時間未完成,所以復制同步線程就在該從節(jié)點上加了全局鎖,因為兩個操作的writeconcern配置均為{w:majority}從而導致了dropDatabase和mongorestore操作被阻塞。
dropDatabase有超時時間,所以在前文的報錯截圖中可以看到writeConcernFailed,而mongorestore沒有默認超時時間,所以一直無法寫入數(shù)據(jù)。
故障處理
此次故障的解決方案是使用如下命令刪除數(shù)據(jù)庫:
use database
db.runCommand( { dropDatabase: 1,writeConcern: {w:1} } )
關閉從節(jié)點,刪除數(shù)據(jù)目錄,進行重新初始化,就可以跳過在從庫創(chuàng)建索引。同時mongorestore也可以添加參數(shù)--writeConcern={w:1}執(zhí)行數(shù)據(jù)導入。
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://m.hztianpu.com/yun/129548.html
摘要:對于多文檔操作來說,并未提供多文檔事物或隔離。在間隔過期之前,不會回滾或撤消已做出的修改。僅在將數(shù)據(jù)提交到后才告知客戶端。為了降低操作延遲,也增加了它提交數(shù)據(jù)至日志的頻率。 本文翻譯自 write concern。 注意,本文內容適用于MongoDB Manual 3.0.2及以上版本。 Whats write concern 所謂的寫關注就是當向客戶端報告寫操作的成功...
摘要:版本中的修改在主從部署中,把視作與是等效的。這會確保如果意外關閉了,數(shù)據(jù)也不會丟失。當這些寫操作返回時,不會撤銷在寫關注超過時限之前已經(jīng)成功執(zhí)行的數(shù)據(jù)修改。 Write Concern Reference 本文翻譯自 write concern reference。 注意,本文內容適用于MongoDB Manual 3.0.2及以上版本。 寫關注就是當向客戶端報告寫操作...
摘要:數(shù)據(jù)模型取決于數(shù)據(jù)庫類型。僅支持位浮點數(shù),所以位整數(shù)會被自動轉換為位浮點數(shù)。位浮點數(shù)中的數(shù)字都是這種類型。數(shù)字只能表示為雙精度數(shù)位浮點數(shù)的另外一個問題是,有些位的整數(shù)并不能精確地表示為位浮點數(shù)。 MongoDB學習筆記(1)- MongoDB簡介及數(shù)據(jù)類型 本文所使用的MongoDB版本為 4.0.10 > db.version(); 4.0.10 一、MongoDB 介紹 1. Mo...
摘要:曲先生指出,隨著近期的產(chǎn)品功能增多,正在越來越滿足更廣泛的應用需求對添加區(qū)域分片使得能夠為需要跨多個數(shù)據(jù)中心提供分布式永久寫入可用性的應用程序提供服務。 作為世界前十十個全球零售品牌,擁有1.7億活躍買家和10億在線市場,eBay無法承受系統(tǒng)停機帶來的損失。 這就是為什么公司依靠MongoDB作為其核心企業(yè)數(shù)據(jù)平臺標準之一,為運行ebay.com的多個面向客戶的應用程序提供支持。 在今...
閱讀 1459·2023-01-11 13:20
閱讀 1814·2023-01-11 13:20
閱讀 1265·2023-01-11 13:20
閱讀 2006·2023-01-11 13:20
閱讀 4227·2023-01-11 13:20
閱讀 2884·2023-01-11 13:20
閱讀 1489·2023-01-11 13:20
閱讀 3810·2023-01-11 13:20