一次因mongo查詢不存在字段引發(fā)的事故記錄
話說(shuō)今天的一個(gè)小小的查詢失誤給了我比較深刻的教訓(xùn),也讓我對(duì)mongo有了更深刻的理解,下面我們來(lái)說(shuō)說(shuō)這個(gè)事情的原委:
我們經(jīng)常使用阿里云子賬號(hào)在DMS上查詢線上數(shù)據(jù)庫(kù)數(shù)據(jù),今天也是平常的一次操作
集合:
XXXX_message<br>數(shù)據(jù)量約 600萬(wàn)
我執(zhí)行了下面的mongo查詢:
db.XXXX_message.find({"channel_id": "1000000009XXXX700XXXX"}).limit(20);
但是上述語(yǔ)句中的 "channel_id" 字段不存在,真實(shí)字段應(yīng)該是channel(有索引),屬于失誤操作
在執(zhí)行過程中,我發(fā)現(xiàn)查詢時(shí)間很久,于是中斷了查詢又重試了兩次,還是很久,最后中斷了查詢,我意識(shí)到我想查的字段可能錯(cuò)了,于是看了下集合索引,使用正確的字段檢索得到結(jié)果
但就在這時(shí)候,一場(chǎng)事故也在悄然醞釀,2分鐘后,阿里云監(jiān)控中心打來(lái)告警電話,mongo數(shù)據(jù)庫(kù)cpu、iops異常升高
起初并沒有意識(shí)到是這個(gè)查詢導(dǎo)致的,還以為是半小時(shí)前發(fā)布的版本可能有問題,于是立即回滾了版本并開始項(xiàng)目檢查
查了許久,并沒有查到可能造成本次數(shù)據(jù)庫(kù)異常告警的原因,項(xiàng)目對(duì)該庫(kù)的依賴的操作的地方非常少。
當(dāng)我們苦苦想不到原因的時(shí)候,我們?nèi)ゲ榱讼孪嚓P(guān)慢sql日志,果然一道耗時(shí)約1800000ms的慢sql日志引起了我們的注意
這時(shí)候我似乎意識(shí)到了點(diǎn)什么,我立馬查阿里云控制臺(tái)查詢歷史核對(duì)了我剛才查詢的時(shí)間和數(shù)據(jù)庫(kù)cpu、磁盤iops異常升高的時(shí)間節(jié)點(diǎn)
完全對(duì)上了,該起事故持續(xù)半小時(shí)左右,那條沒有被成功中斷的sql也執(zhí)行了半小時(shí)左右
這讓我很震驚,一次控制臺(tái)查詢居然導(dǎo)致整個(gè)數(shù)據(jù)庫(kù)出現(xiàn)如此嚴(yán)重的問題,mongo底層沒有考慮過不存在字段查詢問題嗎?
我慢慢平復(fù)心情,仔細(xì)回顧這件事情,我嘗試著從mongo和mysql的底層去理解這個(gè)問題
mongo本身是集合型數(shù)據(jù)庫(kù),意味著每個(gè)集合文檔都可以有自己獨(dú)立的數(shù)據(jù)結(jié)構(gòu),和mysql等關(guān)系型數(shù)據(jù)庫(kù)的很重要的區(qū)別就是它沒有固定的表結(jié)構(gòu),它包容且隨性
當(dāng)在查詢一個(gè)不存在的字段的時(shí)候,它仍然按照普通查詢檢索數(shù)據(jù),這時(shí)候它會(huì)全表掃描,也就是說(shuō)在上述失誤語(yǔ)句中,mongo底層檢索了整個(gè)集合的數(shù)據(jù)集,
遍歷了該集合所有的磁盤塊,這才導(dǎo)致磁盤iops升高且cpu升高。
這次經(jīng)歷讓我覺得我有必要記錄下相關(guān)心得,可能對(duì)于很多高級(jí)技術(shù)人員,這些東西都是很容易理解和規(guī)避的事情,但大多數(shù)人對(duì)此可能并沒有深刻認(rèn)識(shí)
這次事故讓我對(duì)技術(shù)多了一層敬畏,這有助于我在今后的代碼實(shí)踐和操作中更加謹(jǐn)慎和多一層思考,希望大家以此為戒!此文共勉!
到此這篇關(guān)于一次因mongo查詢不存在字段引發(fā)的事故記錄的文章就介紹到這了,更多相關(guān)mongo查詢不存在字段的事故內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Centos7安裝和卸載Mongodb數(shù)據(jù)庫(kù)的方法
MongoDB是一個(gè)跨平臺(tái),面向文檔的數(shù)據(jù)庫(kù),提供高性能,高可用性和易于擴(kuò)展。MongoDB是工作在集合和文檔上一種概念。下面通過本文給大家分享Centos7安裝和卸載Mongodb數(shù)據(jù)庫(kù)的方法,需要的朋友參考下吧2017-11-11關(guān)于Mongodb 認(rèn)證鑒權(quán)你需要知道的一些事
最近因?yàn)閙ongodb被黑了,早先我就疑惑過怎么這東西開啟服務(wù)就能用了,后來(lái)找了各方資料,知道MongoDB默認(rèn)是沒有鑒權(quán)的,所以這篇文章主要給大家介紹了關(guān)于Mongodb認(rèn)證鑒權(quán)你需要知道的一些事,需要的朋友可以參考下。2017-10-10MongoDB快速入門及其SpringBoot實(shí)戰(zhàn)教程
MongoDB是一個(gè)開源、高性能、無(wú)模式的文檔型數(shù)據(jù)庫(kù),當(dāng)初的設(shè)計(jì)就是用于簡(jiǎn)化開發(fā)和方便擴(kuò)展,是NoSQL數(shù)據(jù)庫(kù)產(chǎn)品中的一種,它支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是一種類似于JSON的格式叫BSON,本文介紹MongoDB快速入門及其SpringBoot實(shí)戰(zhàn),感興趣的朋友一起看看吧2023-12-12解決net start MongoDB 報(bào)錯(cuò)之服務(wù)名無(wú)效的問題
這篇文章主要介紹了解決net start MongoDB 報(bào)錯(cuò)之服務(wù)名無(wú)效的問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12MongoDB系列教程(三):Windows中下載和安裝MongoDB
這篇文章主要介紹了MongoDB系列教程(三):MongoDB下載和安裝,本文講解使用Windows環(huán)境安裝MongoDB,需要的朋友可以參考下2015-05-05MongoDB對(duì)Document(文檔)的插入、刪除及更新
這篇文章介紹了MongoDB對(duì)Document(文檔)的插入、刪除及更新,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07Mongodb過濾器filter選擇要返回的數(shù)組子集操作方法
Mongodb使用過濾器 $filter根據(jù)指定條件選擇要返回的數(shù)組子集,這篇文章主要介紹了Mongodb對(duì)嵌套文檔數(shù)組進(jìn)行查詢操作,需要的朋友可以參考下2023-07-07mongodb exception: $concat only supports strings, not Number
這篇文章主要介紹了mongodb exception: $concat only supports strings, not NumberInt32解決辦法,需要的朋友可以參考下2014-06-06mongodb增量/全量備份腳本的實(shí)現(xiàn)詳解
這篇文章主要給大家介紹了關(guān)于mongodb增量/全量備份腳本的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09