一切都從一個簡單的任務開始: “嘿,讓我們檢查一下兩個資料庫是否隨時間具有相同的資料!”聽起來無害,對吧?噢,我們是多麼年輕和愚蠢。
我們的團隊做了一些研究(即谷歌搜尋)並找到了一個潛在的解決方案。就在那時,我們的資深隊友,也就是所謂的 MongoDB 專家介入了。
無論如何,他發現命令是一段神奇的程式碼,可以為集合產生哈希值
db.runCommand({ dbHash: 1, collections: [] }).md5
他很激動!興奮的!他幾乎在椅子上彈跳起來!他的總體計劃?在每個集合的兩個資料庫上執行此命令,比較散列值,如果它們不匹配,則繁榮!偵測到資料不一致!
首先,他在一個小型資料庫上進行了測試。它成功了。美麗的。完美的。完全沒有問題。因此,很自然地,他做了任何過度自信的工程師都會做的事情:
“讓我們在包含 2 億筆記錄的即時資料庫上嘗試!”
朋友們,此刻一切都變得非常糟糕。
起初,一切看起來都很好。他執行了命令。他等待著。然後等待。然後等待。
然後他不耐煩了,想道,嗯,也許我應該停止這個命令?所以他試圖殺死它。
劇情轉折:指揮部拒絕死亡。
幾秒鐘後,我們所有資料庫連線數飆升至 2,900% 。每個查詢都停止工作。應用程式崩潰了。使用者可能會對著螢幕尖叫。
就在這時,混亂突然爆發。警報響了(在我們腦中)。人們在大喊大叫。我們的團隊就像好萊塢爛電影裡的駭客一樣瘋狂地使用谷歌搜尋。
但無論我們怎麼嘗試,都沒有任何效果。但為了減少 mongodb 中的連接,我們停止了一些不重要的服務,並嘗試將連接保持在盡可能低的水平
我們的一個看似無害的命令卻徹底癱瘓了整個資料庫。這就像是把一塊小石頭丟進河裡,不知怎麼的就引發了海嘯。
然後,我們的MongoDB 專家(此時,他已經在壓力下老了 10 歲)最終決定閱讀官方文件。在那裡,像惡棍的邪惡陰謀一樣隱藏著這句雖小卻致命的句子:
The dbHash command locks the database and doesn’t allow any changes until it finishes.
翻譯: “哈哈,在我完成之前你們什麼也做不了。祝你們好運,失敗者們!”
此時,我們有兩個選擇:
坐在那裡希望奇蹟發生。
找到一種方法來強制喚醒我們可憐的、凍結的資料庫。
幸運的是,我們的 DevOps 隊友有一個想法。 “讓我們擴大資料庫。這將強制重新啟動並終止卡住的命令!”
我們猛烈地點點頭,看著他登入 MongoDB Atlas,像打開壞爐子的暖氣一樣增加資料庫大小,然後按下神奇的按鈕。
接下來的五分鐘,我們靜靜地坐在那裡,看著螢幕,祈禱資料庫之神。
然後砰!資料庫已重啟!卡住的命令已經消失!應用程式再次活躍起來!
我們歡呼起來。我們哭了。我們發誓永遠不再在即時資料庫上執行隨機命令。
在嘗試新事物之前,請務必閱讀說明。也許,除非你喜歡心臟病發作,否則不要在即時系統上測試實驗想法。
最後,如果文章對你有幫助的話,請按讚👏並關注,謝謝!
原文出處:https://dev.to/programmerraja/how-we-accidentally-declared-war-on-our-own-database-180k