概述
本文主要为大家介绍ClickHouse三板斧(集群、副本与分片)
集群
集群是副本和分片的基础,它将ClickHouse的服务拓扑由当前节点延伸到多个节点,但它并不像Hadoop生态某系统那样,要求所有节点组成一个单一的大集群(服务级别)。ClickHouse的集群配置比较灵活,用户既可以组成一个单一集群,也可以按照业务划分为多个小集群(表级别),它们的节点、副本和分片数量可各不相同。
从作用来看,ClickHouse集群的工作可以理解为是针对逻辑层面的,而执行层面的具体工作则交给副本和分片来执行。
区别
简言之,副本与分片区分可以理解为,副本间的数据是完全相同,而分片间的数据是不同的,如下:
数据副本
描述
MergeTree + Replicated即可理解为支持数据副本,两者逻辑关系如下:
在MergeTree中,一个数据分区由开始创建到全部完成,会历经两类存储区域。
-
内存:数据首先会被写入内存缓存区。
-
本地磁盘:数据接着会被写入tmp临时目录分区,待全部完成后再将临时目录重命名为正式分区。
ReplicatedMergeTree只是在此基础上添加了Zookeeper的部分,这里并不会涉及表数据的传输。
特点
- 依赖Zookeeper,主要借助ZK的分布式协同能力
- 表级别的副本,包括副本的数量、集群内分布位置等
- 多主架构,即在任意副本上执行INSERT和ALTER查询效果是一致的
- Block数据块,这是数据写入的基本单位,具有写入的原子性和唯一性
- 原子性,要么全部成功,要么全部失败
- 唯一性,会按数据顺序、数据大小和数据行等指标Hash,重复则忽略
定义形式
ENGINE = ReplicatedMergeTree(’/clickhouse/{cluster}/tables/dwd_shard/dw_user_tag_all/{layer}’, ‘{replica}’)
其中主要包括两部分:zk_path和replica_name
- zk_path,数据表路径,名称可自定义(同一张表的同一分片的不同副本,应该定义相同的路径)
- replica_name,副本名称(同一张表的同一分片的不同副本,应该定义不同的名称)
ReplicatedMergeTree 原理
数据结构
ReplicatedMergeTree的核心逻辑主要都是运用ZK的能力,包括副本协同、主副本选举、状态感知、操作日志分发、任务队列、BlockID去重判断等
元数据
- /metadata: 保存元数据信息,包括主键、分区键、采样表达式等
- /columns: 保存列字段信息,包括列名称和数据类型
- /replicas: 保存副本名称
判断标识
- /leader_election: 用于主副本选举工作,主副本会主要MERGE 和 MUTATION操作
- /blocks: 记录Block数据块的Hash信息摘要及对应的partition_id
- /blocks_numbers: 按分区的写入顺序以相同的顺序记录partition_id
- /quorum: 记录quorum的数量,由insert_quorum参数控制,默认值0
操作日志
- /log: 常规操作日志节点(INSERT、MERGE 和 DROP PARTITION)
- /mutations: MUTATION操作日志节点,与log日志类似(ALTER DELETE 和 ALTER UPDATE查询)
- /replicas/{replica_name}/*: 每个副本各自节点的一组监听节点,指导副本在本地执行具体任务指令
- /queue: 任务队列节点,执行具体的操作任务
- /log_pointer: log日志指针节点,记录最后一次执行log日志的下标信息
- /mutation_pointer: mutations日志指针节点,记录最后一次执行mutations日志的下标信息
Entry对象
上述提到的/log 和 /mutations 节点在CK中被统一的抽象为Entry对象,具体实现则由LogEntry 和 MutationEntry对象承载
- LogEntry: 核心属性包括source replica,type,block_id,partition_name
- MutationEntry: 核心属性包括source replica,commands,mutation_id,partiltion_id
副本协同
核心流程主要INSERT、MERGE、MUTATION和ALTER四种,分别对应数据写入、分区合并、数据修改和元数据修改。
备注:以下执行主要按1分片、1副本讲解,若大于1个副本的场景流程可类推
INSERT执行流程
备注:
- CK1被选举为主副本
- 在写入过程中,ZK不会进行任何实质性的数据传输,本着谁执行谁负责的原则
MERGE执行流程
备注:
- 分区合并时,无论MERGE操作从哪个副本发起,都将由主副本来制定
- 分区合并时,主副本会锁住执行线程,监听可由replication_alter_partitions_sync参数控制,默认值为1,即只等待主副本