普通测试通常使用ClickHouse单节点就可以了,但是生产环境不免需要考虑多活、负载等高可用问题,集群就成了基础需求
ClickHouse在集群的选择上,作者已知的有两种: 使用ZooKeeper作为节点协调的组件,使用ClickHouse-Keeper作为节点协调的组件:
- 在ZooKeeper中存储集群的元数据信息,如表结构、分片配置以及集群节点状态等,通过ZooKeeper,ClickHouse能够实现在分布式环境下的元数据管理和节点间通信的协调。ZooKeeper的部署和使用也是大家比较熟悉的了。
- 基于已知的ZooKeeper在部分场景下响应不佳的前提下,ClickHouse Keeper基于Raft一致性算法开发的一款专门为ClickHouse设计的分布式一致性解决方案,旨在替代ZooKeeper作为ClickHouse集群的元数据存储与管理工具。它提供了高可用性和强一致性保证,简化了ClickHouse集群的部署和维护,并且针对ClickHouse的工作负载进行了优化。这个组件的部署还分为独立集群和嵌入式的。
两种选择均可。
ZooKeeper方式搭建CK集群
手动部署
手动部署ZK
使用官方指导快速部署一个单节点
正常单节点部署流程:
- 根据自身环境,下载一个安装包
- 解压安装包,并进入根目录
- 修改
conf/zoo.cfg
配置文件
tickTime=2000 #描述票据的时间,用来处理心跳或者session过期,毫秒
dataDir=/var/lib/zookeeper #本地用于存储内存数据快照的目录
clientPort=2181 #通信端口
- 启动服务
bin/zkServer.sh start
- 查看日志,确认启动成功
集群模式需要至少3个服务节点,2个服务节点本质上是不如单节点稳定,并不推荐
多节点集群的部署流程:
- 在每个服务节点,下载安装包,如单节点
- 在每个服务节点,解压安装包,进入根目录
- 在每个服务节点,进行配置修改
conf/zoo.cfg
tickTime=2000 #描述票据的时间,用来处理心跳或者session过期,毫秒
dataDir=/var/lib/zookeeper #本地用于存储内存数据快照的目录
clientPort=2181 #通信端口
initLimit=5 #表示新节点必须连接到leader的时间限制 initLimit*tickTime=最终毫秒数
syncLimit=2 #表示服务节点要leader间过期的时限 syncLimit*tickTime=最终毫秒数
server.1=zoo1:2888:3888 #服务节点1
server.2=zoo2:2888:3888 #服务节点2
server.3=zoo3:2888:3888 #服务节点3
如果3个服务节点位于一个服务器上,也就是端口无法相同,那么请区分开,比如 2888:3888, 2889:3889, 2890:3890
4. 分别启动那个服务,查看日志
手动部署CK
在多个服务器上分别部署ClickHouse,下载和基础安装步骤均可参考官方说明
单个服务节点都需要:
- 根据自身环境,下载安装包
- 解压安装服务节点
- 修改配置文件
/etc/clickhouse-server/config.xml
(默认文件),如果你想调整文件的位置和名称,启动服务时需指定clickhouse-server --config-file=/etc/clickhouse-server/config.xml
- 增加 metrika.xml 配置ZK的地址,修改config.xml 引入metrika的配置,此外需要根据自身情况定义好分片和副本的数量。
关于什么是分片?
通过定义Distributed表引擎或使用Replicated表引擎结合MergeTree系列引擎可以实现分片功能。分片有助于水平扩展数据存储能力,并且可以根据需要在不同的物理服务器上进行负载均衡
关于什么是副本?
通过Replicated表引擎(如ReplicatedMergeTree)可以在集群中的不同节点上创建相同结构表的副本,这样即使某个节点发生故障,其他拥有副本的节点仍然可以提供服务,从而保证了数据的高可用性
/etc/clickhouse-server/metrika.xml:
<yandex>
<clickhouse_remote_servers>
<cluster_2s_2r>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>127.0.0.1</host>
<port>9000</port>
<user>default</user>
<password></password>
</replica>
<replica>
<host>127.0.0.1</host>
<port>9100</port>
<user>default</user>
<password></password>
</replica>
</shard>
<shard>
<internal_replication>true</internal_replication>