Clickhouse源码分析:复制表数据的同步原理
【摘要】 代码基于21.3.4.25-lts版本,本文以复制表insert的流程为例,讲述在一个副本中插入数据,是怎么将数据同步到另外一个副本。
代码基于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上的队列
从上述流程可以看出,某个副本在写数据的时候,会向zk上写log,而其它副本监控zk上的log,只要有更新,就会根据对应的操作,将数据同步过来。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)