這篇文章主要關註分散式系統中的數據複製,它提高了系統的可用性和可靠性,保證業務正常運行。常見的數據複製方法包括同步複製技術、非同步複製技術和半同步複製技術。 ...
分散式數據複製
我們在進行分散式數據存儲設計時,通常會考慮對數據進行備份,以提高數據的可用性和可靠性,“數據複製技術”就是實現數據備份的關鍵技術。
什麼是數據複製技術?
在分散式資料庫系統中,通常會設置主備資料庫,當主資料庫出現故障時,備資料庫可以替代主資料庫進行後續的工作,從而保證業務的正常運行。
數據複製技術就是如何讓主備資料庫保持數據一致的技術。
數據複製原理和應用
數據的一致性,是指不同節點上的數據要保持一致。對於分散式存儲系統中的數據複製技術來講,也需要在一致性和可用性之間做出權衡。
從一致性和可用性來看,數據複製技術一般分為三類:
- 比較註重一致性,例如同步複製技術
- 比較註重可用性,例如非同步複製技術
- 平衡一致性和可用性,例如半同步複製技術
同步複製技術
同步複製技術是指當用戶請求更新數據時,主資料庫必須要同步到備資料庫之後才可以給用戶返回結果,即如果主資料庫沒有同步到備資料庫,用戶的更新操作會一直阻塞。
這種方式保證了數據的強一致性,但是犧牲了系統的可用性。
在一個分散式資料庫系統中,有兩個節點,分別作為主節點和備節點。通常情況下,兩個節點都可以接收用戶讀請求,然後將本節點的數據及時返回給用戶,也就是說讀請求響應比較快。如果用戶發送的事寫請求,寫操作必須由主節點進行,即使用戶將寫請求發送到備節點,備節點也會將請求轉發給主節點,因此寫請求要比讀請求慢一些。
同步複製技術要求主資料庫等待所有備資料庫都操作成功才可以響應用戶,性能不是很好,影響用戶體驗。因此同步複製技術適用於分散式資料庫主備場景或者對數據一致性有嚴格要求的場合。
非同步複製技術
非同步複製技術是指當用戶請求更新數據時,主資料庫處理完請求後可以直接給用戶響應,而不必等到備資料庫完成同步,即備資料庫會非同步進行數據同步,用戶的更新操作不會因為備資料庫未完成數據同步而導致阻塞。
這種方式保證了系統的可用性,但是犧牲了數據的一致性。
分散式資料庫主備模式場景下,如果對數據一致性要求不高,也可以採用非同步複製方法。
MySQL集群預設採用的數據複製模式就是非同步複製技術,主要流程如下:
- 主資料庫完成寫操作後,可以直接給用戶回覆成功,將寫操作寫入binary log中,binary log中記錄著主資料庫執行的所有更新操作,以便備資料庫獲取更新信息。
- 備資料庫啟動一個IO線程專門讀取binary log中的內容然後寫入relay log中。
- 備資料庫啟動一個SQL線程會定時檢查relay log中的內容,如果發現有新內容則會立即在備資料庫中執行,從而實現數據的一致。
非同步複製技術一般會應用在對用戶請求響應時延要求很高的場景。
半同步複製技術
半同步複製技術的核心是用戶發出寫請求後,主資料庫會執行寫操作,並給備資料庫發送同步請求,但主資料庫不用等待所有備份資料庫回覆數據同步成功便可以響應用戶,也就是說主資料庫可以等待一部分備資料庫同步完成後響應用戶寫操作執行成功。
半同步複製技術通常由兩種方式:
- 當主資料庫收到多個備資料庫中某一個回覆數據同步成功後,便可以給用戶響應寫操作完成。
- 當主資料庫收到超過一半節點回覆數據更新成功後,再給用戶響應寫操作成功。
我們之前談過的ZooKeeper集群符合CP特征,它採用的數據複製技術就是上述第二種半同步複製方案,在ZooKeeper集群中,寫請求必須由Leader節點進行處理,每次寫請求,Leader會給Follower發Proposal,等待多數節點同意後寫操作才可成功。通過這樣的方式,ZooKeeper實現了一致性。
數據複製技術選型
多數的分散式存儲系統可以通過配置來選擇不同的數據複製技術,例如
- MySQL的資料庫集群,支持全同步複製、非同步複製和半同步複製三種模式。
- Oracle在數據複製方面提供了最大保護模式(半同步複製技術的第一種方式)、最大性能模式(非同步複製技術)和最大可用性模式(平時採用最大保護模式,主備發生網路故障時採用最大性能模式,這樣在一致性和可用性之間做了權衡)。
三種不同的數據複製技術的詳細比較如下。