摘要:所有的讀操作都在復制集的從節點上執行。讀操作會在復制集中網絡延時最小的節點上進行,與節點類型無關。根據上面講的,如果復制集的讀選項是配置的。為了避免這種情況,提高服務的可用性,可以在服務器上部署一個投票節點。
為什么要使用復制集
1.備份數據
通過自帶的 mongo_dump/mongo_restore 工具也可以實現備份,但是畢竟沒有復制集的自動同步備份方便。
2.故障自動轉移
部署了復制集,當主節點掛了后,集群會自動投票再從節點中選舉出一個新的主節點,繼續提供服務。而且這一切都是自動完成的,對運維人員和開發人員是透明的。當然,發生故障了還是得人工及時處理,不要過度依賴復制集,萬一都掛了,那就連喘息的時間都沒有了。
3.在某些特定的場景下提高讀性能
默認情況下,讀和寫都只能在主節點上進行。
下面是MongoDB的客戶端支持5種復制集讀選項:
primary:默認模式,所有的讀操作都在復制集的 主節點 進行的。
primaryPreferred:在大多數情況時,讀操作在 主節點 上進行,但是如果主節點不可用了,讀操作就會轉移到 從節點 上執行。
secondary:所有的讀操作都在復制集的 從節點 上執行。
secondaryPreferred:在大多數情況下,讀操作都是在 從節點 上進行的,但是當 從節點 不可用了,讀操作會轉移到 主節點 上進行。
nearest:讀操作會在 復制集 中網絡延時最小的節點上進行,與節點類型無關。
來源:http://docs.mongoing.com/manual-zh/core/read-preference.html
不推薦在從節點上進行讀操作,因為從節點上的數據可能不是最新數據(主要原因)。
在從節點上進行讀操作的場景很有限,官方手冊中寫明了適用的場景和不推薦從節點讀操作的多個原因:http://docs.mongoing.com/manual-zh/core/read-preference.html#use-cases
說說我自己的看法:復制集并不是為了提高讀性能而存在的,除了個別場景,不推薦在從節點上進行讀操作。如果想提升讀性能,那么請使用索引和分片。插一句,如果數據規模不大,就沒必要使用分片了。我們線上數據庫中單個集合記錄有將近 2 億條,性能還比較 OK(當然,機器配置也不差,而且上面就只跑了一個 Redis 和一個 MongoDB)。
如何部署復制集請看手冊:http://docs.mongoing.com/manual-zh/tutorial/deploy-replica-set.html
如何在程序中使用 MongoDB 復制集故障自動轉移的特性以 PHP 的 mongo 驅動為例。
$client = new MongoClient("mongodb://192.168.1.2:27018,192.168.1.3:27019,192.168.1.4:27020", array("replicaSet" => "rs0"));
這樣配置后,如果只是其中一臺 MongoDB 服務掛斷后,剩余的節點會自動選舉出新的主節點,程序還是可以繼續正常運行。在選舉的過程中,程序還是會拋出異常的,盡管選舉過程很快,但是為了程序的健壯性,必須考慮異常的處理。當然,如果選舉不出新的主節點,那么整個 MongoDB 就不可用了。(根據上面講的,如果復制集的讀選項是配置的 primaryPreferred。如果沒有了主節點,但是從節點還可用的話,那么讀操作將轉移到從節點上去,這樣整個 MongoDB 復制集還能提供讀操作服務)
其實如果指定了復制集名 "replicaSet" => "rs0",那么就算不列出所有節點地址,僅寫一個有效節點地址,mongo 驅動會自動獲取到所有有效節點,$client->getHosts() 方法可以查看所有有效節點的地址。
但是如果你只寫了一個節點地址,剛好是那個節點掛掉了,那就連不上了。所有我建議配置完整的節點地址列表。
同步的原理是什么開啟復制集后,會在 local 庫下生成一個集合叫 oplog.rs,這是一個有限集合,也就是大小是固定的。每次對數據庫的寫操作都會被記錄到這個集合里面。復制集中的節點就是通過讀取其他節點上面的 oplog 來實現數據同步的。
舉個例子:
用客戶端向主節點添加了 100 條記錄,那么 oplog 中也會有這 100 條的 insert 記錄。從節點通過獲取主節點的 oplog,也執行這 100 條 oplog 記錄。這樣,從節點也就復制了主節點的數據,實現了同步。
需要說明的是:并不是從節點只能獲取主節點的 oplog。
為了提高復制的效率,復制集中所有節點之間會互相進行心跳檢測(通過ping)。每個節點都可以從任何其他節點上獲取oplog。
還有,用一條語句批量刪除 50 條記錄,并不是在 oplog 中只記錄一條數據,而是記錄 50 條單條刪除的記錄。
什么情況下需要重新同步oplog中的每一條操作,無論是執行一次還是多次執行,對數據集的影響結果是一樣的,i.e 每條oplog中的操作都是冪等的。
在上一個問題中得知:oplog 大小是固定的,而且 oplog 里面的記錄數不一定和節點中的數據量成正比。那么,新記錄肯定會將前面的老記錄給覆蓋。
如果,有天一個從節點掛了,其他節點還在正常運行,繼續有寫操作,oplog 繼續增長。而這個掛掉的節點一直不能從其他節點那里同步最新的 oplog 記錄,當其他節點的 oplog 已經發生的覆蓋。即使這個從節點后來恢復了正常,也不會和其他節點保持數據一致了。因為,覆蓋的就永遠回不來了。
那么,這個時候就得重新同步了。恩,回不去的就永遠回不去了,再找個新的重新開始吧。(逃
如何重新同步參見:復制集成員的重新同步
什么時候應該使用投票節點當復制集中有偶數個節點時,應該再加一個投票節點,用于打破投票僵局。
比如:我線上共有3臺服務器,其中1臺是作為 Web 服務器;其余2臺作為 DB 服務器,各部署了1個MongoDB節點,構成了2個節點的復制集。這個時候,我并沒有多余的機器了。在這個情況下,如果任意一臺 DB 服務器上的 MongoDB 掛了,那么另外一臺的 MongoDB 必然變為 SECONDARY 節點,那么就意味著 MongoDB 是不可用的了。為了避免這種情況,提高服務的可用性,可以在 Web 服務器上部署一個投票節點。投票節點并不存儲數據,因此不能升職為 PRIMARY 節點,它對于硬件資源要求很低,并不會對 Web 服務器上的其他程序產生太大影響。這種情況下,如果任意一臺 DB 服務器掛了,另外一臺服務器上的 MongoDB 將成為 PRIMARY 節點,此時 MongoDB 還是依舊對外提供服務的。乘此時機,趕緊排查出故障的那臺服務器的原因,盡快恢復服務。
為了讓投票節點可以占用更少的資源,可以在配置文件中添加以下幾個配置項:
journal = false smallfiles = true noprealloc = true主從復制
master-slave 復制架構已經不推薦使用了,建議使用 replica sets 復制集架構。
參見:http://docs.mongoing.com/manual-zh/core/master-slave.html
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21244.html
摘要:所有的讀操作都在復制集的從節點上執行。讀操作會在復制集中網絡延時最小的節點上進行,與節點類型無關。根據上面講的,如果復制集的讀選項是配置的。為了避免這種情況,提高服務的可用性,可以在服務器上部署一個投票節點。 為什么要使用復制集 1.備份數據通過自帶的 mongo_dump/mongo_restore 工具也可以實現備份,但是畢竟沒有復制集的自動同步備份方便。 2.故障自動轉移部署了復...
摘要:新特性更多跨區域復制集節點的支持作為一種自動化數據庫服務,,目前被數以千計的客戶應用在廣泛的行業中,以提供高可用性,一致性,以及一些簡單的操作。這意味著在其他區域中的副本集成員將參與選舉,并且在我們的主節點發生故障時,將自動進行故障轉移。 MongoDB Atlas 新特性:更多跨區域復制集節點的支持 作為一種自動化數據庫服務,MongoDB Atlas,目前被數以千計的客戶應用在廣泛...
摘要:另外,支持對復制集的節點進行靈活的配置,以適應多種場景的需求。節點只參與投票,不能被選為,并且不從同步數據。節點不能被選為主為,并且對不可見。根據各集合的設置,在上為相應集合創建。 復制集簡介 Mongodb復制集由一組Mongod實例(進程)組成,包含一個Primary節點和多個Secondary節點,Mongodb Driver(客戶端)的所有數據都寫入Primary,Second...
閱讀 890·2021-10-25 09:44
閱讀 1262·2021-09-23 11:56
閱讀 1183·2021-09-10 10:50
閱讀 3131·2019-08-30 15:53
閱讀 2134·2019-08-30 13:17
閱讀 617·2019-08-29 18:43
閱讀 2491·2019-08-29 12:57
閱讀 855·2019-08-26 12:20