clickHouse副本和同步机制
文章目录
- 1. 副本的基本概念
- 1. 1 什么是副本
- 1. 2 副本写入流程简单示例
- 1. 3 多副本的配置
- 1. 4 clickhouse创建副本表
- 2. 副本同步原理
- 2.1 clickhouse目录
- 2.2 ClickHouse在zk的目录结构
- 2.3 副本同步
- 2.4 副本间merge同步
了解clickhouse底层的多副本模式和副本数据同步机制,需要对clickhouse的基础以及clickhouse的分布式表以及分区表有一定的了解,具体可以参考我之前的文章:
clickHouse接入指南和排坑日记
clickHouse分区和分片详解
clickHouse本地表和分布式表
1. 副本的基本概念
1. 1 什么是副本
副本的目的主要是保障数据的高可用性,即使一台ClickHouse节点宕机,那么也可以从其他服务器获得相同的数据。
1. 2 副本写入流程简单示例
client通过jdbc或者http的方式进行clickhouse-01节点的本地表(写分布式表的时候,数据会进行拆分进而分发到多个本地表)写数据的时候,提交写入日志给zookeeper,clickhouse-02有一个监听器来监听zookeeper接收到日志之后从clickhouse-01中下载数据。
1. 3 多副本的配置
ClickHouse配置zookeeper和多副本参考这个
1. 4 clickhouse创建副本表
之前创建分布式表和本地表的时候,我们使用了MergeTree家族引擎,而创建分布式表,只需要在前面加上Replicated就成了支持副本的合并树引擎。
CREATE TABLE IF NOT EXISTS ka_10002538_f83b454416104dbfa083369f35759549.tmc_sms_url_click_local
on cluster clickhouse_csig_smartretail_2_replica
(`kaId` String, `create_time` String, `os` String, `ipCity` String, `ip` String, `dataType` String,`receive_time` Int64, `mobile` String, `contentId` String, `ipCountry` String, `batchId` String, `import_date` String, `path` String, `osVersion` String, `report_time` Int64, `domain` String, `browserVersion` String, `browser` String, `customerId` String, `ipProvince` String, `model` String, `tmcTenantId` String, `timestamp` Float64, `campaign` String, `campaignName` String) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/ka_10002538_f83b454416104dbfa083369f35759549/tmc_sms_url_click_local', '{replica}') PARTITION BY import_date ORDER BY import_date
基于副本表去创建分布式表和MergeTree一样,如下:
CREATE TABLE IF NOT EXISTS ka_10002538_f83b454416104dbfa083369f35759549.tmc_sms_url_click on cluster
clickhouse_csig_smartretail_2_replica
(`kaId` String, `create_time` String, `os` String, `ipCity` String, `ip` String, `dataType` String, `receive_time` Int64, `mobile` String, `contentId` String, `ipCountry` String, `batchId` String, `import_date` String, `path` String, `osVersion` String, `report_time` Int64, `domain` String, `browserVersion` String, `browser` String, `customerId` String, `ipProvince` String, `model` String, `tmcTenantId` String, `timestamp` Float64, `campaign` String, `campaignName` String)
ENGINE = Distributed('clickhouse_csig_smartretail_2_replica', 'ka_10002538_f83b454416104dbfa083369f35759549', 'tmc_sms_url_click_local', rand())
2. 副本同步原理
2.1 clickhouse目录
table_name #表名
├─ partition_minBolckNum_maxBlockNum_level_total #某个分区下的data parts目录
│ │ # 基础文件
│ ├─ checksums.txt BIN #各类文件的尺寸以及尺寸的散列
│ ├─ columns.txt TXT #列信息
│ ├─ count.txt TXT #当前分区目录下数据总行数
│ ├─ primary.idx BIN #稀疏索引文件,常驻内存中
│ ├─ {column}.bin BIN #经压缩的列数据文件,以字段名命名
│ ├─ {column}.mrk BIN #列字段标记文件
│ ├─ {column}.mrk2 BIN #使用自适应索引间隔的标记文件
│ │
│ │ # 分区键文件
│ ├─ partition.dat BIN #当前分区表达式最终值
│ ├─ minmax_{column}.idx BIN #当前分区字段对应原始数据的最值
│ │
│ │ # 跳数索引文件
│ ├─ skp_idx_{column}.idx BIN #跳数索引文件
│ └─ skp_idx_{column}.mrk BIN #跳数索引表及文件
│
└─ partition_minBolckNum_maxBlockNum_level_total #某个分区下的data parts目录
max_compress_block_size
在压缩写入表之前,未压缩数据块的最大大小。 默认情况下,1,048,576(1MiB)。 如果大小减小,则压缩率显着降低,压缩和解压缩速度由于高速缓存局部性而略微增加,并且内存消耗减少。 通常没有任何理由更改此设置。不要将用于压缩的块(由字节组成的内存块)与用于查询处理的块(表中的一组行)混淆。min_compress_block_size
为 MergeTree"表。 为了减少处理查询时的延迟,在写入下一个标记时,如果块的大小至少为 ‘min_compress_block_size’. 默认情况下,65,536。块的实际大小,如果未压缩的数据小于 ‘max_compress_block_size’,是不小于该值且不小于一个标记的数据量。让我们来看看一个例子。 假设 ‘index_granularity’ 在表创建期间设置为8192。我们正在编写一个UInt32类型的列(每个值4个字节)。 当写入8192行时,总数将是32KB的数据。 由于min_compress_block_size=65,536,将为每两个标记形成一个压缩块。我们正在编写一个字符串类型的URL列(每个值的平均大小60字节)。 当写入8192行时,平均数据将略少于500KB。 由于这超过65,536,将为每个标记形成一个压缩块。 在这种情况下,当从单个标记范围内的磁盘读取数据时,额外的数据不会被解压缩。通常没有任何理由更改此设置。
2.2 ClickHouse在zk的目录结构
- metadata:存的是表的元数据信息,主键,分区键,index_granularity(索引粒度 mark标记的行);
- temp:临时目录,用于存储ck工作时的一些临时文件的存储,比如mutation过程等;
- mutations:记录数据的变更,除了表结构相关ddl之外,更新和删除异步执行的批处理操作也会记录在这里;
- log:每一个insert语句,都会生成一个data parts,对应的是一个block,block_id规则是PartitionID_MinBlockNum_MaxBlockNum_Level,然后会记录到log目录下,副本同步也是监听这个目录的变动去同步拉data parts;
- leader_election:这里包含所有可用的副本,决定哪个副本作为主副本,查询时优先选择该副本,节点是leader_election-xxxx这种格式,这些副本信息都是临时节点,如果实例异常,会自动删除,如果实例恢复,会再次写入;
- columns:存储了该表的所有列信息,列名和类型;
- blocks:最新的PartitionID对应的所有block记录,命名格式PartitionID_MinBlockNum_MaxBlockNum_Level,partitionID由分区键(PARTITION BY)的取值决定,最好设计为日期类型。blockNum是每个分区按照日期自增长的,level是合并的次数和深度,最终的block数据保存在system.clusters,格式是20211123_0_1200_30_4500,前面四个参数含义一样,最后一个参数,代表当前分区的总的blockNum数量,可以通过
SELECT partition, name, table, database ,active FROM system.parts WHERE partition = '20211122' and table = 'table_name'
查看;
2.3 副本同步
ReplicatedMergeTree 需要依靠 ZooKeeper 的事件监听机制以实现各个副本之间的协同,副本协同的核心流程主要有:INSERT、MERGE、MUTATION 和 ALTER 四种。副本之间依靠 ZooKeeper 同步元数据,保证文件存储格式完全一致,可以理解这种方式是物理一致。同时, 副本间数据的同步,通过监听log目录,从对应有数据的副本拉取data parts到本地。
2.4 副本间merge同步
同分片下不同副本merge流程通过zookeeper来协调,不然各副本并发merge容易乱套,各个分片merge流程一样,互不影响,并行merge
- 不管谁接收到请求,都由主副本来发起merge计划,20.5 之后没有主的概念了;
- 把计划推到zookeeper,各个副本监听,一起执行,如果发现自己没有某些part会从别的副本拉取。
clickHouse副本和同步机制相关推荐
- 18_clickhouse副本同步与高可用功能验证,分布式表与集群配置,数据副本与复制表,ZooKeeper整合,创建复制表,副本同步机制,数据原子写入与去重,负载平衡策略,案例(学习笔记)
24.副本同步与高可用功能验证 24.1.分布式表与集群配置 24.2.数据副本与复制表 24.3.ZooKeeper整合 24.4.创建复制表 24.5.副本同步机制 24.6.数据原子写入与去重 ...
- Kafka副本同步机制
一.Kafka副本同步机制 Kafka中topic的每个partition有一个预写式日志文件,每个partition都由一系列有序的.不可变的消息组成,这些消息被连续的追加到partition中,p ...
- kafka:replica副本同步机制
1 前言 Kafka的流行归功于它设计和操作简单.存储系统高效.充分利用磁盘顺序读写等特性.非常适合在线日志收集等高吞吐场景. Kafka特性之一是它的复制协议.复制协议是保障kafka高可靠性的关键 ...
- 【clickhouse】clickhouse 副本与分片 分片详解
1.概述 转载:[clickhouse]clickhouse 副本与分片 分片详解 clickhouse 中每个服务器节点都可以被称为一个 shard(分片). 假设有 N 台服务器,每个服务器上都有 ...
- Java线程同步机制synchronized关键字的理解
由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问. 需要明确的几个问题: ...
- 双NameNode的同步机制
前言:Hadoop2.0中基于JournalNode的双NameNode的元数据同步机制 日志节点(JournalNode)的概念及作用 JournalNode是HA集群(高可用集群,HighAvai ...
- Java的synchronized关键字:同步机制总结
不久前用到了同步,现在回过头来对JAVA中的同步做个总结,以对前段时间工作的总结和自我技术的条理话.JAVA的synchronized关键字能够作为函数的修饰符,也可作为函数内的语句,也就是平时说的同 ...
- 数据一致性-分区可用性-性能—多副本强同步数据库系统实现之我见
本文将跳出任何一种数据库,从原理的角度上来分析下面的几个问题: 问题一:数据一致性.在不使用共享存储的情况下,传统RDBMS(例如:Oracle/MySQL/PostgreSQL等),能否做到在主库出 ...
- ThreadLocal和线程同步机制的对比
ThreadLocal和线程同步都是为了解决多线程中相同变量的访问冲突问题,那么,二者的区别在哪里?和线程同步机制对比,ThreadLocal有什么优势? 同步机制中通过对象的锁机制保证同一时间只有一 ...
最新文章
- OpenCV 【一】—— OpenCV中数组指针、图像分块计算、指针取像素值与MatToEigen方法,内存对齐
- 选本还是从缓存设计理念选择更好
- python找列表list中某个数对应的索引值
- 网页打不开,却能上qq,何解?
- 经典C语言程序100例之七七
- 连接相机无法识别_春节用相机拍照,如何快速发朋友圈?
- Linux下grub.cnf详解
- java关于excel的导出_[转载]关于JAVA导出Excel
- Android开发之修改Chrome书签
- OSChina 周日乱弹 ——不穿泳衣,我都不好意思上厕所
- 【Oracle】append
- mac 查看环境变量_Mac开工利器Homebrew介绍
- linux 编辑文件 cat 跳到指定行,Linux文件操作详解(八)--文件的创建和编辑(vi/vim命令和cat命令)...
- DM 跟踪日志及ET
- 用ubantu14.04登录吉大校园网
- 面试官:说说你最大的优缺点? (25题汇总版)
- 新买笔记本屏幕缝隙有灰尘_如何清除笔记本电脑上的灰尘
- 行业如此内卷,品牌如何实现可持续招商增长?
- 通过聚合数据API实现快递数据查询-短信验证码-企业核名
- ICCAVR注释乱码