Clickhouse源码分析:复制表数据的同步原理

举报
ZhjDayDayUp 发表于 2021/11/25 20:01:57 2021/11/25
【摘要】 代码基于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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。