《手摸手带你学ClickHouse》之分布式集群

骑猪看日落 2023-09-29 10:56 5阅读 0赞

本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 chaodev 即可关注。

文章目录

      • 1、集群部署信息
      • 2、ZooKeeper单机安装部署
        • 2.1 zookeeper下载
        • 2.2 解压
        • 2.3 配置
        • 2.4 启动ZooKeeper服务
        • 2.5 开放zookeeper的对应端口
        • 2.6 验证zookeeper服务
      • 3、Zookeeper集群安装
        • 3.1 配置文件
        • 3.2 myid文件
        • 3.3 开放端口
        • 3.4 启动zookeeper集群
      • 4、ClickHouse集群配置
        • 4.1 配置metrika.xml
        • 4.2 全局配置config.xml
      • 5、ClickHouse集群的使用
        • 5.1 创建数据库
        • 5.2 创建本地表
        • 5.3 创建Distributed分布式表
        • 5.4 分片和副本

前文回顾:
《手摸手带你学ClickHouse》之安装部署
《手摸手带你学ClickHouse》之访问接口
《手摸手带你学ClickHouse》之导入导出数据
《手摸手带你学ClickHouse》之MergeTree系列表引擎
《手摸手带你学ClickHouse》之ReplacingMergeTree表引擎
《手摸手带你学ClickHouse》之CollapsingMergeTree表引擎
《手摸手带你学ClickHouse》之VersionedCollapsingMergeTree表引擎
《手摸手带你学ClickHouse》之SummingMergeTree表引擎
《手摸手带你学ClickHouse》之AggregatingMergeTree表引擎
《手摸手带你学ClickHouse》之MySQL表引擎


前面的文章详细介绍了单机的安装及使用,但是通常生产环境我们会用集群代替单机,主要是解决两个问题:效率、稳定。

对于数据库来说,如何提升效率和稳定性,那就是数据分片、数据备份、高可用。而集群是解决这两个问题的最佳手段。

几乎所有大数据相关的产品,基本都是以这两个问题为出发点,Clickhouse也不例外。不同的是,Hadoop系列的集群是服务级别的,而Clickhouse的集群是在表的层面上的。例如,一个hdfs集群,所有文件都会切片、备份;而Clickhouse集群中,可以在建表时决定用不用。

接下来我将详细介绍我在生产环境搭建ClickHouse分布式集群的过程,没点关注的点个关注,保证全程干货。

搭建ClickHouse分布式集群,首先需要安装配置Zookeeper,因为ReplicatedMergeTree必须对接它才能工作。

1、集群部署信息

我这里准备了4个节点,集群部署信息如下




































节点 ip 部署信息 部署信息
节点1 192.168.1.70 Zookeeper ClickHouse
节点2 192.168.1.71 Zookeeper ClickHouse
节点3 192.168.1.76 Zookeeper ClickHouse
节点4 192.168.1.77 ClickHouse

2、ZooKeeper单机安装部署

由于ZooKeeper运行需要java环境,所以提前安装好jdk,过程简单,这里就不再赘述。

在这里插入图片描述

2.1 zookeeper下载

ZooKeeper需要使用3.4.5版本及以上,下载地址:
https://archive.apache.org/dist/zookeeper/
注:安装包下载带有bin的版本,否则可能会报错。

2.2 解压
  1. tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz

在这里插入图片描述

2.3 配置

进入解压后的目录,将conf目录下的 zoo_sample.cfg重命名为zoo.cfg

在这里插入图片描述

默认配置如下

  1. tickTime=2000
  2. initLimit=10
  3. syncLimit=5
  4. dataDir=/tmp/zookeeper
  5. clientPort=2181
  6. #maxClientCnxns=60
  7. #autopurge.snapRetainCount=3
  8. #autopurge.purgeInterval=1

配置项说明如下:

  • tickTime:ZooKeeper 中使用的基本时间单元, 以毫秒为单位, 默认值是 2000。它用来调节心跳和超时。
  • initLimit:默认值是 10, 即 tickTime 属性值的 10 倍。它用于配置允许 followers 连接并同步到 leader 的最大时间。如果 ZooKeeper 管理的数据量很大的话可以增加这个值。
  • syncLimit::默认值是 5, 即 tickTime 属性值的 5 倍。它用于配置leader 和 followers 间进行心跳检测的最大延迟时间。如果在设置的时间内 followers 无法与 leader 进行通信, 那么 followers 将会被丢弃。
  • dataDir: ZooKeeper 用来存储内存数据库快照的目录, 并且除非指定其它目录, 否则数据库更新的事务日志也将会存储在该目录下。
  • dataLogDir:指定 ZooKeeper 事务日志的存储目录。
  • clientPort:服务器监听客户端连接的端口, 也即客户端尝试连接的端口, 默认值是 2181。
  • maxClientCnxns:在 socket 级别限制单个客户端与单台服务器之前的并发连接数量, 可以通过 IP 地址来区分不同的客户端。它用来防止某种类型的 DoS 攻击, 包括文件描述符耗尽。默认值是 60。将其设置为 0 将完全移除并发连接数的限制。
  • autopurge.snapRetainCount:配置 ZooKeeper 在自动清理的时候需要保留的数据文件快照的数量和对应的事务日志文件, 默认值是 3。
  • autopurge.purgeInterval:和参数 autopurge.snapRetainCount 配套使用, 用于配置 ZooKeeper 自动清理文件的频率, 默认值是 1, 即默认开启自动清理功能, 设置为 0 则表示禁用自动清理功能。

修改 zoo.cfg 配置,更换数据和日志存储目录(别放在tmp目录,否则某一天可能数据就没了),如下:

  1. clientPort=2181
  2. dataDir= /data/opt/apache-zookeeper-3.5.7-bin/data
  3. dataLogDir= /data/opt/apache-zookeeper-3.5.7-bin/logs
2.4 启动ZooKeeper服务

进入bin目录

在这里插入图片描述

  1. #启动
  2. ./zkServer.sh start

在这里插入图片描述

  1. # 停止
  2. ./zkServer.sh stop
  3. # 重启
  4. ./zkServer.sh restart
2.5 开放zookeeper的对应端口
  1. 永久性添加2181端口
  2. firewall-cmd --add-port=2181/tcp --permanent --zone=public
  3. 重启防火墙(修改配置后要重启防火墙)
  4. firewall-cmd --reload
2.6 验证zookeeper服务

服务启动完成后, 可以使用 telnet 和 stat 命令验证服务启动是否正常

  1. telnet 127.0.0.1 2181

进入到命令行管理界面,如下

  1. ./zkCli.sh

在这里插入图片描述

至此,单机模式就安装完成了。

3、Zookeeper集群安装

由于 zookeeper 是用于分布式协调服务,因此我们需要部署一个 zookeeper 集群,这里选择3个节点(奇数)分别安装上 zookeeper。

3.1 配置文件

节点1(192.168.1.70):

  1. #端口
  2. clientPort=2181
  3. #数据和日志存储目录
  4. dataDir= /data/opt/apache-zookeeper-3.5.7-bin/data
  5. dataLogDir= /data/opt/apache-zookeeper-3.5.7-bin/logs
  6. #server.序号=主机名, 通讯端口、选举通讯端口
  7. server.1=192.168.1.70:2888:3888
  8. server.2=192.168.1.71:2888:3888
  9. server.3=192.168.1.76:2888:3888

节点2(192.168.1.71):

  1. clientPort=2181
  2. dataDir= /data/opt/apache-zookeeper-3.5.7-bin/data
  3. dataLogDir= /data/opt/apache-zookeeper-3.5.7-bin/logs
  4. server.1=192.168.1.70:2888:3888
  5. server.2=192.168.1.71:2888:3888
  6. server.3=192.168.1.76:2888:3888

节点3(192.168.1.76):

  1. clientPort=2181
  2. dataDir= /data/opt/apache-zookeeper-3.5.7-bin/data
  3. dataLogDir= /data/opt/apache-zookeeper-3.5.7-bin/logs
  4. server.1=192.168.1.70:2888:3888
  5. server.2=192.168.1.71:2888:3888
  6. server.3=192.168.1.76:2888:3888
3.2 myid文件

每一个节点的数据文件夹中创建一个myid文件,内容为其对应的id号

  1. echo "1" > /data/opt/apache-zookeeper-3.5.7-bin/data/myid
  2. echo "2" > /data/opt/apache-zookeeper-3.5.7-bin/data/myid
  3. echo "3" > /data/opt/apache-zookeeper-3.5.7-bin/data/myid
3.3 开放端口

各节点开放端口 2888、3888

  1. 永久性添加2888端口
  2. firewall-cmd --add-port=2888/tcp --permanent --zone=public
  3. 重启防火墙(修改配置后要重启防火墙)
  4. firewall-cmd --reload
  5. 永久性添加3888端口
  6. firewall-cmd --add-port=3888/tcp --permanent --zone=public
  7. 重启防火墙(修改配置后要重启防火墙)
  8. firewall-cmd --reload
3.4 启动zookeeper集群

启动各节点后,如下,一个leader,两个follower

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

这时候,如果你将leader这个节点关掉,剩下两台又会有一台变成了 leader节点。

4、ClickHouse集群配置

在每个节点都安装好ClickHouse后,进行集群配置。

4.1 配置metrika.xml

首先,在 /etc/clickhouse-server/config.d 目录下新建一个名为 metrika.xml 的配置文件。

  1. #老版本如果没有目录则新建
  2. mkdir /etc/clickhouse-server/config.d
  3. cd /etc/clickhouse-server/config.d
  4. vim metrika.xml

加入如下内容

  1. <?xml version="1.0"?>
  2. <yandex>
  3. <!-- 集群配置 -->
  4. <remote_servers>
  5. <!-- 集群名称 -->
  6. <cluster_test>
  7. <!-- 数据分片1 -->
  8. <shard>
  9. <internal_replication>true</internal_replication>
  10. <replica>
  11. <host>192.168.1.70</host>
  12. <port>9000</port>
  13. </replica>
  14. <replica>
  15. <host>192.168.1.71</host>
  16. <port>9000</port>
  17. </replica>
  18. </shard>
  19. <!-- 数据分片2 -->
  20. <shard>
  21. <internal_replication>true</internal_replication>
  22. <replica>
  23. <host>192.168.1.76</host>
  24. <port>9000</port>
  25. </replica>
  26. <replica>
  27. <host>192.168.1.77</host>
  28. <port>9000</port>
  29. </replica>
  30. </shard>
  31. </cluster_test>
  32. </remote_servers>
  33. <macros>
  34. <shard>01</shard>
  35. <replica>rep_1_1</replica>
  36. </macros>
  37. <!-- zookeeper -->
  38. <zookeeper-servers>
  39. <node index="1">
  40. <host>192.168.1.70</host>
  41. <port>2181</port>
  42. </node>
  43. <node index="2">
  44. <host>192.168.1.71</host>
  45. <port>2181</port>
  46. </node>
  47. <node index="3">
  48. <host>192.168.1.76</host>
  49. <port>2181</port>
  50. </node>
  51. </zookeeper-servers>
  52. </yandex>

注:
(1)宏命令macros里的shard和replica标签名和内容都是自己命名的,在建表时可以引用。比如我们是2分片2副本,4个节点内容可以取名如下:

  • 01,rep_1_1:代表分片1副本1
  • 01,rep_1_2:代表分片1副本2
  • 02,rep_2_1:代表分片2副本1
  • 02,rep_2_2:代表分片2副本2

建表时这样引用:

  1. ENGINE=ReplicatedMergeTree('/clickhouse/tables/{shard}/tb_test','{replica}')

(2)老版本使用 clickhouse_remote_servers 标签,但是新版本要使用 remote_servers,具体看你配置文件里默认的标签是哪个。

更改下文件属主

  1. chown clickhouse:clickhouse /etc/clickhouse-server/config.d/metrika.xml
4.2 全局配置config.xml

在全局配置config.xml中使用标签导入上面定义的配置。

  1. vi /etc/clickhouse-server/config.xml
  2. <include_from>/etc/clickhouse-server/config.d/metrika.xml</include_from>

并引用Zookeeper配置的定义

  1. <zookeeper incl=”zookeeper-servers” optional=”true” />

在这里插入图片描述
其中,config.xml 中的 incl 和 metrika.xml 中的节点名称要对应。

到这里集群就配置完毕,在 system 数据库的 clusters 表中就可以查询到刚才配置集群的信息。

在这里插入图片描述

5、ClickHouse集群的使用

5.1 创建数据库
  1. create database test on cluster cluster_test;

在这里插入图片描述

5.2 创建本地表
  1. CREATE TABLE test.tb_cluster_test1 ON CLUSTER cluster_test(
  2. id Int8,
  3. city String,
  4. v1 UInt32,
  5. v2 Float64,
  6. create_time DateTime
  7. )ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/tb_cluster_test1','{replica}')
  8. PARTITION BY toYYYYMM(create_time)
  9. PRIMARY KEY id
  10. ORDER BY (id,city);

在这里插入图片描述

可以看到我们在其中一个节点建库建表,都将同步建立到其余3个节点。

5.3 创建Distributed分布式表

创建分布式表就是用来统一管理各节点本地表,它自身不存储数据,分布式表通常以_all为后缀进行命名。

Distributed分布式表引擎定义形式如下:

  1. ENGINE = Distributed(cluster,database,table,[sharding_key])
  • cluster:集群名称。
  • database:数据库名称。
  • table:表名称。
  • sharding_key:分片键,也可不填,用rand()。分布式表会根据分片键规则,将数据分配到各节点的本地表中。

    CREATE TABLE tb_cluster_test1_all ON CLUSTER cluster_test(
    id Int8,
    city String,
    v1 UInt32,
    v2 Float64,
    create_time DateTime
    )ENGINE = Distributed(cluster_test,test,tb_cluster_test1,hiveHash(id));

在这里插入图片描述

5.4 分片和副本

向分布式表中插入如下数据

  1. insert into tb_cluster_test1_all
  2. values
  3. (1,'km',80,100,now()),
  4. (2,'km',30,90,now()),
  5. (3,'km',50,60,'2021-06-02 17:02:12'),
  6. (4,'bj',200,60.99,'2021-07-02 17:02:12'),
  7. (5,'bj',990,75.99,'2021-07-12 17:02:12'),
  8. (6,'shanghai',200,98,'2021-08-12 17:02:12'),
  9. (7,'bj',80,102.32,'2021-08-19 17:02:12'),
  10. (8,'cq',600,245.35,now()),
  11. (8,'hangzhou',300,158.58,now());

在这里插入图片描述

查询分布式表:

在这里插入图片描述

各节点本地表数据如下:

  • 节点1:

在这里插入图片描述

  • 节点2:

在这里插入图片描述

  • 节点3:

在这里插入图片描述

  • 节点4:

在这里插入图片描述

可以看到,数据被分成了两份,分片1中节点1和节点2数据一样,分片2 中节点3和节点4数据一样,他们分别互为副本。

至此,分布式集群搭建和使用就结束了。

后续将继续更新该系列,大佬超手摸手带你学ClickHouse,敬请关注!!!


这篇文章耗费了我太多精力,觉得有帮助点个关注点个赞吧!!!
原创不易,转载请注明出处。

发表评论

表情:
评论列表 (有 0 条评论,5人围观)

还没有评论,来说两句吧...

相关阅读