Clickhouse源碼分析:復制表數據的同步原理
代碼基于21.3.4.25-lts版本,本文以復制表insert的流程為例,講述在一個副本中插入數據,是怎么將數據同步到另外一個副本。
# 復制表的創建,這里主要創建幾個重要的監控線程 StorageReplicatedMergeTree::StorageReplicatedMergeTree queue // 表的隊列,保存了需要處理的操作 restarting_thread // 重連zk的線程,保證能夠一直連接zk ReplicatedMergeTreeRestartingThread::run queue_updating_task // 隊列更新任務,監控zk上的log,將它們加載到queue中 mutations_updating_task // mutation更新任務,監控zk上的mutations節點 merge_selecting_task // 選擇part進行merge或者mutate的任務 background_executor // 后臺處理隊列的線程 # 數據的寫入 InterpreterFactory::get InterpreterInsertQuery::execute StorageReplicatedMergeTree::write ReplicatedMergeTreeBlockOutputStream ReplicatedMergeTreeBlockOutputStream::write writeTempPart // 數據寫入本地磁盤 commitPart // 向zk提交插入的part信息 renameTempPartAndAdd // 臨時目錄變為正式目錄 makeCreateRequest // 提交log_entry,zk上會創建log-xxx mergeSelectingTask // 主動觸發merge任務 # 隊列更新線程 queueUpdatingTask,也就是log entry的監控線程 ReplicatedMergeTreeQueue::pullLogsToQueue // 監控zk上是否有新的log產生 makeCreateRequest // 將log的內容放到zk上的/queue節點下 insertUnlocked // 在queue中新增當前entry # 隊列任務處理進程 scheduling_task StorageReplicatedMergeTree::getDataProcessingJob selectQueueEntry queue.selectEntryToProcess // 從queue中選擇可以執行的log entry processQueueEntry // 處理隊列中的任務 processEntry executeLogEntry // 如果當前entry指定的part在本節點上,則return,否則從副本fetch executeFetch // 找到一個有該part的副本就可以 fetchPart fetcher.fetchPart // 通過http獲取具體數據 removeProcessedEntry // 刪除zk上的隊列
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。