clickhouse三分片一副本集群部署

个人学习笔记,谢绝转载!!!
原文:https://www.cnblogs.com/wshenjin/p/13140191.html


简单分布式MergeTree + Distributed,三分片一副本

节点IP

  • 192.168.31.101
  • 192.168.31.102
  • 192.168.31.103

部署clickhouse集群

三个节点的安装省略

config.xml的一些配置:

    <!-- Path to data directory, with trailing slash. -->
    <path>/data/database/clickhouse/</path>
    <!-- Path to temporary data for processing hard queries. -->
    <tmp_path>/data/database/clickhouse/tmp/</tmp_path>
    <!-- Directory with user provided files that are accessible by 'file' table function. -->
    <user_files_path>/data/database/clickhouse/user_files/</user_files_path>
    <!-- Directory in <clickhouse-path> containing schema files for various input formats.The directory will be created if it doesn't exist.-->
    <format_schema_path>/data/database/clickhouse/format_schemas/</format_schema_path>
    <!-- Same for hosts with disabled ipv6.-->
    <listen_host>0.0.0.0</listen_host> 
    <timezone>Asia/Shanghai</timezone> 
    <!-- 集群相关的配置,可以用外部依赖文件来配置,因此这里留空即可 -->
    <remote_servers incl="clickhouse_remote_servers" > </remote_servers>
    <!-- 外部依赖配置文件 -->
    <include_from>/etc/clickhouse-server/metrika.xml</include_from>

配置metrika.xml:

<yandex>
    <!-- 集群配置 -->
    <clickhouse_remote_servers>
        <!-- 集群名称 三分配一副本,名称可自定义 -->
        <ckcluster_3shards_1replicas>
            <!-- 数据分片1  -->
            <shard>
                <internal_replication>true</internal_replication>
                <replica>
                    <host>192.168.31.101</host>
                    <port>9000</port>
                </replica>
            </shard>
            <!-- 数据分片2  -->
            <shard>
                <replica>
                <internal_replication>true</internal_replication>
                    <host>192.168.31.102</host>
                    <port>9000</port>
                </replica>
            </shard>
            <!-- 数据分片3  -->
            <shard>
                <internal_replication>true</internal_replication>
                <replica>
                    <host>192.168.31.103</host>
                    <port>9000</port>
                </replica>
            </shard>
        </ckcluster_3shards_1replicas>
    </clickhouse_remote_servers>
<!--压缩算法->
    <clickhouse_compression>
        <case>
            <min_part_size>10000000000</min_part_size>
            <min_part_size_ratio>0.01</min_part_size_ratio>
            <method>lz4</method>
        </case>
    </clickhouse_compression>
</yandex>

说明:

  • clickhouse_remote_servers与config.xml中的incl属性值对应
  • cluster_with_replica是集群名,可以自定义。
  • shard即为数据分片
  • internal_replication =true 这个参数和数据的写入,自动复制相关。从生产环境角度考虑,我们都是复制表,通过本地表写入,这里配置true就好。不推荐也不需要考虑其他情况。
  • clickhouse_compression数据的压缩。
  • 无副本时,可以使用node标签代替shard标签来定义节点

各个节点重启后登陆查看:

SELECT *
FROM system.clusters

┌─cluster─────────────────────┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name──────┬─host_address───┬─port─┬─is_local─┬─user────┬─default_database─┬─errors_count─┬─estimated_recovery_time─┐
│ ckcluster_3shards_1replicas │         1 │            1 │           1 │ 192.168.31.101 │ 192.168.31.101 │ 9000 │        1 │ default │                  │            0 │                       0 │
│ ckcluster_3shards_1replicas │         2 │            1 │           1 │ 192.168.31.102 │ 192.168.31.102 │ 9000 │        0 │ default │                  │            0 │                       0 │
│ ckcluster_3shards_1replicas │         3 │            1 │           1 │ 192.168.31.103 │ 192.168.31.103 │ 9000 │        0 │ default │                  │            0 │                       0 │
└─────────────────────────────┴───────────┴──────────────┴─────────────┴────────────────┴────────────────┴──────┴──────────┴─────────┴──────────────────┴──────────────┴─────────────────────────┘

这样集群就搭建好了

建库建表

在各个节点建库、本地表

:) create database testdb ;
:) create table person_local (ID Int8, Name String, BirthDate Date) ENGINE = MergeTree(BirthDate, (Name, BirthDate), 8192);

在各个节点建分布表

:) create table person_all as person_local ENGINE = Distributed(ckcluster_3shards_1replicas, testdb, person_local, rand());

分布表(Distributed)本身不存储数据,相当于路由,需要指定集群名、数据库名、数据表名、分片KEY.
这里分片用rand()函数,表示随机分片。
查询分布表,会根据集群配置信息,路由到具体的数据表,再把结果进行合并。

  • person_local 为本地表,数据只是在本地
  • person_all 为分布式表,查询这个表,引擎自动把整个集群数据计算后返回

插入数据,再来查看各个节点的数据量对比

#导入3w的数据量
[root ~]# wc -l /tmp/a.csv  
30000 /tmp/a.csv
[root ~]# clickhouse-client  --host 127.0.0.1 --database testdb  --query="insert into person_all FORMAT CSV"  < /tmp/a.csv 

#对比总表和本地表的数据量
ck1 :) select count(*) from person_all ;
┌─count()─┐
│   30000 │
└─────────┘
ck1 :) select count(*) from person_local ;
┌─count()─┐
│   10092 │
└─────────┘
posted @ 2020-06-16 11:54  wshenJin  阅读(2875)  评论(0编辑  收藏  举报