已經有很多關於 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...