0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

MongoDB 實(shí)例 Crash 的故障現(xiàn)象問(wèn)題

OSC開(kāi)源社區(qū) ? 來(lái)源:OSC開(kāi)源社區(qū) ? 2023-06-29 11:24 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1故障現(xiàn)象

近日,朋友遇到一個(gè) MongoDB 實(shí)例 Crash 的問(wèn)題,找到我?guī)兔σ黄鸱治鲈?,事情?jīng)過(guò)以及分析過(guò)程如下,可供學(xué)習(xí)。

操作過(guò)程

運(yùn)維人員在優(yōu)化慢查詢(xún)時(shí)針對(duì)性創(chuàng)建了一個(gè)索引,語(yǔ)句如下:

db.c1.createIndex('name':1,background:true)

隨后又將表上一個(gè)沒(méi)能用上的索引刪除,語(yǔ)句如下:

db.c1.dropIndex('idx_age')

在主節(jié)點(diǎn)上很順利的就完成了,但是不久后就發(fā)現(xiàn)從節(jié)點(diǎn)發(fā)生了 Crash,日志中包含下列崩潰信息。

2023-04-13T0750.752+0000ESTORAGE[conn3569849]WiredTigererror(-31802)[1681369250:752455][9937:0x7fe740144700],WT_CONNECTION.open_session:__open_session,2058:outofsessions,configuredfor20030(includinginternalsessions):WT_ERROR:non-specificWiredTigererrorRaw:[1681369250:752455][9937:0x7fe740144700],WT_CONNECTION.open_session:__open_session,2058:outofsessions,configuredfor20030(includinginternalsessions):WT_ERROR:non-specificWiredTigererror
2023-04-13T0750.752+0000INETWORK[listener]connectionacceptedfromxxx.xxx.xxx.xxx#3570023(20576connectionsnowopen)
2023-04-13T0750.753+0000F-[conn3569849]Invariantfailure:conn->open_session(conn,NULL,"isolation=snapshot",&_session)resultedinstatusUnknownError:-31802:WT_ERROR:non-specificWiredTigererroratsrc/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp111

其它信息

變更表是一張幾千萬(wàn)的大表;

數(shù)據(jù)庫(kù)架構(gòu)為 MongoDB 4.0.14 的 PSA 架構(gòu);

應(yīng)用開(kāi)啟了讀寫(xiě)分離,從節(jié)點(diǎn)也存在大量只讀請(qǐng)求。

2問(wèn)題分析

根據(jù)日志信息,初步懷疑是連接打滿(mǎn)了,檢查最大連接數(shù)配置。

初步排查

shard1:PRIMARY>db.serverStatus().connections;
{"current":7,"available":29993,"totalCreated":7,"active":2}

最大連接數(shù)是由 maxIncomingConnections 參數(shù)和 ulimit 決定的。

net:
maxIncomingConnections:30000

在測(cè)試環(huán)境模擬連接數(shù)打滿(mǎn)的情況,發(fā)現(xiàn)在連接數(shù)滿(mǎn)了的情況下實(shí)例只會(huì)拒絕新的連接,而非直接 Crash。

connectingto:mongodb://10.186.64.88:27017/admin?gssapiServiceName=mongodb
2023-04-19T1326.578+0000INETWORK[js]DBClientConnectionfailedtoreceivemessagefromxxx.xxx.xxx.xxx-HostUnreachable:Connectionclosedbypeer
2023-04-19T1326.579+0000EQUERY[js]Error:networkerrorwhileattemptingtoruncommand'isMaster'onhost'10.186.64.88:27017':
connect@src/mongo/shell/mongo.js17
@(connect)6
exception:connectfailed

根據(jù) SERVER-30462 描述懷疑是 WT_SESSION[1] 打滿(mǎn)的情況。

WT_SESSION 是 MongoDB Server 和 WiredTiger[2] 存儲(chǔ)引擎內(nèi)部交互使用的會(huì)話,幾乎所有操作都是在 WT_SESSION 的上下文中執(zhí)行的。因此 WT_SESSION 在超過(guò)限制后將會(huì)觸發(fā)較為嚴(yán)重的情況。

f6b17b4a-15a0-11ee-962d-dac502259ad0.png

源碼分析

在源碼 mongo/wiredtiger_kv_engine.cpp[3] 中可以看到 WT_SESSION 硬編碼指定為 20000。

std::stringstreamss;
ss<

這一點(diǎn)也能在啟動(dòng)日志中進(jìn)一步得到驗(yàn)證。

f6fd0a1a-15a0-11ee-962d-dac502259ad0.png

如果 WT_SESSION 數(shù)量超過(guò) 20000,將會(huì)觸發(fā) out of sessions 的報(bào)錯(cuò)。

/*Findthefirstinactivesessionslot.*/
for(session_ret=conn->sessions,i=0;isession_size;++session_ret,++i)
if(!session_ret->active)
break;
if(i==conn->session_size)
WT_ERR_MSG(session,WT_ERROR,"outofsessions,configuredfor%"PRIu32
"(including"
"internalsessions)",
conn->session_size);

提出疑問(wèn)

分析到這開(kāi)始疑惑 WT_SESSION 打滿(mǎn)與索引操作存在什么樣的關(guān)系?為什么相同的操作在主節(jié)點(diǎn)可以正常完成,而從節(jié)點(diǎn)會(huì)發(fā)生 Crash?

在創(chuàng)建索引時(shí)指定 background:true 可以在后臺(tái)構(gòu)建索引,不會(huì)加鎖阻塞集合上的其它操作,這也是我們?nèi)粘L砑铀饕S玫姆绞健?/p>

但在刪除索引時(shí),我們有一點(diǎn)需要注意,但又常常被忽略,在主節(jié)點(diǎn)刪除索引后同步到從節(jié)點(diǎn)回放時(shí),如果從節(jié)點(diǎn)正在跑同一個(gè)集合上后臺(tái)創(chuàng)建索引的操作,那么刪除索引的操作將會(huì)被阻塞,更嚴(yán)重的是這時(shí)候?qū)嵗纤?namespace 的訪問(wèn)都將會(huì)阻塞。針對(duì)這一現(xiàn)象在官網(wǎng) dropIndex[4] 文檔中有提及:

Avoid dropping an index on a collection while any index is being replicated on a secondary. If you attempt to drop an index from a collection on a primary while the collection has a background index building on a secondary, reads will be halted across all namespaces and replication will halt until the background index build completes.

當(dāng)任何創(chuàng)建索引操作復(fù)制到 Secondary 時(shí),應(yīng)避免在集合上刪除索引。如果你試圖在 Primary 上刪除一個(gè)索引,而該集合在 Secondary 上有一個(gè)索引正在后臺(tái)創(chuàng)建,那么所有 namespace 的訪問(wèn)將被停止,復(fù)制也會(huì)停止,直到后臺(tái)索引建立完成。

回到錯(cuò)誤日志中查找更多內(nèi)容,就能發(fā)現(xiàn)從節(jié)點(diǎn)在后臺(tái)創(chuàng)建索引時(shí),又執(zhí)行了同一個(gè)集合上的刪除索引操作。

2023-04-13T0527.002+0000I-[replindexbuilder178]IndexBuild(background):122873800/64001875719%
2023-04-13T0530.002+0000I-[replindexbuilder178]IndexBuild(background):122976300/64001876919%
2023-04-13T0530.434+0000ICOMMAND[replwriterworker11]CMD:dropIndexestest.c1

初步結(jié)論

到此,我們得出初步結(jié)論。事情起因是主節(jié)點(diǎn)在同一個(gè)集合上執(zhí)行創(chuàng)建索引和刪除索引后,在從節(jié)點(diǎn)回放時(shí)出現(xiàn)了很?chē)?yán)重的阻塞,大量的只讀請(qǐng)求開(kāi)始不斷積壓,最后導(dǎo)致 WT_SESSION 消耗殆盡,Server 無(wú)法與 WiredTiger 進(jìn)行內(nèi)部通信,最終導(dǎo)致實(shí)例 Crash。

3問(wèn)題復(fù)現(xiàn)

下面的案例在測(cè)試環(huán)境復(fù)現(xiàn) WT_SESSION 超過(guò)限制的情況,dropIndex 導(dǎo)致從節(jié)點(diǎn)鎖阻塞的問(wèn)題有興趣可自己測(cè)試復(fù)現(xiàn),這里就不做演示了。

WT_SESSION 上限是由 wiredtiger_open 配置中的 session_max 決定的,但 MongoDB 并未直接暴露 session_max的配置方式,只能通過(guò)下列方式進(jìn)行覆蓋設(shè)置。

mongod-f/etc/mongod.conf--wiredTigerEngineConfigString="session_max=5"
f7134e92-15a0-11ee-962d-dac502259ad0.png

然后在數(shù)據(jù)庫(kù)內(nèi)部發(fā)起一個(gè)全局排它鎖。

mongo>db.fsyncLock()

編寫(xiě)下列 Python 腳本模擬并發(fā)線程。

#!/usr/bin/python
#-*-coding:UTF-8-*-
importmultiprocessing
importpymongo

deffind():
cnx_args=dict(username='root',password='abcd123#',host='127.0.0.1',port=27018,authSource='admin')
client=pymongo.MongoClient(**cnx_args)
db=client['test']
results=db.tab100.insert_one({"name":"jack"})
if__name__=="__main__":
x=1
whilex<350:
????????p=multiprocessing.Process(target=find)
????????p.start()
????????print("start?thread:",x)
????????x+=1
????p.join()

這時(shí) MongoDB 實(shí)例還在正常運(yùn)行,因?yàn)槲覀兊恼?qǐng)求還沒(méi)有真正的進(jìn)入到 WiredTiger 引擎層,但一旦我們手動(dòng)釋放排它鎖,所有請(qǐng)求都會(huì)在短時(shí)間內(nèi)進(jìn)入 WiredTiger 引擎,WT_SESSION 瞬間超過(guò)限制,實(shí)例緊接著發(fā)生 Crash。

mongo>db.fsyncUnlock()

錯(cuò)誤日志如下,與生產(chǎn)日志相同。

f72c85d8-15a0-11ee-962d-dac502259ad0.png

4總結(jié)

net.maxIncomingConnections 設(shè)置應(yīng)小于 WT_SESSION;

可以根據(jù)實(shí)際需求調(diào)整游標(biāo)超時(shí)時(shí)間,避免出現(xiàn)大面積積壓的情況;

避免創(chuàng)建索引和刪除索引先后執(zhí)行,特別是先執(zhí)行后臺(tái)創(chuàng)建索引的情況下;

4.2 版本中廢棄了 background 選項(xiàng),對(duì)索引創(chuàng)建過(guò)程進(jìn)行了優(yōu)化,只會(huì)在索引創(chuàng)建的開(kāi)始和結(jié)束時(shí)持有 exclusive lock;并且 4.0 版本官方已經(jīng)停止提供服務(wù)了,建議盡快升級(jí)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 存儲(chǔ)
    +關(guān)注

    關(guān)注

    13

    文章

    4515

    瀏覽量

    87221
  • 數(shù)據(jù)庫(kù)
    +關(guān)注

    關(guān)注

    7

    文章

    3907

    瀏覽量

    65936
  • mongodb
    +關(guān)注

    關(guān)注

    0

    文章

    24

    瀏覽量

    453

原文標(biāo)題:故障分析 | MongoDB索引操作導(dǎo)致Crash

文章出處:【微信號(hào):OSC開(kāi)源社區(qū),微信公眾號(hào):OSC開(kāi)源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 0人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    變頻器最常見(jiàn)的十大故障現(xiàn)象和分析處理實(shí)例

    變頻器是自動(dòng)化工廠中最常見(jiàn)的電氣設(shè)備下面我們一起來(lái)看看變頻器最常見(jiàn)的十大故障現(xiàn)象和分析處理實(shí)例
    發(fā)表于 09-14 09:11 ?5.1w次閱讀

    MySQL和MongoDB的對(duì)比

    MySQL和MongoDB的對(duì)比http://bbs.edu118.com/forum.php?mod=viewthread&tid=212&fromuid=231(出處: 信盈達(dá)
    發(fā)表于 08-28 14:51

    MongoDB 4.0 RC 版本強(qiáng)勢(shì)登陸

    摘要: MongoDB 因其靈活的文檔模型、可擴(kuò)展分布式設(shè)計(jì)廣受開(kāi)發(fā)者喜愛(ài),在此基礎(chǔ)上,MongoDB 4.0 推出了更強(qiáng)大的功能支持,目前4.0第一個(gè)RC版本已經(jīng)發(fā)布,本文將介紹 MongoDB
    發(fā)表于 06-11 19:42

     華為云MongoDB彈性伸縮能力提升100倍

    彈性伸縮能力提升。此外DDS還容忍任意N-1個(gè)節(jié)點(diǎn)故障,支持單節(jié)點(diǎn)擴(kuò)容步長(zhǎng)。系統(tǒng)解決開(kāi)源MongoDB使用過(guò)程中遇到的一系列問(wèn)題。   華為云DDS與開(kāi)源MongoDB性能對(duì)比圖   事實(shí)上,DDS
    發(fā)表于 08-03 13:00

    MongoDB的安裝教程

    MongoDB安裝教程
    發(fā)表于 05-29 15:06

    TCL彩電故障維修實(shí)例大全

    TCL彩電故障維修實(shí)例大全   例1.故障現(xiàn)象:TCL王牌
    發(fā)表于 01-15 17:56 ?2.5w次閱讀

    熊貓彩電維修故障實(shí)例大全

    熊貓彩電維修故障實(shí)例大全 例1.故障現(xiàn)象:畫(huà)面上有不規(guī)則的淡黑色陰影在走動(dòng),嚴(yán)重時(shí)亮度信號(hào)丟失,圖像僅見(jiàn)暗暗的彩色?! ≡蚣安课唬汗催呺?/div>
    發(fā)表于 01-15 18:02 ?1.6w次閱讀

    海信電視故障維修實(shí)例速查表

    海信電視故障維修實(shí)例速查表 機(jī)型故障現(xiàn)象故障位號(hào)原因簡(jiǎn)析 :     &nbs
    的頭像 發(fā)表于 10-19 09:07 ?1.2w次閱讀

    現(xiàn)象到本質(zhì):網(wǎng)絡(luò)設(shè)備故障診斷經(jīng)典實(shí)例

    現(xiàn)象到本質(zhì):網(wǎng)絡(luò)設(shè)備故障診斷經(jīng)典實(shí)例    路由器、交換機(jī)在局域網(wǎng)中使用的范圍越來(lái)越廣。在此筆者就對(duì)局域網(wǎng)中與此類(lèi)
    發(fā)表于 08-01 11:28 ?873次閱讀

    關(guān)于mongodb的幾個(gè)熱點(diǎn)問(wèn)題

    本文就 MongoDB 的使用場(chǎng)景做個(gè)簡(jiǎn)單的總結(jié),談?wù)勈裁磮?chǎng)景該用 MongoDB?如何學(xué)習(xí)MongoDB
    發(fā)表于 02-06 16:49 ?2935次閱讀
    關(guān)于<b class='flag-5'>mongodb</b>的幾個(gè)熱點(diǎn)問(wèn)題

    redis和mongodb數(shù)據(jù)庫(kù)對(duì)比_redis、memcache、mongoDB 對(duì)比

    本文是對(duì)redis和mongodb數(shù)據(jù)庫(kù)對(duì)比分析。以及redis、memcache、mongoDB 區(qū)別對(duì)比。MongoDB和Redis都是NoSQL,采用結(jié)構(gòu)型數(shù)據(jù)存儲(chǔ)。二者在使用場(chǎng)景中,存在一定
    發(fā)表于 02-07 08:45 ?4390次閱讀
    redis和<b class='flag-5'>mongodb</b>數(shù)據(jù)庫(kù)對(duì)比_redis、memcache、<b class='flag-5'>mongoDB</b> 對(duì)比

    使用MongoDB和NodeJS設(shè)計(jì)物聯(lián)網(wǎng)系統(tǒng)的詳細(xì)資料說(shuō)明

    目標(biāo) 基于阿里云服務(wù)快速構(gòu)建物聯(lián)網(wǎng)系統(tǒng) 準(zhǔn)備工作 ECS MongoDB EMR Alinode 中間件代碼 注意事項(xiàng):ECS,MongoDB 可以選擇按量計(jì)費(fèi)的服務(wù)。 實(shí)例申請(qǐng) Step1 拿到
    發(fā)表于 10-18 14:51 ?1次下載
    使用<b class='flag-5'>MongoDB</b>和NodeJS設(shè)計(jì)物聯(lián)網(wǎng)系統(tǒng)的詳細(xì)資料說(shuō)明

    MongoDB索引操作導(dǎo)致Crash的問(wèn)題及其解決辦法

    近日,朋友遇到一個(gè) MongoDB 實(shí)例 Crash 的問(wèn)題,找到我?guī)兔σ黄鸱治鲈?,事情?jīng)過(guò)以及分析過(guò)程如下,可供學(xué)習(xí)。
    的頭像 發(fā)表于 06-20 09:51 ?1128次閱讀
    <b class='flag-5'>MongoDB</b>索引操作導(dǎo)致<b class='flag-5'>Crash</b>的問(wèn)題及其解決辦法

    MongoDB數(shù)據(jù)恢復(fù)—MongoDB數(shù)據(jù)庫(kù)文件損壞的數(shù)據(jù)恢復(fù)案例

    服務(wù)器數(shù)據(jù)恢復(fù)環(huán)境: 一臺(tái)Windows Server操作系統(tǒng)服務(wù)器,服務(wù)器上部署MongoDB數(shù)據(jù)庫(kù)。 MongoDB數(shù)據(jù)庫(kù)故障&檢測(cè): 工作人員在未關(guān)閉MongoDB數(shù)據(jù)
    的頭像 發(fā)表于 04-23 14:48 ?653次閱讀
    <b class='flag-5'>MongoDB</b>數(shù)據(jù)恢復(fù)—<b class='flag-5'>MongoDB</b>數(shù)據(jù)庫(kù)文件損壞的數(shù)據(jù)恢復(fù)案例

    CPU故障現(xiàn)象有哪些

    CPU作為計(jì)算機(jī)系統(tǒng)的核心部件,其穩(wěn)定性和性能直接影響到整個(gè)計(jì)算機(jī)系統(tǒng)的運(yùn)行。當(dāng)CPU出現(xiàn)故障時(shí),會(huì)表現(xiàn)出多種不同的現(xiàn)象。以下是對(duì)CPU故障現(xiàn)象的詳細(xì)解析,包括常見(jiàn)的
    的頭像 發(fā)表于 09-10 11:46 ?7996次閱讀

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品