ClickHouse副本機(jī)制簡(jiǎn)介
ClickHouse副本機(jī)制簡(jiǎn)介
Clickhouse 副本節(jié)點(diǎn)之間通過(guò)Zookeeper 的log數(shù)據(jù)和其他控制信息,實(shí)現(xiàn)了副本間數(shù)據(jù)的異步同步。本文中簡(jiǎn)單介紹插入數(shù)據(jù)后副本之間同步流程。
副本表Zookeeper目錄結(jié)構(gòu)
創(chuàng)建副本表,并插入數(shù)據(jù),在Zookeeper上可以看到表目錄下主要包含下列目錄信息,
ReplicatedMergeTree(’/clickhouse/tables/{shard}/tbl_replicated’, ‘{replica}’)
tbl_replicated:
| —— block_numbers
|all
| —— blocks
| —— columns 列信息
| —— leader_election
| —— leader_election-0000000000 主信息,副本節(jié)點(diǎn)(multiple leaders ok)
| —— log
| —— log-0000000000 part名稱以及相關(guān)的塊信息,創(chuàng)建時(shí)間,source replica, part_type
| —— metadata 元數(shù)據(jù)信息 (未變化)
| —— mutations 空 (未變化)合并場(chǎng)景,alter table的場(chǎng)景
| —— nonincrement_block_numbers 空 (未變化)
| —— quorum ----> 默認(rèn)情況下,INSERT 語(yǔ)句僅等待一個(gè)副本寫(xiě)入成功后返回。
如果數(shù)據(jù)只成功寫(xiě)入一個(gè)副本后該副本所在的服務(wù)器不再存在,
則存儲(chǔ)的數(shù)據(jù)會(huì)丟失。
要啟用數(shù)據(jù)寫(xiě)入多個(gè)副本才確認(rèn)返回,使用 insert_quorum 選項(xiàng)。
| —— failed_parts
| —— last_part
| —— parallel
| —— replicas
| —— 1 、2
| —— columns 列信息
| —— flags
| —— host 當(dāng)前副本的主機(jī)信息,端口號(hào)
| —— is_active 副本節(jié)點(diǎn)ClickHouseServer進(jìn)程PID
| —— is_lost
| —— log_pointer ===》 1
| —— max_processed_insert_time
| —— metadata 元數(shù)據(jù)信息
| —— metadata_version
| —— min_unprocessed_insert_time
| —— mutation_pointer
| —— parts 副本包含的part 信息
| —— queue 副本節(jié)執(zhí)行操作的隊(duì)列
同步流程
數(shù)據(jù)插入,流程如下:
1、在其中2副本節(jié)點(diǎn)插入數(shù)據(jù)時(shí),如果數(shù)據(jù)只存在1個(gè)partition的數(shù)據(jù),則在該副本節(jié)點(diǎn)產(chǎn)生1個(gè)part。
2、ClickHouse Server從tbl_replicated/block_numbers/all(all是分區(qū)名,沒(méi)有分區(qū)的情況下是all) 獲取新產(chǎn)生part的下標(biāo),該下標(biāo)是遞增的。使用獲取的part 下標(biāo)產(chǎn)生對(duì)應(yīng)的part 名。比如,首次插入數(shù)據(jù)從tbl_replicated/block_numbers/all獲取到的下標(biāo)是0, 則產(chǎn)生all_0_0_0 的part名。下次插入時(shí),從tbl_replicated/block_numbers/all獲取到的下標(biāo)是1,產(chǎn)生的part 名是all_1_1_0;
3、用這個(gè)part 名生成寫(xiě)入磁盤(pán)后,在zookeeper副本表目錄下產(chǎn)生part 信息node
tbl_replicated/replicas/2/parts/all_0_0_0
在tbl_replicated/replicas/2/part/all_0_0_0在tbl_replicated/log目錄產(chǎn)生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產(chǎn)生的
副本同步流程
1、副本節(jié)點(diǎn)1 定時(shí)讀取tbl_replicated/log 目錄,讀取到新的log后,將log同步到本副本節(jié)點(diǎn)的tbl_replicated/replicas/1/queue/queue-00000000000, 然后更本節(jié)點(diǎn)的tbl_replicated/replicas/1/log_pointer 值為0,表明本副本已經(jīng)執(zhí)行到log-0000000000,后續(xù)執(zhí)行l(wèi)og-0000000001(包含)之后的log
2、內(nèi)核中副本表的定時(shí)任務(wù)從tbl_replicated/replicas/1/queue消費(fèi)節(jié)點(diǎn),讀取到log-0000000000的內(nèi)容時(shí),需要從source replica: 2 拉取part ,副本2對(duì)應(yīng)的主機(jī)節(jié)點(diǎn)host 從znode 節(jié)點(diǎn)/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也寫(xiě)入tbl_replicated/replicas/1/parts/all_0_0_0的znode ,表明本副本節(jié)點(diǎn)有這個(gè)part數(shù)據(jù)。
在副本消費(fèi)queue的過(guò)程中,并不是嚴(yán)格先入先出的順序。如果看到log 的類(lèi)型是merge 而不是get ,則考慮優(yōu)先去拉取merge后的part 數(shù)據(jù),而不是直接拉取原始的part
3、log 清除邏輯。當(dāng)log_xxxxxxx下標(biāo)已經(jīng)小于所有有副本的log_pointer ,且log 目錄下的數(shù)量已經(jīng)大于指定閾值,則會(huì)清除該log節(jié)點(diǎn)。
EI企業(yè)智能 FusionInsight
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。