本文主要为大家介绍ClickHouse三板斧(集群、副本与分片)
集群是副本和分片的基础,它将ClickHouse的服务拓扑由当前节点延伸到多个节点,但它并不像Hadoop生态某系统那样,要求所有节点组成一个单一的大集群(服务级别)。ClickHouse的集群配置比较灵活,用户既可以组成一个单一集群,也可以按照业务划分为多个小集群(表级别),它们的节点、副本和分片数量可各不相同。
从作用来看,ClickHouse集群的工作可以理解为是针对逻辑层面的,而执行层面的具体工作则交给副本和分片来执行。
简言之,副本与分片区分可以理解为,副本间的数据是完全相同,而分片间的数据是不同的,如下:
MergeTree + Replicated即可理解为支持数据副本,两者逻辑关系如下:
在MergeTree中,一个数据分区由开始创建到全部完成,会历经两类存储区域。
内存:数据首先会被写入内存缓存区。
本地磁盘:数据接着会被写入tmp临时目录分区,待全部完成后再将临时目录重命名为正式分区。
ReplicatedMergeTree只是在此基础上添加了Zookeeper的部分,这里并不会涉及表数据的传输。
ENGINE = ReplicatedMergeTree(’/clickhouse/{cluster}/tables/dwd_shard/dw_user_tag_all/{layer}’, ‘{replica}’)
其中主要包括两部分:zk_path和replica_name
ReplicatedMergeTree的核心逻辑主要都是运用ZK的能力,包括副本协同、主副本选举、状态感知、操作日志分发、任务队列、BlockID去重判断等
上述提到的/log 和 /mutations 节点在CK中被统一的抽象为Entry对象,具体实现则由LogEntry 和 MutationEntry对象承载
核心流程主要INSERT、MERGE、MUTATION和ALTER四种,分别对应数据写入、分区合并、数据修改和元数据修改。
备注:以下执行主要按1分片、1副本讲解,若大于1个副本的场景流程可类推
备注:
备注:
主要进行元数据的修改
备注:
CK中每个服务节点都可以称为一个shard分片,一般数据分片需要结合Distributed表引擎一同使用。
主要介绍三种形式的配置
<cluster>
<node>
<host>host>
<port>port>
<user>user>
<password>password>
node>
<node>
...
node>
cluster>
如咱们日志集群配置,效果同不定义副本的分片
<ch_cluster2>
<shard>
<replica>
<host>clickhouse13host>
<port>9000port>
<user>clickhouse_clusteruser>
<password>password>
replica>
shard>
<shard>
<replica>
<host>clickhouse14host>
<port>9000port>
<user>clickhouse_clusteruser>
<password>password>
replica>
shard>
<shard>
...
shard>
ch_cluster2>
如咱们业务集群配置
<ch_cluster1>
<shard>
<weight>1weight>
<internal_replication>trueinternal_replication>
<replica>
<host>clickhouse1host>
<port>9000port>
<user>clickhouse_clusteruser>
<password>password>
replica>
<replica>
<host>clickhouse10host>
<port>9000port>
<user>clickhouse_clusteruser>
<password>password>
replica>
shard>
<shard>
...
shard>
ch_cluster1>
即执行 ON CLUSTER cluster_name 操作
备注:
Distributed表引擎自身不存储任何数据,可理解为一层透明代理,在集群内部开展数据的写入、分发、查询路由等,故它需要和其他数据表引擎一同工作。
从实体表层面看,一张分布式表主要有本地表(xxx_local)和分布式表(xxx_all)两部分组成。
Distributed表不支持任何MUTATION类型的操作。
ENGINE = Distributed(cluster, database, table, [, sharding_key])
其中,各参数含义如下:
主要介绍两种常见思路
若要求更好的写入性能的情况下,优先推荐
优点: 写入性能更好,读写分离
缺点: 需要依赖外部系统
依赖Distributed表引擎代理写入,便于理解这里将拆分为分片写入、副本复制两个过程
备注:
该种方案Distributed节点需要通过负责分片和副本的数据写入工作,它很可能会遇到写入的单点瓶颈。
该种方案则需要在shard配置中添加
true (默认为false),那么Distributed表只会选择一个合适的replica写入数据,其它的副本数据交由ReplicatedMergeTree自己处理,从而减负。
主要介绍两种场景,如多副本表,多分片表