ClickHouse的副本协同以及分布式DDL实现

ClickHouse的副本协同以及分布式查询是借助zk实现的,首先介绍下zk的目录结构

zk目录结构

zk在系统表中,提供了一张名为zookeeper的代理表,需要指定路径去查询。在定义ReplicatedMergeTree时,定义的zk_path路径一般为 /clickhouse/tables/{shard}/table_name ,这也是查询zk的路径。

csharp 复制代码
select name,value from system.zookeeper where path='/clickhouse/'
┌─name───────┬─value─┐
│ tables     │       │
│ task_queue │       │
└────────────┴───────┘
sql 复制代码
select name,value from system.zookeeper where path='/clickhouse/tables/cdncld_raw_log/01/'
┌─name───────────────────────┬─value──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ metadata                   │ metadata format version: 1
date column: 
sampling expression: 
index granularity: 8192
mode: 0
sign column: 
primary key: msec
data format version: 1
partition key: date
ttl: date + toIntervalDay(7), date TO VOLUME 'hot', date + toIntervalHour(12) TO VOLUME 'cold'
granularity bytes: 10485760
 │
│ temp                       │                                                                                                                                                                                                                                                            │
│ mutations                  │                                                                                                                                                                                                                                                            │
│ log                        │                                                                                                                                                                                                                                                            │
│ leader_election            │                                                                                                                                                                                                                                                            │
│ columns                    │ columns format version: 1
82 columns:
`time_iso8601` String
`msec` Float64
`request_id` String
 │
│ blocks                     │                                                                                                                                                                                                                                                            │
│ nonincrement_block_numbers │                                                                                                                                                                                                                                                            │
│ replicas                   │ last added replica: xxx.com                                                                                                                                                                                                        │
│ quorum                     │                                                                                                                                                                                                                                                            │
│ block_numbers              │                                                                                                                                                                                                                                                            │
└────────────────────────────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
yaml 复制代码
select name,value from system.zookeeper where path='/clickhouse/tables/cdncld_raw_log/01/replicas/xxx.com/'
┌─name────────────────────────┬─value──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ is_lost                     │ 0                                                                                                                                                                                                                                                          │
│ metadata                    │ metadata format version: 1
date column: 
sampling expression: 
index granularity: 8192
mode: 0
sign column: 
primary key: msec
data format version: 1
partition key: date
ttl: date + toIntervalDay(7), date TO VOLUME 'hot', date + toIntervalHour(12) TO VOLUME 'cold'
granularity bytes: 10485760
 │
│ is_active                   │ pid: 12005, random: 8517042718945254648                                                                                                                                                                                                                    │
│ mutation_pointer            │                                                                                                                                                                                                                                                            │
│ columns                     │ columns format version: 1
82 columns:
`time_iso8601` String
`msec` Float64
`request_id` String
 │
│ max_processed_insert_time   │ 1696750235                                                                                                                                                                                                                                                 │
│ flags                       │                                                                                                                                                                                                                                                            │
│ log_pointer                 │ 137394089                                                                                                                                                                                                                                                  │
│ min_unprocessed_insert_time │ 1688372142                                                                                                                                                                                                                                                 │
│ host                        │ host: xxx.com
port: 9009
tcp_port: 9000
database: default
table: cdncld_raw_log
scheme: http
                                                                                                                                             │
│ parts                       │                                                                                                                                                                                                                                                            │
│ queue                       │                                                                                                                                                                                                                                                            │
│ metadata_version            │ 0                                                                                                                                                                                                                                                          │
└─────────────────────────────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

目录结构解析参考:blog.csdn.net/weixin_3999...

副本协同流程

副本之间的协同,包括:主副本选举,副本状态感知,操作日志分发,任务队列和BlockID去重判断。

操作日志的目录

  • /log: 常规操作日志节点(INSERT、MERGE和DROP PARTITION),它是整个工作机制中最为重要的一环。保存了副本需要执行的任务指令。log使用了Zookeeper的持久顺序型节点,每条指令的名称以log-为前缀递增,利用log-0000000000、log-0000000001等。每一个副本实例都会监听/log节点,当有新的指令加入时,它们会把指令加入副本各自的任务队列,并执行任务。

  • /mutations: MUTATION操作日志节点,作用与log日志类似,当执行ALTER DELETE和ALTER UPDATE查询时,操作指令会被添加到这个节点。mutations同样使用了Zookeeper的持久顺序型节点,但是它的命名没有前缀,每条指令直接以递增数字的形式保存,例如0000000000、0000000001等。

  • /replicas/{replica_name}/*: 每个副本各自的节点下的一组监听节点,用于指导副本在本地执行具体的任务指令,其中较为重要的节点有如下几个:

    • /queue:任务队列节点,用于执行具体的操作任务。当副本从/log或/mutations节点监听到操作指令时,会将执行任务添加到该节点下,并基于队列执行

    • /log_pointer:log日志指针节点,记录了最后一次执行的log日志下标信息,例如log_pointer:4对应log/log-0000000003

    • mutation_pointer:mutations日志指针节点,记录了最后一次执行的mutations日志名称,例如mutation_pointer:0000000000对应了/mutations/0000000000。

INSERT的核心执行流程

在写入数据时首先完成本地分区的写入:

ruby 复制代码
2023.10.08 16:23:31.460517 [ 2913 ] {} <Trace> system.query_thread_log (3931f3f0-2a3d-4f59-
88bc-fb82d704936f): Renaming temporary part tmp_insert_202310_1838766_1838766_0 to 
202310_1943328_1943328_0.

接着向/blocks节点写入该分区的block_id,这个block_id作为后续去重的判断依据。

分布式DDL

分布式DDL在ck中的存储路径为:/clickhouse/task_queue/ddl,每执行一次分布式查询,就在这个目录下增加一条日志,前缀为query-xxx,序号递增。下面一级目录 /active 存储尚未执行完成此任务的节点host,/finished 存储已经执行完成此任务的节点host。当各个节点监听到有新日志时,就执行操作。

相关推荐
Sinokap2 分钟前
Gemini 3 Flash:在速度、成本与前沿智能之间的平衡
大数据·人工智能
SpaceAIGlobal5 分钟前
基于 Elasticsearch 实现排序沉底与前置的方法解析
大数据·elasticsearch·搜索引擎
Hello.Reader12 分钟前
Hadoop Formats 在 Flink 里复用 Hadoop InputFormat(flink-hadoop-compatibility)
大数据·hadoop·flink
视***间19 分钟前
视程空间AIR算力开发平台:以边缘智能之核,驱动机器人产业迈入全域自动化时代
大数据·人工智能·机器人·区块链·边缘计算·视程空间
J_liaty21 分钟前
前后端跨域处理全指南:Java后端+Vue前端完整解决方案
java·前端·vue.js·spring boot·后端
颜淡慕潇23 分钟前
深度解读 Spring Boot 3.5.9— 工程视角的稳健演进与价值释放
java·spring boot·后端·spring
invicinble24 分钟前
认识es的多个维度
android·大数据·elasticsearch
玄微云24 分钟前
从混乱到高效:2026年玄微科技如何重塑孕产门店运营?
大数据·科技·物联网·门店管理·产康门店
玄〤28 分钟前
黑马点评中的分布式锁设计与实现(Redis + Redisson)
java·数据库·redis·笔记·分布式·后端
码界奇点28 分钟前
基于SpringBoot与Shiro的细粒度动态权限管理系统设计与实现
java·spring boot·后端·spring·毕业设计·源代码管理