久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

MongoDB詭異問(wèn)題:sh.stopBalancer卡住

共計(jì) 2596 個(gè)字符,預(yù)計(jì)需要花費(fèi) 7 分鐘才能閱讀完成。

自動(dòng)寫(xiě)代碼機(jī)器人,免費(fèi)開(kāi)通
MongoDB 詭異問(wèn)題:sh.stopBalancer 卡住MongoDB 詭異問(wèn)題:sh.stopBalancer 卡住

背景

Part1: 寫(xiě)在最前

我們?cè)谑褂?MongoDB sharding 集群時(shí),會(huì)使用如下命令來(lái)管理啟停 Balancer:

sh.stopBalancer()  停止 Balancer
 sh.startBalancer()  開(kāi)啟 Balancer

Part2: 背景

開(kāi)啟 balancer 后,客戶反饋前端應(yīng)用寫(xiě)入緩慢,查詢超時(shí)。因此我們嘗試關(guān)閉 balancer,來(lái)避免 chunk 遷移對(duì)集群性能帶來(lái)的影響。

但是在調(diào)用 sh.stopBalancer 的時(shí)候,發(fā)現(xiàn)卻停不下來(lái),sh.stopBalancer 會(huì)處于卡住的狀態(tài):

mongos sh.stopBalancer()
Waiting for active hosts...
Waiting for the balancer lock...
assert.soon failed,msg:Waited too long for lock balancer to unlock
doassert@src/mongo/shell/assert.js:18:14
assert.soon@src/mongo/shell/assert.js:202:13
sh.waitForDLock@src/mongo/shell/utils_sh.js:198:1
sh.waitForBalancerOff@src/mongo/shell/utils_sh.js:264:9
sh.waitForBalancer@src/mongo/shell/utils_sh.js:294:9
sh.stopBalancer@src/mongo/shell/utils_sh.js:161:5
@(shell):1:1
Balancer still may be active, you must manually verify this is not the case using the
config.changelog collection.
2018-02-11T16:28:29.753+0800
E QUERY [thread1] Error: Error:
assert.soon failed, msg:Waited too long for lock balancer to unlock :
sh.waitForBalancerOff@src/mongo/shell/utils_sh.js:268:15
sh.waitForBalancer@src/mongo/shell/utils_sh.js:294:9
sh.stopBalancer@src/mongo/shell/utils_sh.js:161:5
@(shell):1:1

從上述報(bào)錯(cuò)能夠看出,是由于目前 balancer 正在運(yùn)行導(dǎo)致的,

Warning: 警告   在 3.4 版本中,balancer 運(yùn)行在 config server 的主節(jié)點(diǎn)上,在早期的版本中,balancer 是運(yùn)行在 mongos 上的。當(dāng) balancer 進(jìn)程處于活動(dòng)狀態(tài)時(shí),config server 副本集的主服務(wù)器通過(guò)修改 config 數(shù)據(jù)庫(kù)的 lock 集合中的文檔,來(lái)獲取“平衡器鎖”。這個(gè)“平衡器鎖”只能自己主動(dòng)釋放。

Part3: 排查方法

 我們調(diào)用 sh.status() 命令能夠看到當(dāng)前 balancer 已經(jīng)關(guān)閉了,但是 running 還是 yes,這說(shuō)明有遷移正在運(yùn)行。 
 balancer:
Currently enabled: no
Currently running: yes
 
我們查看發(fā)現(xiàn) migrations 集合下為空,說(shuō)明沒(méi)有集合在遷移
mongos  db.migrations.find()
我們查看 locks 集合下的信息,處于 2 狀態(tài)的說(shuō)明正持有鎖
mongos  db.locks.find()
{  _id  :  balancer ,  state  : 2,  ts  : ObjectId( 5a324c42329457086086da07),  who  :  ConfigServer:Balancer ,  process  :  ConfigServer ,  when  : ISODate(2018-01-31T08:33:43.346Z),  why  :  CSRS Balancer  }

Warning: 警告  

locks 集合中的 why 列告訴我們持有鎖的原因,如果有正在遷移的文檔,其狀態(tài)應(yīng)該是 2,why 中的原因會(huì)顯示 Migrating chunk(s) in collection db.collationname.

從 3.4 版本起,balancer 的狀態(tài)字段將始終為值 2,以防止老版本的 mongos 實(shí)例執(zhí)行平衡操作。when 字段指 config server 成員成為主節(jié)點(diǎn)的時(shí)間。

解決辦法

Part1: 寫(xiě)在最前

sh.stopBalancer 停不下來(lái),常見(jiàn)的可能原因有以下幾個(gè):

正在做 chunk 遷移,必須等待 chunk 遷移完成后, 才能夠正常停止;

后端的 server 時(shí)間不同步;

mongo 客戶端版本低于 server 端,本文就是第 3 種情況。mongo 客戶端的版本是 3.2 版本,config server 和 mongod 都是 3.4 版本的 mongo。

Part2: 解決辦法

替換老版本的 mongo 客戶端,使用 3.4 版本的客戶端

mongos  sh.stopBalancer()
{  ok  : 1 }
 
config:PRIMARY  db.version()
3.4.9-2.9

Part3: 原因分析

卡住的原因是由于客戶端 mongo 是 3.2 版本,而 config 節(jié)點(diǎn)是 3.4 版本,3.2 版本的 mongos 在執(zhí)行 stopBalancer() 時(shí),stopBalancer 代碼假定如果 balancerStop 命令沒(méi)有找到,那么它會(huì)使用舊版本的邏輯,等待鎖被釋放。從 3.4 版本起,Balance 進(jìn)程從 mongos 移動(dòng)之 configer server 的 primary 節(jié)點(diǎn)上。

——總結(jié)——

通過(guò)這個(gè)案例,我們能夠了解到 mongo 客戶端版本帶來(lái)的問(wèn)題,以及有哪些常見(jiàn)原因?qū)е?sh.stopBalancer 停不下來(lái)。由于筆者的水平有限,編寫(xiě)時(shí)間也很倉(cāng)促,文中難免會(huì)出現(xiàn)一些錯(cuò)誤或者不準(zhǔn)確的地方,不妥之處懇請(qǐng)讀者批評(píng)指正。喜歡筆者的文章,右上角點(diǎn)一波關(guān)注,謝謝~

MongoDB 詭異問(wèn)題:sh.stopBalancer 卡住

MongoDB 詭異問(wèn)題:sh.stopBalancer 卡住

向 AI 問(wèn)一下細(xì)節(jié)

丸趣 TV 網(wǎng) – 提供最優(yōu)質(zhì)的資源集合!

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-12-18發(fā)表,共計(jì)2596字。
轉(zhuǎn)載說(shuō)明:除特殊說(shuō)明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請(qǐng)注明出處。
評(píng)論(沒(méi)有評(píng)論)
主站蜘蛛池模板: 嘉祥县| 田阳县| 长岭县| 浦北县| 张家港市| 弥渡县| 丹东市| 略阳县| 紫金县| 佳木斯市| 台江县| 桐城市| 东光县| 遂溪县| 灵宝市| 扎兰屯市| 宜兰市| 二手房| 崇礼县| 馆陶县| 康保县| 顺平县| 永宁县| 大余县| 永顺县| 桑植县| 平昌县| 合川市| 颍上县| 布拖县| 西城区| 湖北省| 新兴县| 贵港市| 唐河县| 北海市| 正宁县| 永丰县| 洛浦县| 邛崃市| 遂宁市|