1)Distributed 引擎
这个引擎是为了实现分布式的查询的,另外一个功能就是插入的时候实现Shard(分片)
可以理解为一个特别的视图,用来支持分布查询和插入分片数据。
反应到配置中的就是remote_servers的定义部分,下面的例子定义了三个shard支持分布式查询:
ch-sub-1
9000
ch-sub-2
9000
ch-sub-3
9000
Distributed(cluster_name, database, table, [sharding_key])
分片的依据可以是随机分配,比如 rand() 下面的这个例子:
ENGINE = Distributed(example_cluster, history, measures, rand()
实战演练可以参考下面的文章
Creating a ClickHouse cluster - Part I: Sharding - DEV Communityhttps://dev.to/zergon321/creating-a-clickhouse-cluster-part-i-sharding-4j20
对应的docker-compose配置和python测试程序在
https://github.com/zergon321/clickhouse-clusteringhttps://github.com/zergon321/clickhouse-clustering
2) ReplicatedMergeTree引擎
这个引擎可以实现分布式的同步表,用于数据的冗余,把同一份数据保存到多个replica
具体配置主要是宏的定义,比如:
01
ch-sub-1
定义表格的时候可以使用默认定义
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/{database}/table_name', '{replica}')
其中的路径为zk配置路径,而且这些参数可以省略,上面的定义等同于下面的定义:
ENGINE = ReplicatedMergeTree
实战演练可以参考下面的文章
Creating a ClickHouse cluster - Part II: Replication - DEV CommunityIn the previous article I showed how to run ClickHouse in cluster mode using only sharding. It's... Tagged with clickhouse, nosql, docker, cluster.https://dev.to/zergon321/creating-a-clickhouse-cluster-part-ii-replication-23mc
对应的docker-compose配置和python测试程序在
GitHub - zergon321/clickhouse-replication: All the necessary things to set up ClickHouse cluster with replication enabledhttps://github.com/zergon321/clickhouse-replication
3) ReplicatedReplacingMergeTree引擎
有些时候,可能有数据重复插入,我们希望引擎能够自动去掉重复数据,只保留最新的记录,那么就需要用到ReplicatedReplacingMergeTree引擎了。
前面定义Distributed表使用了rand()作为分片依据,在这里会出现同样内容的记录插入不同的shard,导致无法替换的问题,所以需要修改分片依据为某些关键字段或者关键字段的hash运算,比如:
ENGINE = Distributed(example_cluster, billing, transactions, cityHash64(currency)
对于ReplicatedReplacingMergeTree引擎来时,主键是替换的依据,所以必须有业务含义,不能是时间戳,比如关键字段:
ORDER BY (currency,value)
配置没有问题的话,可以在执行SQL查询到cluster配置:
select * from system.clusters
结果:
如果在clickhouse的从属服务器配置中也加入remote_servers部分,就可以使用on cluster关键字一次性在所有的从属服务器创建数据库和表格,比如:
CREATE DATABASE IF NOT EXISTS billing on cluster example_cluster
CREATE TABLE IF NOT EXISTS billing.transactions on cluster example_cluster (
timestamp DateTime,
currency String,
value Float64)
ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{shard}/billing.transactions', '{replica}')
PARTITION BY currency
ORDER BY (currency,value)
对应的docker-compose配置和python程序在
GitHub - Henry586/clickhouse-replacing: ClickHouse ReplicatedReplacingMergeTree engine testhttps://github.com/Henry586/clickhouse-replacing
参考步骤:
1) 启动docker
docker-compose up
2) 创建从属服务器的数据库和表格(ReplicatedReplacingMergeTree引擎)
python3 01_sub-create.py
3) 创建主服务器的数据库和表格(Distributed),并插入数据
python3 02_master-insert.py
此时可以看从Distributed看到所有的记录,并且单独去从属服务器也能看到数据的冗余和分片情况。
4)验证替换(Replacing)功能
如果再次执行 02_master-insert.py 插入数据,有可能看到相同主键的数据重复存在,老的数据尚未去除,此时可以执行SQL命令告诉clickhouse去做数据替换,只保留最后插入的数据:
optimize table billing.transactions final
虽然optimize命令的运行时间不定,但是一般都能很快看到结果。
5) 停止docker
docker-compose stop
6) 删除docker
docker-compose down