一、ReplicatedMergeTree概述
ReplicatedMergeTree是ClickHouse的一種分散式表引擎,創建於2016年。它的設計目標是解決ClickHouse在分散式環境下,高並發下,數據更新頻繁等問題。相較於其他分散式引擎,如Distributed、Cluster等,ReplicatedMergeTree更適用於有大量數據更新的場景。
ReplicatedMergeTree採用了一種基於數據版本協調的方式,實現了高效的數據同步和數據一致性。並且,在數據更新量非常大的情況下,仍然可以保證較好的性能。
二、ReplicatedMergeTree數據結構
ReplicatedMergeTree的核心是一種基於分區的MergerTree結構。每個分區都是一棵MergerTree,每個節點保存該節點下所有分區的數據,並維護版本。整個表是由所有分區組成的。
當向表中插入一條數據時,先根據分區鍵算出數據需要插入的分區。將數據插入該分區的MergerTree中的最底層——也就是葉子節點中,如果該葉子節點的數據量超過限制,則會觸發一次數據合併操作。即,將多個葉子節點的數據合併到父節點,並檢查合併後的節點數據量是否超限,如果超限則繼續向上合併,直到所有合併後的節點數據量不超過限制。
對於刪除、更新操作也是類似的。將需要刪除、更新的數據插入相應的分區中,如果被刪除、更新的數據位於合併節點的某個葉子節點,則將該葉子節點中對應數據刪除或更新;如果在合併節點的父節點中,則將刪除、更新操作標記在分支的下一次合併操作時執行。
三、ReplicatedMergeTree工作流程
當一個節點更新了數據,ReplicatedMergeTree會把更新的數據同步到所有副本上,然後將數據插入到本地的分區中。如果別的節點更新了數據,則將其同步到本地後與本地的數據進行合併。當某個節點master宕機,系統會自動將副本中的數據選出一個副本作為新的master。
在數據同步過程中,ReplicatedMergeTree採用了一種積極的策略。每次收到新的更新,節點會立即將數據同步給所有節點,並且標記本地數據為「失效」,直到所有節點都同步完成後才恢複本地數據的有效性。
四、ReplicatedMergeTree代碼示例
-- 創建引擎的語法 CREATE TABLE 表名( ... ) ENGINE = ReplicatedMergeTree('集群名稱', '本節點名', partition_key, order_by_expression, replicas) -- 插入數據的語法 INSERT INTO 表名(欄位列表) VALUES (值列表)
五、ReplicatedMergeTree的優點
高並發下,可以保證數據一致性。ReplicatedMergeTree採用了版本控制的方式,並且在數據同步時採用了快速、積極的策略,保證數據一致性。
支持大規模更新。數據的更新、刪除都是用數據插入的方式實現的。因為MergeTree本身就是一種優秀的支持大量插入操作的引擎,所以ReplicatedMergeTree也自然適合處理大規模更新場景。
自動容錯。當master宕機時,系統會自動選擇一個節點作為新的master,保證數據的可用性。
六、ReplicatedMergeTree的缺點
不支持數據的細粒度多版本控制。ReplicatedMergeTree只有一種全量數據版本管理方式,不支持數據的細粒度版本控制,例如列級別的版本控制。
只能工作在ClickHouse之上。ReplicatedMergeTree是ClickHouse的一種分散式引擎,只能在ClickHouse之上使用。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/238274.html