ClickHouse集群--多分片多副本(zookeeper+ReplicatedMergeTree引擎)

文档编写目的:记录备忘

1.环境搭建

4台centOS 7的主机,分别安装了四个ClickHouse数据库,安装参考:https://www.jianshu.com/p/2ce45a9c30ce
zookeeper集群(也可以不集群,直接使用单机也可以),集群参考:https://www.cnblogs.com/ysocean/p/9860529.html

2.新增配置文件metrika.xml

vim /etc/clickhouse-server/metrika.xml

本次4个数据库分两片,每片两个副本

<yandex>
    <clickhouse_remote_servers>
        <!--集群名称 自定义 -->
        <my_cluster>
            <!-- 分片1  -->
            <shard>
                <internal_replication>true</internal_replication>
                <replica>
                    <host>192.168.120.87</host>
                    <port>9000</port>
                    <user>sunny</user>
                    <password>sunny</password>
                </replica>
                <replica>
                    <host>192.168.120.103</host>
                    <port>9000</port>
                    <user>sunny</user>
                    <password>sunny</password>
                </replica>
            </shard>
            <!-- 分片2  -->
            <shard>
                <internal_replication>true</internal_replication>
                <replica>
                    <host>192.168.120.105</host>
                    <port>9000</port>
                    <user>sunny</user>
                    <password>sunny</password>
                </replica>
                <replica>
                    <host>192.168.120.140</host>
                    <port>9000</port>
                    <user>sunny</user>
                    <password>sunny</password>
                </replica>
            </shard>
        </my_cluster>
    </clickhouse_remote_servers>

    <!-- 副本名称 -->
    <macros>
        <shard>node01</shard>
        <replica>192.168.120.87</replica>
    </macros>

    <networks>
        <ip>::/0</ip>
    </networks>

    <!-- zookeeper  -->
    <zookeeper-servers>
        <node index="1">
            <host>192.168.120.87</host>
            <port>2181</port>
        </node>
        <node index="2">
            <host>192.168.120.103</host>
            <port>2181</port>
        </node>
        <node index="3">
            <host>192.168.120.105</host>
            <port>2181</port>
        </node>
    </zookeeper-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>

通过scp将metrika.xml文件发送到其他三台服务器上

scp /etc/clickhouse-server/metrika.xml root@192.168.120.103:/etc/clickhouse-server/metrika.xml

然后修改其他三台服务器上的metrika.xml,仅修改图中红框代码,同一分片的<shard></shard>必须相同,互不重复,其他都不变:


image.png

image.png

然后编辑4个服务器上的config.xml,引入metrika.xml:

vim /etc/clickhouse-server/config.xml

加上下面这句:

<include_from>/etc/clickhouse-server/metrika.xml</include_from>
image.png

取消<interserver_http_host></interserver_http_host>这行的注释,值修改为当前服务器IP:


image.png

与metrika.xml文件中的此处对应,如下图红框:


image.png

重启服务:

 service clickhouse-server restart

3.测试

此种集群适合表引擎为ReplicatedMergeTree的表,在每个服务器数据库创建如下表:

-- 本地表
create table department
(
    id         Int32,
    dept_code  String,
    dept_name  String,
    createDate Date
) engine = ReplicatedMergeTree('/clickhouse/tables/{shard}/department', '{replica}', createDate,
           (dept_code, createDate), 8192);

--分布式表
create table department_all as department ENGINE = Distributed(my_cluster, ClickHouseTest, department, rand());

插入数据:

insert into department_all (id, dept_code, dept_name, createDate) values (1, 1001, '肾脏内科', '2020-01-01');
insert into department_all (id, dept_code, dept_name, createDate) values (2, 1002, '肾脏内科', '2020-01-02');
insert into department_all (id, dept_code, dept_name, createDate) values (3, 1003, '肾脏内科', '2020-01-03');
insert into department_all (id, dept_code, dept_name, createDate) values (4, 1004, '肾脏内科', '2020-01-04');
insert into department_all (id, dept_code, dept_name, createDate) values (5, 1005, '肾脏内科', '2020-01-05');
insert into department_all (id, dept_code, dept_name, createDate) values (6, 1006, '肾脏内科', '2020-01-06');
insert into department_all (id, dept_code, dept_name, createDate) values (7, 1007, '肾脏内科', '2020-01-07');
insert into department_all (id, dept_code, dept_name, createDate) values (8, 1008, '肾脏内科', '2020-01-08');
insert into department_all (id, dept_code, dept_name, createDate) values (9, 1009, '肾脏内科', '2020-01-09');
insert into department_all (id, dept_code, dept_name, createDate) values (10, 1010, '肾脏内科', '2020-01-10');
insert into department_all (id, dept_code, dept_name, createDate) values (11, 1011, '肾脏内科', '2020-01-11');
insert into department_all (id, dept_code, dept_name, createDate) values (12, 1012, '肾脏内科', '2020-01-12');
insert into department_all (id, dept_code, dept_name, createDate) values (13, 1013, '肾脏内科', '2020-01-13');
insert into department_all (id, dept_code, dept_name, createDate) values (14, 1014, '肾脏内科', '2020-01-14');
insert into department_all (id, dept_code, dept_name, createDate) values (15, 1015, '肾脏内科', '2020-01-15');

分别查询87和103服务器上的department和department_all
查询结果如下:
87的department:


image.png

87的department_all:


image.png

103上的department:
image.png

103上的department_all:
image.png

87和103为同一个shard的不同副本,对比可以看出87和103上department表的数据相同,相互备份,其中一个服务器挂掉,也不会影响数据库的正常使用。105和140是另一个分片下的两个副本,存储的是上面插入数据的剩余部分,所以上图中两个department_all均为15条数据。

总结:此种方式为多分片多副本的集群方式,需要zookeeper+ReplicatedMergeTree引擎实现副本表的相互备份,本例中是两个副本,还可以增加,三个四个都行,当某个服务器数据库挂掉之后,还有剩余的副本正常工作,不会影响业务,从而实现高可用。
注意:当从分布式表插入重复数据时,不同分片中不会去重,多个分片之间会出现重复数据,在做数据采集时需要注意。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容