Brewers CAP theorem是瞭解什麼是可用的選項的最佳來源。我可以說這一切都取決於,但如果我們談論Mongo,那麼它提供了開箱即用的橫向擴展性,並且在某些情況下它總是很好。
現在關於一致性。實際上,您有三種選擇讓數據保持最新狀態:
1)首先要考慮的是安全性指示的「安全」模式或「getLastError()」。如果您發出「安全」寫入,則知道數據庫已收到插入並應用寫入。但是,MongoDB只會每60秒刷新一次磁盤,所以服務器可能會在沒有磁盤上的數據的情況下發生故障。
2)要考慮的第二件事是「日記」(v1.8 +)。打開日記功能後,數據每隔100ms刷新一次。所以你在失敗之前有一個較小的時間窗口。驅動程序有一個比「安全」更進一步的「fsync」選項(檢查該名稱),它等待確認數據已刷新到磁盤(即日誌文件)。但是,這僅涵蓋一臺服務器。如果服務器上的硬盤驅動器死了會發生什麼?那麼你需要第二個副本。
3)要考慮的第三件事是複製。驅動程序在返回之前支持一個「W」參數,該參數表示「將此數據複製到N個節點」。如果在某個超時之前寫入未達到「N」個節點,則寫入失敗(拋出異常)。但是,您必須根據副本集中的節點數量正確配置「W」。同樣,由於硬盤驅動器可能會失敗,即使使用日記功能,也需要考慮複製。然後跨越數據中心進行復制,這些時間太長而無法進入。最後要考慮的是你的要求「回滾」。據我瞭解,MongoDB沒有這種「回滾」能力。如果您正在進行批量插入,您將得到的最好結果是指示哪些元素失敗。
無論如何,當數據一致性成爲開發人員的責任時,存在很多情況,並且由您決定要小心幷包含所有場景並調整數據庫模式,因爲沒有「這是正確的方式」在Mongo中就像我們習慣RDB-s一樣。
關於內存 - 這完全是一個性能問題,MongoDB將索引和「工作集」保存在RAM中。通過限制你的RAM限制你的工作集。你實際上可以擁有一個固態硬盤和更少量的內存,而不是大量的內存和硬盤 - 至少這些是官方建議。無論如何,這個問題是個人的,你應該爲你的具體使用情況做性能測試