clickhouse的常用引擎

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 testicon-default.png?t=LA92https://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

你可能感兴趣的:(clickhouse,Python,db,olap,python)