Bugsnag的MongoDB分區叢集使用經驗,
Bugsnag是一家為行動裝置 App開發人員提供即時的Bug追蹤及檢測服務的創業公司,Bugsnag已經使用MongoDB儲存超過TB級的文檔資料。從Bugsnag的第一個版本開始他們就使用MongoDB儲存業務資料。近日,Bugsnag的工程師Simon Maynard在部落格上分享了他們的MongoDB分區叢集經驗,並開源了幾個他們常使用的指令碼。
帶標籤的分區(Tag Aware Sharding)
帶標籤的分區是MongoDB 2.2版本中引入的新特性,此特性支援人為控制資料的分區方式,從而使資料存放區到合適的分區節點上。具體的做法是通過對分區節點打tag標識,再將sharding key 按範圍對應到這些標識上。在Bugsnag中,每個頁面的載入都會涉及到使用者集合,比如查詢使用者是否登入,當應用向主分區上寫入大量資料時,所有的使用者請求都可能因此變得很慢。為瞭解決這個問題,Bugsnag對大的分區中的所有分區集合添加了一個標籤,這樣使用者集合就可以儲存到一台小型機器上,接下來就可以在記憶體中直接存取使用者資料。關於帶標籤的分區特性具體如何使用讀者也可以參考Asya的這篇部落格。
空的資料區塊
在刪除舊的資料時,分區中會出現空的資料區塊,這樣會導致分區不平衡。平衡分區的演算法僅僅只是調整分區中資料區塊的數量,忽略了資料區塊的大小。在MongoDB 2.6中,新增了一個mergeChunks命令用來將空的資料區塊合并到連續範圍的資料區塊上,但是這個命令並不可以自動執行,所以Bugsnag編寫了一個指令碼,以依次檢查資料區塊,並自動合并空的資料區塊。
大的資料區塊
大的資料區塊是指資料區塊的大小超過配置大小,Bugsnag編寫了一個指令碼用來發現並調整大資料區塊的大小。由於需要串連mongod和mongo執行個體,所以使用了MongoDB的Ruby介面Mongoid。指令碼會將大的資料區塊分割,以保證叢集中資料集合分布均衡。
孤立文檔(Orphaned documents)
在正常情況下,系統中不會有孤立文檔。不過,塊遷移過程中的一些失敗情況可能會留下孤立文檔。孤立文檔可以被安全刪除,MongoDB 2.6中可以使用cleanupOrphaned命令從分區中刪除孤立文檔。關於孤立文檔的更多內容讀者可以參考MongoDB工程師的這篇博文。
MoveChunk目錄
MoveChunk目錄中的檔案是進行分區均衡操作時產生的臨時檔案,操作完成後,這些檔案就可以被刪除。Bugsnag使用定時任務來定期清空該目錄,MongoDB也支援關閉此功能,讀者可以自行測試。
監控分區環境
Shell命令
- db.collection.getShardDistribution():查看分區叢集中集合是如何分布的。可以通過此命令確定分區上的某個集合相比於其它分區是何時開始突然變大的。
- db.stats():列印每個分區下的資料庫狀態,可以通過此命令跟蹤資料大小。可以傳入1024*1024*1024參數來以GB為單位顯示資料大小。
- sh.status():顯示整個叢集中資料區塊的分布情況,可以用來檢查資料是否分布均衡。
Mongostat
Mongostat是MongoDB內建的狀態偵查工具,當MongoDB叢集出現問題時,可以運行mongostat –discover來檢查叢集中各個mongos機器的效能指標。
作者最後總結到運行一個MongoDB分區叢集並不難,但是在運行過程中也不時地會有一些小的問題出現。在Bugsnag的部落格中有很多MongoDB的博文,讀者可以自行學習。