ClickHouse系列之集群副本与分片

概述

​ 本文主要为大家介绍ClickHouse三板斧(集群、副本与分片)

集群

​ 集群是副本和分片的基础,它将ClickHouse的服务拓扑由当前节点延伸到多个节点,但它并不像Hadoop生态某系统那样,要求所有节点组成一个单一的大集群(服务级别)。ClickHouse的集群配置比较灵活,用户既可以组成一个单一集群,也可以按照业务划分为多个小集群(表级别),它们的节点、副本和分片数量可各不相同。

​ 从作用来看,ClickHouse集群的工作可以理解为是针对逻辑层面的,而执行层面的具体工作则交给副本和分片来执行。

区别

​ 简言之,副本与分片区分可以理解为,副本间的数据是完全相同,而分片间的数据是不同的,如下:
在这里插入图片描述

数据副本

描述

​ MergeTree + Replicated即可理解为支持数据副本,两者逻辑关系如下:
在这里插入图片描述

​ 在MergeTree中,一个数据分区由开始创建到全部完成,会历经两类存储区域。

  1. 内存:数据首先会被写入内存缓存区。

  2. 本地磁盘:数据接着会被写入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执行流程

在这里插入图片描述

备注:

  1. CK1被选举为主副本
  2. 在写入过程中,ZK不会进行任何实质性的数据传输,本着谁执行谁负责的原则
MERGE执行流程

在这里插入图片描述

备注:

  1. 分区合并时,无论MERGE操作从哪个副本发起,都将由主副本来制定
  2. 分区合并时,主副本会锁住执行线程,监听可由replication_alter_partitions_sync参数控制,默认值为1,即只等待主副本
MUTATION执行流程

在这里插入图片描述

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值