Clickhouse源码分析:ALTER TABLE xxx MODIFY COLUMN yyy流程分析

举报
ZhjDayDayUp 发表于 2021/11/26 10:58:06 2021/11/26
【摘要】 代码基于21.3.4.25-lts版本,简要分析了ALTER TABLE修改列时的代码流程

代码基于21.3.4.25-lts版本


非复制表

# 非复制表
StorageMergeTree::alter
    setProperties // 内存中修改元数据
    alterTable // 修改元数据文件
    startMutation // 确定blocknum,即partname中的mutation的值,添加mutation_blocknum.txt
        background_executor.triggerTask // 后台线程处理merge或者mutate
            selectPartsToMutate
            mutateSelectedPart
                mutatePartToTemporaryPart
                renameTempPartAndReplace
                updateMutationEntriesErrors // 更新状态,并通知mutate完成
    waitForMutation // 等待数据变更结束

复制表

# 复制表
# 复制表的创建,这里主要创建几个重要的监控线程
StorageReplicatedMergeTree::StorageReplicatedMergeTree
    queue // 表的队列,保存了需要处理的操作
    restarting_thread // 重连zk的线程,保证能够一直连接zk ReplicatedMergeTreeRestartingThread::run
        // run -> tryStartup -> cloneReplicaIfNeeded -> cloneReplica 流程会将副本的数据同步到此节点
    queue_updating_task // 队列更新任务,监控zk上的log,将它们加载到queue中
    mutations_updating_task // mutations更新任务,监控zk上的mutations节点。 mutationsUpdatingTask
    merge_selecting_task // 选择part进行merge或者mutate的任务
    background_executor // 后台处理队列的线程

# 复制表执行alter入口    
StorageReplicatedMergeTree::alter
    makeSetRequest // 更新zk上的元数据和列信息
    new_metadata_version = metadata_version + 1; // 确定元数据的版本
    allocateBlockNumbersInAffectedPartitions // 根据zk的自增特性,得到blocknumber。在alter和mutate中,该值用于表示mutation的值
    makeCreateRequest // 在zk的log节点创建新的entry,内容为ReplicatedMergeTreeLogEntryData,类型为ALTER_METADATA
    makeCreateRequest // 在zk的mutations节点下创建entry,内容为ReplicatedMergeTreeMutationEntry
    if replication_alter_partitions_sync == 2 // 等待所有的副本处理结束
        waitForAllReplicasToProcessLogEntry
    if replication_alter_partitions_sync == 1 // 等待本节点处理结束,默认为1
        waitForReplicaToProcessLogEntry // 根据log_pointer判断是否将对应log送到队列,根据queue下的节点是否消失来判断是否处理结束。注意,这时只是元数据的变更,因为log类型是ALTER_METADATA
            getZooKeeper()->waitForDisappear
    waitMutation // 由于前面的等待,元数据已经变更结束,此时等待数据处理结束
    
# mutations更新任务
StorageReplicatedMergeTree::mutationsUpdatingTask
    ReplicatedMergeTreeQueue::updateMutations // 根据zk的mutations节点,刷新mutations_by_znode和mutations_by_partition

# 选择part进行merge或者mutate的任务
StorageReplicatedMergeTree::mergeSelectingTask
    mutations_by_znode.size() > 0
        createLogEntryToMutatePart // 只有zk的parts节点下有part才会进行mutate
        makeCreateRequest // 在zk的log下创建entry,内容为ReplicatedMergeTreeLogEntryData,类型为MUTATE_PART
        
# 队列更新线程 queueUpdatingTask,也就是log entry的监控线程
ReplicatedMergeTreeQueue::pullLogsToQueue // 监控zk上是否有新的log产生
    makeCreateRequest // 将log的内容放到zk上的/queue节点下
    insertUnlocked // 在queue中新增当前entry

# 队列任务处理进程 scheduling_task
StorageReplicatedMergeTree::getDataProcessingJob
    selectQueueEntry
        queue.selectEntryToProcess // 从queue中选择可以执行的log entry
            ReplicatedMergeTreeQueue::shouldExecuteLogEntry
    processQueueEntry // 处理队列中的任务
        processEntry
            executeLogEntry // 先更新元数据,后更新数据
                // 如果该part已经被覆盖,则返回true,该过期内容会被removeProcessedEntry删除。针对GET_PART,MERGE_PARTS,MUTATE_PART
                if entry.type == LogEntry::ALTER_METADATA // 更新元数据
                    executeMetadataAlter
                        setTableStructure
                            setProperties
                            alterTable // 如DatabaseOrdinary::alterTable
                if entry.type == LogEntry::MUTATE_PART // 更新数据
                    tryExecutePartMutation
                        mutatePartToTemporaryPart
                        renameTempPartAndReplace
            removeProcessedEntry // 删除zk上的队列,即queue节点下的内容。也会删除内存中队列的一些信息
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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