副本与分片

  • 一、概述
  • 二、集群
  • 三、副本
  • 四、Zookeeper 配置方式
  • 五 、定义方式
  • 六、ReplicatedMergeTree 原理解析
  • 七、生成一个适合你的列表


一、概述

特点:
1、依赖ZooKeeper
2、表级别的副本
3、多主架构,可以在任意副本执行写入和修改
4、Block数据分块(1048576)
5、原子性,单个block内数据,要么全部成功,要么全部失败
6、唯一性 ,单个Block 按照顺序,数据行和大小 计算Hash值,保证唯一性

二、集群

单集群 多集群

三、副本

ReplicatedMergeTree 复制表;在MergeTree 的基础上增加了分布式协同的能力

内存 =》文件系统(本地磁盘) =》zk logEntry(多个实例间通讯,并不包含数据的同步) =》ReplicatedMergeTree(需要同步副本的服务器)

四、Zookeeper 配置方式

查询zookeeper内的数据信息:
select * from system.zookeeper where path=’/clickhouse’

五 、定义方式

ENGINE=ReplicatedMergeTree(‘zk_path’,‘replica_name’)
例如:ENGINE = ReplicatedMergeTree(’/clickhouse/tables/{layer}-{shard}/heaven_eye_event_log/app_crash_log’, ‘{replica}’)
/clickhouse/tables/:固定前缀
{shard} :分片编号
heaven_eye_event_log:数据表名称## 插入链接与图片

六、ReplicatedMergeTree 原理解析

1、数据结构
运用Zk的能力来实现过个副本之间的协同;
(1)主 副本选举、副本状态感知、操作日志分发、任务队列、BlockID去重
(2)通讯过程中不涉及任务数据的传输

七、生成一个适合你的列表

1、数据结构
运用Zk的能力来实现过个副本之间的协同;
(1)主 副本选举、副本状态感知、操作日志分发、任务队列、BlockID去重
(2)通讯过程中不涉及任务数据的传输
2、ZK内部的节点结构
(1)元数据
/metadata 保存元数据信息,主键,分区键,采样表达式等
/columns 保存列字段信息,包括列名称和数据类型
/replicas 保存副本名称,对应设置参数中的replica_name
(2)判断标识
/leader_election:用于主副本的选举工作,主副本主导merge,mutation(alter delete、alter update等)
主副本执行结束后通过zk消息同步到其他副本执行
/blocks:记录block信息块的Hash信息摘要,以及对应的partition_id.可以判断block 是否重复,通过partition_id找到对应的分区
/block_numbers 按照分区写入顺序,以相同的顺序记录partition_id;副本在本地merge时,依照此顺序
/qorum 记录数量,当至少quorum数量副本写入成功后,才算写入成功;默认为0
(3)操作日志
/log 常规操作日志
保存副本需要执行的指令,使用 zk的持久顺序形节点,每条以log为前缀,新指令加入时,加入副本各自的任务队列
/mutations 操作日志节点,作用与log 类似 保存 alter delete 、alter update指令
/replicas/{replica_name}/*
每个副本各自监听节点下的一组监听节点,指导副本在本地执行具体的指令,其中重要的有
/queue 任务队列节点,监听到 /log 或者 /mutations 节点的指令后,将执行任务添加到该节点下,并基于队列执行
/log_pointer
针对节点,记录最后一次执行log日志下表信息
/nutation_pointer
针对节点,记录了最后一次mutations的日志名称
3、entry日志对象的数据结构
ReplicatedMergeTree 在 zk中有两组非常重要的父节点,/log 和 /mutations
(1)它的作用类似通信塔,分发操作指定信息通道,方式为父节点添加子节点
(2)所有副本都会监听父节点的变化,当有父节点添加子节点时,副本会实时感知
(3)在ClickHouse中这些节点,被统一抽象为Entry对象 logEntry 和 mutationsEntry
logEntry:
(3.1)source replica 副本来源 对应 replica_name
(3.2)type 指令类型 get,merge,mutate 从远程副本下载分区、合并分区
(3.3)block_id 当前分组的blockId 对应 /blocks 路径下的子节点名称
(3.4)partition_name 当前分区目录的名称
mutationEntry:
封装/mutations的子节点信息
(3.1)source replica 副本来源 对应 replica_name
(3.2)commands 操作指令 alter delete 和 alter update指令
(3.3)mutation_id 操作的版本号
(3.4)partition_id 分区的目录ID
4、副本协同的核心流程
insert merge mutation alter 四种

insert alter 分布式执行 借助zk的事件通知机制自动执行有效的协同

select create drop rename attach 不支持分布式执行,需要用其他技巧实现(on cluster cluster_name)

(4.1)insert 的核心流程
分为8个步骤
(4.1.1)创建第一个副本实例
create … engin = ReplicatedMergeTree
1.根据 zk path 初始化zk节点,
2.注册副本实例 ,
3.启动监听任务,监听 /log 日志节点
4.参与主副本节点,
5.向 /leader_election/ 插入子节点,第一个插入成功的副本就是主副本
(4.1.2)创建第二个副本实例
1.在/replicas/ 节点下注册副本实例
2.启动监听任务,监听 /log 日志节点
3.参与副本选举
(4.1.3)向第一个副本实例写入数据
可以设置至少写入的副本数,默认为0
(4.1.4)由第一个副本实例推送Log日志·
向/log/节点推送日志
(4.1.5)第二个副本实例拉取Log日志
队列的形式消费 logEntry
(4.1.6)第二个副本实例向其他副本发起下载请求
(4.1.7)第一个副本实例响应数据下载
(4.1.8)第二个副本实例下载数据并完成本地写入