基础知识学习
https://blog.csdn.net/qq_35423190/category_11987679.html
带着问题学习Clickhouse
建一个分布式表之后,还要在每个节点建一个本地表与之对应?
是的,只要在一个节点上运行sql就行了,不用连接每个节点运行sql建表,建表方式如下:
创建本地表
# 3分片0副本
CREATE TABLE test_bdp.test_BDP_3S_0R_local ON CLUSTER bdp_3S_0R (
id UInt64
)ENGINE = MergeTree()
ORDER BY id
PARTITION BY id;
创建分布式表
# 3分片0副本分布式表
CREATE TABLE test_bdp.test_BDP_3S_0R_all ON CLUSTER bdp_3S_0R (
id UInt64
)ENGINE = Distributed(bdp_3S_0R, test_bdp, test_BDP_3S_0R_local, rand())
SETTINGS fsync_after_insert=1, fsync_after_insert=0;
ReplicatedMergeTree+Distributed的集群模式下,创建一个表,分布式表和本地表元数据存储在哪里,数据是怎么分布的?
- 在每个节点都会存储本地表和分布式表元数据信息,
- 分布式表本身不存储任何数据,它是本地表的访问代理,包含其下所有本地表信息
- 本地表存储不同分片下不同副本的数据,表的数据是先分片,每个分片下数据可以有多个副本
ReplicatedMergeTree+Distributed的集群模式下,shard和cluster关系是怎样的?
- 一个逻辑集群(cluster)配置多个shard
- 每个shard可以包含1个或多个副本
- 每个副本都在一个物理节点上,这个物理节点上的本地表存储的数据就是某个表的某个分片的某个副本数据
- 这个逻辑集群下的所有分布式表的数据都是按照统一配置好的规则进行存储,逻辑集群配置规则如下:
<!-- 集群配置 -->
<clickhouse_remote_servers>
<!-- 集群名称,可以修改 -->
<cluster_2shards_1replicas>
<!-- 配置2个分片,每个分片对应2台机器,即2个副本-->
<shard>
<replica>
<host>10.8.5.231</host>
<port>9000</port>
</replica>
<replica>
<host>10.8.5.232</host>
<port>9000</port>
</replica>
</shard>
<shard>
<replica>
<host>10.8.5.233</host>
<port>9000</port>
</replica>
<replica>
<host>10.8.5.234</host>
<port>9000</port>
</replica>
</shard>
</cluster_2shards_1replicas>
</clickhouse_remote_servers>
数据分区和分片区别:
数据分区是针对本地数据而言的,是数据的一种纵向切分,在建表时配置。
数据分片是对分布式表数据的横向切分,在配置逻辑集群时配置
如果某个逻辑集群 节点数据存满了,怎么扩容?扩容之后,需要修改配置吗?
- 每个节点增加分片配置,配置完之后需要重启 ck server节点
- 复制元数据到新节点,直接在新节点上创建该逻辑集群所有的表
- 如果数据写入是通过Nginx路由写入的,需要在nginx上添加新分片的所有节点ip
实施案例如:https://blog.csdn.net/weixin_37692493/article/details/114003547
Clickhouse集群中各个节点元数据一致性问题,怎么解决的?
主要通过zk
ck冷备到S3 是过期的数据就自动转移,还是需要人工移动
配置策略,自动转移
对ck文件中的标记文件是怎么理解的?
每一个列字段都包含一个[Column].bin文件和一个与之对应的[Column].mrk数据标记文件,标记文件主要用于记录数据在.bin文件中的偏移量信息
标记文件并不能常驻内存,而是使用LRU(最近最少使用)缓存策略缓存加快其取用速度
标记文件按照 index_granularity 的粒度间隔来编号存储,文件中每行数据包含的信息,大致如下:
序号1 代表:标记的数据 是 主键值为 0 - 8191 的数据 ,标记文件每行数据信息如下:
序号1,数据行号,压缩偏移,非压缩偏移
序号1,数据行号,压缩偏移,非压缩偏移
序号1,数据行号,压缩偏移,非压缩偏移
...
序号2 代表:标记的数据 是 主键值为 8192 - 8191*2 的数据,标记文件每行数据信息如下:
序号2,数据行号,压缩偏移,非压缩偏移
序号2,数据行号,压缩偏移,非压缩偏移
序号2,数据行号,压缩偏移,非压缩偏移
...
副本在zk上对应的节点是怎样的?
select name from system.zookeeper where path='/clickhouse/tables/pre-6s-2p/db/table1/1' ;
┌─name───────────────────────┐
│ alter_partition_version │
│ metadata │
│ temp │
│ table_shared_id │
│ log │
│ leader_election │
│ columns │
│ blocks │
│ nonincrement_block_numbers │
│ replicas │
│ async_blocks │
│ quorum │
│ pinned_part_uuids │
│ block_numbers │
│ mutations │
│ zero_copy_s3 │
│ zero_copy_hdfs │
│ part_moves_shard │
└────────────────────────────┘
分区信息是否在zookeeper上?
分区信息在分区在zk上是有的
SELECT name
FROM zookeeper
WHERE path = '/clickhouse/tables/pre-6s-2p/db/table1/1/replicas/1s-1p/parts'
zookeeper上的分区节点,在ck进程停止时,会不会删除?
不会
ck怎么读取实时数据的?
1、使用flink读取kafka信息,然后主动写
2、使用kafka引擎https://clickhouse.com/docs/en/integrations/kafka
副本拿到log日志之后,谁去删除/log/log0000节点的?
1、每个副本都有个log_pointer值,类似于kafka 消费偏移量
2、log日志会被ck进程自动删除
数据写入前如果节点不是主副本 数据是否被转发到主副本?
不会,写入到哪个节点,那个就会同步数据到其他副本
加了一台机器作为一个分片,怎么办?
调整写入进程的写入权重,让数据更均衡
副本数据文件夹被删除之后,会修复数据吗?
会恢复,需要重启ck server
分布式表按照某个字段进行分片,写本地表是不是没有分布策略?
是的,写本地表,会把数据写入本地表。不会根据 分布式字段 把数据分发到其他分片,而是直接写到当前节点。
如果写入分布式表,数据会根据分布式字段 把数据分发到不同的节点
Buffer引擎表 如果ck server 重启,数据会丢失吗,是否有log机制??
ck server重启(kill pid),buffer引擎表不会丢失数据,ck 会在重启之前把数据保存到本地
ck server异常重启(kill -9 pid),在缓冲中的数据将丢失
Buffer引擎表 不支持索引