Clickhouse 副本節點之間通過Zookeeper 的log資料和其他控制資訊,實作了副本間資料的異步同步,本文中簡單介紹插入資料后副本之間同步流程,
副本表Zookeeper目錄結構
創建副本表,并插入資料,在Zookeeper上可以看到表目錄下主要包含下列目錄資訊,
ReplicatedMergeTree(’/clickhouse/tables/{shard}/tbl_replicated’, ‘{replica}’)
tbl_replicated:
| —— block_numbers
|all
| —— blocks
| —— columns 列資訊
| —— leader_election
| —— leader_election-0000000000 主資訊,副本節點(multiple leaders ok)
| —— log
| —— log-0000000000 part名稱以及相關的塊資訊,創建時間,source replica, part_type
| —— metadata 元資料資訊 (未變化)
| —— mutations 空 (未變化)合并場景,alter table的場景
| —— nonincrement_block_numbers 空 (未變化)
| —— quorum ----> 默認情況下,INSERT 陳述句僅等待一個副本寫入成功后回傳,
如果資料只成功寫入一個副本后該副本所在的服務器不再存在,
則存盤的資料會丟失,
要啟用資料寫入多個副本才確認回傳,使用 insert_quorum 選項,
| —— failed_parts
| —— last_part
| —— parallel
| —— replicas
| —— 1 、2
| —— columns 列資訊
| —— flags
| —— host 當前副本的主機資訊,埠號
| —— is_active 副本節點ClickHouseServer行程PID
| —— is_lost
| —— log_pointer ===》 1
| —— max_processed_insert_time
| —— metadata 元資料資訊
| —— metadata_version
| —— min_unprocessed_insert_time
| —— mutation_pointer
| —— parts 副本包含的part 資訊
| —— queue 副本節執行操作的佇列
同步流程

資料插入,流程如下:
- 在其中2副本節點插入資料時,如果資料只存在1個partition的資料,則在該副本節點產生1個part,
- ClickHouse Server從tbl_replicated/block_numbers/all(all是磁區名,沒有磁區的情況下是all) 獲取新產生part的下標,該下標是遞增的,使用獲取的part 下標產生對應的part 名,比如,首次插入資料從tbl_replicated/block_numbers/all獲取到的下標是0, 則產生all_0_0_0 的part名,下次插入時,從tbl_replicated/block_numbers/all獲取到的下標是1,產生的part 名是all_1_1_0;
- 用這個part 名生成寫入磁盤后,在zookeeper副本表目錄下產生part 資訊node
tbl_replicated/replicas/2/parts/all_0_0_0
在tbl_replicated/replicas/2/part/all_0_0_0在tbl_replicated/log目錄產生log-0000000000 日志資訊:
[zk: 8.5.131.220:24002(CONNECTED) 11] get /clickhouse/tables/17/tbl_replicated/log/log-0000000000
format version: 4
create_time: 2021-11-20 14:27:00
source replica: 2
block_id: all_3218416765532976388_2128470793510818708
get
all_0_0_0
part_type: Compact
source replica: 2 表明該part 是從副本2產生的
副本同步流程
- 副本節點1 定時讀取tbl_replicated/log 目錄,讀取到新的log后,將log同步到本副本節點的tbl_replicated/replicas/1/queue/queue-00000000000, 然后更本節點的tbl_replicated/replicas/1/log_pointer 值為0,表明本副本已經執行到log-0000000000,后續執行log-0000000001(包含)之后的log
- 內核中副本表的定時任務從tbl_replicated/replicas/1/queue消費節點,讀取到log-0000000000的內容時,需要從source replica: 2 拉取part ,副本2對應的主機節點host 從znode 節點/clickhouse/tables/17/tbl_replicated/replicas/2/host獲取:
host: 8-5-131-220
port: 21429
tcp_port: 9000
database: db_test
table: tbl_replicated
scheme: https
拉取到part后,副本1也寫入tbl_replicated/replicas/1/parts/all_0_0_0的znode ,表明本副本節點有這個part資料,
在副本消費queue的程序中,并不是嚴格先入先出的順序,如果看到log 的型別是merge 而不是get ,則考慮優先去拉取merge后的part 資料,而不是直接拉取原始的part
3. log 清除邏輯,當log_xxxxxxx下標已經小于所有有副本的log_pointer ,且log 目錄下的數量已經大于指定閾值,則會清除該log節點,
本文由華為云發布,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/447058.html
標籤:其他
