色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

MongoDB索引操作導致Crash的問題及其解決辦法

OSC開源社區(qū) ? 來源:愛可生開源社區(qū) ? 2023-06-20 09:51 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1 故障現(xiàn)象

近日,朋友遇到一個 MongoDB 實例 Crash 的問題,找到我?guī)兔σ黄鸱治鲈颍虑榻涍^以及分析過程如下,可供學習。

操作過程

運維人員在優(yōu)化慢查詢時針對性創(chuàng)建了一個索引,語句如下:

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

隨后又將表上一個沒能用上的索引刪除,語句如下:

db.c1.dropIndex('idx_age')

在主節(jié)點上很順利的就完成了,但是不久后就發(fā)現(xiàn)從節(jié)點發(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

其它信息

變更表是一張幾千萬的大表;

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

應用開啟了讀寫分離,從節(jié)點也存在大量只讀請求。

2 問題分析

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

初步排查

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

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

net:
maxIncomingConnections:30000

在測試環(huán)境模擬連接數(shù)打滿的情況,發(fā)現(xiàn)在連接數(shù)滿了的情況下實例只會拒絕新的連接,而非直接 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] 打滿的情況。

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

350f3708-0e92-11ee-962d-dac502259ad0.png

源碼分析

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

std::stringstreamss;
ss<

這一點也能在啟動日志中進一步得到驗證。

35450540-0e92-11ee-962d-dac502259ad0.png

如果 WT_SESSION 數(shù)量超過 20000,將會觸發(fā) out of sessions 的報錯。

/*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);

提出疑問

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

在創(chuàng)建索引時指定 background:true 可以在后臺構建索引,不會加鎖阻塞集合上的其它操作,這也是我們日常添加索引常用的方式。

但在刪除索引時,我們有一點需要注意,但又常常被忽略,在主節(jié)點刪除索引后同步到從節(jié)點回放時,如果從節(jié)點正在跑同一個集合上后臺創(chuàng)建索引的操作,那么刪除索引的操作將會被阻塞,更嚴重的是這時候實例上所有 namespace 的訪問都將會阻塞。針對這一現(xiàn)象在官網 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.

當任何創(chuàng)建索引操作復制到 Secondary 時,應避免在集合上刪除索引。如果你試圖在 Primary 上刪除一個索引,而該集合在 Secondary 上有一個索引正在后臺創(chuàng)建,那么所有 namespace 的訪問將被停止,復制也會停止,直到后臺索引建立完成。

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

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é)點在同一個集合上執(zhí)行創(chuàng)建索引和刪除索引后,在從節(jié)點回放時出現(xiàn)了很嚴重的阻塞,大量的只讀請求開始不斷積壓,最后導致 WT_SESSION 消耗殆盡,Server 無法與 WiredTiger 進行內部通信,最終導致實例 Crash。

3 問題復現(xiàn)

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

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

mongod-f/etc/mongod.conf--wiredTigerEngineConfigString="session_max=5"
356aaaac-0e92-11ee-962d-dac502259ad0.png

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

mongo>db.fsyncLock()

編寫下列 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()

這時 MongoDB 實例還在正常運行,因為我們的請求還沒有真正的進入到 WiredTiger 引擎層,但一旦我們手動釋放排它鎖,所有請求都會在短時間內進入 WiredTiger 引擎,WT_SESSION 瞬間超過限制,實例緊接著發(fā)生 Crash。

mongo>db.fsyncUnlock()

錯誤日志如下,與生產日志相同。

359c4e22-0e92-11ee-962d-dac502259ad0.png

4 總結

net.maxIncomingConnections 設置應小于 WT_SESSION;

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

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





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 存儲器
    +關注

    關注

    38

    文章

    7643

    瀏覽量

    166713
  • python
    +關注

    關注

    56

    文章

    4825

    瀏覽量

    86405
  • PSA
    PSA
    +關注

    關注

    0

    文章

    51

    瀏覽量

    13959
  • mongodb
    +關注

    關注

    0

    文章

    24

    瀏覽量

    451

原文標題:MongoDB索引操作導致Crash

文章出處:【微信號:OSC開源社區(qū),微信公眾號:OSC開源社區(qū)】歡迎添加關注!文章轉載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    MongoDB如何操作

    MongoDB操作
    發(fā)表于 05-13 13:10

    關于RK3568-ANDROID11-BOARD_HAVE_DONGLE報錯的原因及其解決辦法

    關于RK3568-ANDROID11-BOARD_HAVE_DONGLE報錯的原因及其解決辦法
    發(fā)表于 03-02 10:57

    RK3566開發(fā)板編譯安卓源碼出現(xiàn)的問題及其相關的解決辦法

    RK3566開發(fā)板編譯安卓源碼出現(xiàn)的問題及其相關的解決辦法
    發(fā)表于 03-02 09:00

    閃存式MP3的小故障及其解決辦法

    閃存式MP3的小故障及其解決辦法 閃存式MP3(指具備MP3播放功能的閃存)的價格相對較低,因此它的用戶數(shù)量眾多。我們在使用它的過程中難免會遇
    發(fā)表于 01-14 16:50 ?1229次閱讀

    誤碼特性,誤碼產生的機理及解決辦法

    誤碼特性,誤碼產生的機理及解決辦法
    發(fā)表于 03-19 17:10 ?2442次閱讀

    UPS電源輸入跳閘淺析及解決辦法

    UPS電源輸入跳閘淺析及解決辦法解析
    發(fā)表于 11-10 16:42 ?89次下載
    UPS電源輸入跳閘淺析及<b class='flag-5'>解決辦法</b>

    內存條兼容異常問題的原因及其解決辦法

    經常使用電腦的朋友都知道,電腦如果出現(xiàn)滴滴聲的 電腦開機 故障就是內存條出現(xiàn)了問題。但是如果類似迅雷等軟件突然出現(xiàn)問題時,大多數(shù)朋友可能就不會想到是由于內存出現(xiàn)了兼容性的問題了。下面,我就向大家介紹一下內存條兼容異常問題的原因及其解決辦法
    發(fā)表于 06-14 10:53 ?1.2w次閱讀

    打鼾呼吸機不能正常使用的原因及解決辦法

    大家在使用打鼾呼吸機的過程中,因操作不當難免會遇到這樣或者那樣的問題,接下來醫(yī)療器械小編給大家整理一篇,關于因操作不當而導致打鼾呼吸機不能正常使用的原因及解決辦法
    發(fā)表于 09-28 09:03 ?1561次閱讀

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

    ? 1故障現(xiàn)象 近日,朋友遇到一個 MongoDB 實例 Crash 的問題,找到我?guī)兔σ黄鸱治鲈颍虑榻涍^以及分析過程如下,可供學習。 操作過程 運維人員在優(yōu)化慢查詢時針對性創(chuàng)建了一個索引
    的頭像 發(fā)表于 06-29 11:24 ?635次閱讀
    <b class='flag-5'>MongoDB</b> 實例 <b class='flag-5'>Crash</b> 的故障現(xiàn)象問題

    細碎機軸承位磨損問題的解決辦法

    【設備故障】細碎機軸承位磨損問題的解決辦法
    發(fā)表于 10-27 16:36 ?0次下載

    導致MySQL索引失效的情況以及相應的解決方法

    導致MySQL索引失效的情況以及相應的解決方法? MySQL索引的目的是提高查詢效率,但有些情況下索引可能會失效,導致查詢變慢或效果不如預期
    的頭像 發(fā)表于 12-28 10:01 ?1082次閱讀

    Profinet IO通信故障的解決辦法

    Profinet IO通信故障可能由多種原因引起,以下是一些常見的通信故障及其解決辦法
    的頭像 發(fā)表于 03-08 11:27 ?1668次閱讀

    常見元器件故障及解決辦法

    在電子設備的日常使用和維護中,元器件的故障是不可避免的。了解常見元器件的故障類型及其解決辦法,對于快速定位問題并進行修復至關重要。 1. 電阻器故障 故障現(xiàn)象: 電阻值變化:電阻器老化或損壞導致其實
    的頭像 發(fā)表于 10-29 16:21 ?1885次閱讀

    常見MCU故障及解決辦法

    微控制器單元(MCU)是現(xiàn)代電子設備中的核心組件,負責處理和控制各種功能。然而,由于各種原因,MCU可能會出現(xiàn)故障。以下是一些常見的MCU故障及其解決辦法: 1. 電源問題 故障現(xiàn)象: MCU無法
    的頭像 發(fā)表于 11-01 13:41 ?7039次閱讀

    常見墊圈故障及解決辦法 防漏墊圈的設計與應用

    常見墊圈故障及解決辦法 1. 墊圈老化 故障現(xiàn)象: 墊圈因長時間使用而老化,失去彈性,導致密封性能下降。 解決辦法: 定期檢查墊圈的老化情況,及時更換新的墊圈。 2. 墊圈變形 故障現(xiàn)象: 由于安裝
    的頭像 發(fā)表于 12-12 15:31 ?1019次閱讀
    主站蜘蛛池模板: 欧美一区二区视频在线观看 | 日韩在线视频www色 日韩在线看片中文字幕不卡 | 亚洲国产无线码在线观看 | 日韩一本道无码v | 99热在线免费观看 | yellow在线观看免费直播 | 中文字幕伊人香蕉在线 | 我要女人的全黄录像 | 一本大道香蕉中文在线视频观看 | 手机伊在人线香蕉2 | 99久久人妻无码精品系列性欧美 | 我要搞av| 100国产精品人妻无码 | 伊人久久大香线蕉综合高清 | 成人性生交大片免费看4 | 久久亚洲精品AV成人无码 | 娇小老少配xxxxx | 久久精品国产午夜伦班片 | 99久久久无码国产精精品 | 2022精品福利在线小视频 | 精品国产免费人成视频 | 皮皮色狼网 | 男人的天堂MV在线视频免费观看 | 亚洲 欧美 中文 日韩 视频 | 男男免费看 | 恋孩癖网站大全在线观看 | 精品国产乱码久久久久久口爆 | 又硬又粗又大一区二区三区视频 | 日本大片免a费观看视频 | 亚洲精品天堂自在久久77 | 99久久久久亚洲AV无码 | 老男人粗大猛 | 白丝女仆被强扒内裤 | 污漫日本E同人 | 麻豆国产精品va在线观看约 | 男人J放进女人P全黄网站 | 女人一级毛片免费视频观看 | 不卡无线在一二三区 | 成人无码在线超碰视频 | 亚洲欧美另类无码专区 | 亚洲色无码播放 |

    電子發(fā)燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品