MongoDB 最佳實踐

2021-06-09 03:54:14 字數 1879 閱讀 8879

已經有很多關於 nosql 選擇的文章了。影響你選擇資料庫的因素有:讀/寫操作的吞吐量,永續性,一致性,延遲性等等。nathan hurst 的文章「visual guide to nosql system」  很好的總結了這一點。

nosql 通用的最佳實踐

1. 徹底的測試

模擬你的生產環境,包括流量來進行測試。假如你的測試環境不能達到生產環境的壓力,你將無法發現效能瓶頸和架構缺陷。

2. rdbms 並不一定能遷移到 nosql

任何在rdbms上工作的好好的東西並不一定能在mongodb上工作。所以請你做好心理準備,仔細對比資料庫的功能。為了更好的效能,你應該根據 10gen 的建議來設計你的文件和查詢。你的應用也許需要重新架構以便於遷移到非關係型資料庫。

3. 考慮你的資料的一致性和永續性需求

這一點很重要!mongodb通過多例項備份來提解決資料永續性問題。我們不推薦你在生產環境中只使用乙個mongodb例項。你必須理解為什麼要這麼做。

mongodb 最佳實踐

1. 始終啟用備份

備份能保證你應用的高可用性。假如你的乙個節點down了,第二節點可以迅速啟用,你的應用不會中斷。

2. 使用最新版本

10gen在不斷的發布更新,特別是2.0.x包含了很高的效能提公升和並行改進,索引改進和bug修復。如果你還在使用 1.6.3的話,你應該盡快公升級。

3. 不要在32位的系統上跑mongodb

mongodb在32位系統上有「2.5gb資料限制」。它的儲存引擎使用記憶體對映來讀取檔案以獲得更好的效能。這個功能依賴於記憶體定址,而32位系統的記憶體不能超過4gb。

4. 預設開啟日誌

mongodb支援資料庫操作的提前日誌(write-ahead journaling)。這個功能有助於災難恢復。

5. 注意你資料檔案的位置

你應該保證你的mongodb的資料檔案是儲存在物理驅動器上,例如 /data/mongodb。當然你也可以使用虛擬的驅動器,但是必須非常小心。因為它有可能會影響到你的集群架構。我們建議你使用 amazon ebs 來存放你的資料庫檔案。

6. 保證足夠大的記憶體

為了保證整個集群的效能,你要確保整個所有mongodb的工作例項(working set)包括索引可以完全裝入記憶體。如果你發現「page faults」的概率在增加,很有可能mongodb的資料量超出了你的記憶體。在這種情況下你有兩種選擇:加記憶體,或者建立分片集群(sharding)。我們建議你先考慮加記憶體。

7. 保持 65% 以內的壓力

如果你發現你的集群壓力達到了65%,那麼你應該考慮擴大你的集群了。通常,你應該保證資料庫壓力低於65%。

8. 特別小心分片集群

分片集群需要你充分理解你應用的資料訪問方式。你應該充分了解mongodb的分片工作方式,並且確認你確實需要這個功能。還有,選擇乙個分片鑰匙(sharding key)是對於效能也是很重要的。

配置伺服器對於乙個集群的健康也是很重要的。在分片集群的環境中,你必須有三颱配置伺服器。永遠不要刪除配置伺服器的資料,時常備份這些資料。這些配置伺服器也需要64位的環境。還有,不要把三颱配置伺服器放在同一臺機器上!

9. 使用 mongo mms 來圖形化的監控你的資料庫

如果你還沒有使用 mongo mms的話,我強烈推薦這個工具。10gen 正在大力開發這個產品。它提供了乙個非常友好的視覺化的介面來監控你的mongodb集群。

10. mongodb 資源

技術總是在不斷進步,你需要市場關注這些資訊:

documentation:

google group:

bugs:

blog:

MongoDB最佳實踐

將mongodb加入到我們的服務支援列表中,是整個團隊年初工作計畫中的首要任務。但我們感覺如果先新增一項對nosql儲存的支援,而不是先公升級已支援的關係型資料庫,可能對使用者不太好,畢竟目前的使用者都使用關係型資料庫。所以我們決定將引入mongodb這項工作放到公升級mysql和postgresq...

mongodb 最佳實踐

不要按照關係型來設計表結構 mongodb可以讓你像關係型資料庫一樣設計表結構,但是它不支援外來鍵,也不支援複雜的join!如果你的程式發現有大量實用join的地方,那你的設計可能需要重新來過。參照以下相關模式設計建議。資料庫集合 collection 的數量不宜太多 mongodb的模式設計基於靈...

MongoDB最佳實踐

將mongodb加入到我們的服務支援列表中,是整個團隊年初工作計畫中的首要任務。但我們感覺如果先新增一項對nosql儲存的支援,而不是先公升級已支援的關係型資料庫,可能對使用者不太好,畢竟目前的使用者都使用關係型資料庫。所以我們決定將引入mongodb這項工作放到公升級mysql和postgresq...