學習mongodb,體會mongodb的每一個使用細節,歡迎閱讀威贊的文章。這是威贊發布的第81篇mongodb技術文章,歡迎瀏覽本專欄威贊發布的其他文章。如果您認為我的文章對您有幫助或者解決您的問題,歡迎在文章下面點個贊,或者關注威贊。謝謝。
本文簡單介紹Mongodb的分布式操作。mongodb支持復制集和分片集合,本文結合官方文檔,整理介紹復制集和分片結合的數據讀取。
復制集中的數據讀取
默認情況下,應用鏈接到復制集后,從復制集的主節點承擔了客戶端或應用的數據讀寫操作。mongodb允許用于指定參數readpreferences來通過復制集中的其他節點來讀取數據。
同樣用戶可以設置readpreferences參數,將讀取操作轉移到從節點或與主節點最近的節點來實現下面的操作目的
- 減少多數據中心數據同步的延遲
- 將大量的讀取操作分配的主節點以外的節點,從而提高讀取數據吞吐量
- 在從節點做數據備份
- 當主節點切換時,直到新的主節點選出來以后才可以讀取數據。
在復制集從節點讀取數據時,因為數據變更從主節點同步到從節點需要時間和過程,因此讀取數據的狀態可能不是最新的狀態。同樣因為數據同步的延遲,在從節點中讀取到的數據可能不是單調連續的。客戶端可以使用數據一致性的session設置,保證數據讀取的正確性。當然,使用從節點讀取數據時,客戶端可以按照數據庫連接或操作來設置。用戶可以參考相關的文檔來設定不同的參數。
復制集中的數據寫入
在復制集中,所有的寫入操作都是發生在主節點。主節點執行寫入操作,同時將操作記錄在主節點的操作日志當中。操作日志是一個可重現的順序操作的集合。從節點持續的將操作日志同步到自己的節點,并依據操作日志當中記錄下來的事件,將數據變更同步寫入到自己節點的數據集中。用戶可以指定mongodb主節點通知用戶數據變更完成的方式。比如,當主節點數據寫入完成后,就返回寫入結果給客戶,或者在最近的一個從節點完成后,將數據變更結果返回給客戶。
分片集中數據讀取
分片集允許用戶將數據分成不同的數據塊,保存到分片集的不同節點當中。這種方式對應用和數據庫客戶端來說是透明的。數據分塊保存發生在數據庫集群當中。在復制集當中,用戶的操作是針對集群中的一個mongos服務實例的。mongos服務實例,依據數據分塊時產生的元數據,將請求派發到不同的節點。
當用戶指定具體的數據分片時,mongodb分片集無需再次確認到哪個節點中讀取數據,這樣讀取操作會變得很高效。針對分片集群的查詢應該帶上分片鍵。帶有分片鍵的查詢,mongos可以用過分片元數據將查詢分配到具體的分片節點當中。
對于沒有分片鍵的查詢,mongodb分片集群不得不查詢集群中所有的節點。這樣從每個分片節點收集數據,會變得很低效。在大型分片集群當中,這種分散收集的方式是不可行的。
與復制集類似,分片集在從節點中讀取到的數據可能無法反應數據最新的狀態。在從節點中讀取的數據,也無法保證是單調一致的。用戶可以使用一致性會話,保證數據讀取的一致性。
分片集中數據的寫入
在分片集合中,mongos直接將應用或客戶端發過來的數據寫到對應的數據分片中。mongos通過元數據配置庫,找到數據應該寫入的節點,將寫入數據的操作派發到該節點。
Mongodb依據用戶指定的分片鍵,將數據分成不同的數據塊。然后將這些數據塊保存到不同的分片節點中。分片鍵決定了數據塊寫入的節點。mongodb分片集寫入數據時,會影響集群的性能。
mongodb數據更新單個文檔數據時,必須要包含分片鍵或主鍵。多文檔數據的更新時,帶有分片鍵在某些情況下會提高效率。多文檔數據更新也有可能被發到每一個分片服務上。
如果分片鍵的值每個插入操作都增加或減少,那么所有的這些插入操作會產生一個新的數據分片。這樣來說,單個插入操作的容量,就會被限制為分片的容量。