Bugsnag的MongoDB分片集群使用經驗
Bugsnag是一家為移動應用開發者提供實時的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的博文,讀者可以自行學習。
來自:http://www.infoq.com/cn/news/2014/10/bugsnag-mongo-sharding