ClickHouse 社区在 21.8 版本中开始引入了 ClickHouse-Keeper ,直至 ClickHouse 21.12 发布公告提到 ClickHouse Keeper 功能基本完成,目前已经可以运用在生产环境中。
ClickHouse Keeper 是 ZooKeeper 的替代品,与 ZooKeeper 不同,ClickHouse Keeper 是用 C++ 编写的,并使用 RAFT 算法实现,该算法允许对读写具有线性化能力。
clikhouse-keeper目的在于替换zookeeper,使用clickhouse后,服务器性能,提升了一大截,只需要在配置zookeeper的地方,改成clickhouse-keeper即可。
而 ClickHouse-Keeper 存在着以下优点:
使用 C++ 开发,技术栈与 ClickHouse 统一
即可独立部署,又可集成到 ClickHouse 中
没有 zxid overflow 问题
读性能更好,写性能相当
支持对 snapshot 和 log 的压缩和校验
支持读写的线性一致性
安装方式安装完clickhouse和clickhouse-client,新版本就自带clickhouse-keeper了。相较之前的集群配置,没有太大区别,而 ClickHouse-Keeper 仅当<keeper_server>标签存在于配置中时才会运行。在/etc/clickhouse-server/keeper.xml 增加以下内容,大括号中的部分,按需要修改。
<?xml version="1.0"?>
<yandex>
<!-- 监听IP -->
<listen_host>0.0.0.0</listen_host>
<keeper_server>
<tcp_port>9181</tcp_port>
<server_id>1</server_id>
<log_storage_path>/var/lib/clickhouse/coordination/log</log_storage_path>
<snapshot_storage_path>/var/lib/clickhouse/coordination/snapshots</snapshot_storage_path>
<coordination_settings>
<operation_timeout_ms>30000</operation_timeout_ms>
<session_timeout_ms>60000</session_timeout_ms>
<raft_logs_level>error</raft_logs_level>
<force_sync>false</force_sync>
</coordination_settings>
<raft_configuration>
<server>
<id>1</id>
<hostname>node01</hostname>
<port>9444</port>
</server>
<!--
<server>
<id>2</id>
<hostname>vm1</hostname>
<port>9444</port>
</server>
<server>
<id>3</id>
<hostname>vm2</hostname>
<port>9444</port>
</server>
-->
</raft_configuration>
</keeper_server>
</yandex>
详细的配置参数说明
The detailed description of configuration parameters is copied below ( Source: https://clickhouse.com/docs/en/guides/sre/clickhouse-keeper/ )
参数 | 描述 | 示例 |
---|---|---|
tcp_port | 对外服务端口 | 默认2181 ,跟zookeeper端口一致 |
server_id | 服务器id,跟raft配置中的id保持一致 | 1 |
coordination_settings | 基本参数设置,超时,日志级别等设置 | timeouts: 10000, log level: trace |
server | clickhouse-server服务器列表 | 服务列表 |
raft_configuration | 每台raft服务器配置 | 配置信息 |
id | 集群中的服务器id | 1 |
hostname | 集群服务器名,可以为ip,别名,域名等 | clickhousen1.domain.com |
port | clickhouse-keeper内部通信端口 | 9444 |
clickhouse-keeper --config /etc/clickhouse-server/keeper.xml --daemon
tcp_port:客户端连接的端口(ZooKeeper 的默认值为2181)
tcp_port_secure:用于客户端和 keeper-server 之间 SSL 连接的安全端口
server_id:Keeper集群的每个节点唯一ID
log_storage_path:日志路径,最好将日志存储在IO性能强设备
snapshot_storage_path:快照路径
<keeper_server>.<coordination_settings>部分
operation_timeout_ms:单个客户端操作超时配置
min_session_timeout_ms:客户端会话最小超时
session_timeout_ms:客户端会话的最大超时
dead_session_check_period_ms:检查过期会话并将其删除的频率
heart_beat_interval_ms:leader 向 follower 发送心跳的频率
election_timeout_lower_bound_ms:如果 follower 在此时间间隔内没有收到 leader 的心跳,则可以发起 leader 选举
rotate_log_storage_interval:在单个文件中存储多少日志记录
reserved_log_items:压缩前要存储多少日志记录
snapshot_distance:创建快照的频率
snapshots_to_keep:快照保留份数
max_requests_batch_size:在将请求发送到 RAFT 之前,请求中的最大批处理请求大小
raft_logs_level:raft日志记录级别
auto_forwarding:允许将follower的写请求转发给leader
shutdown_timeout:等待完成内部连接并关闭的时间
<keeper_server>.<raft_configuration>部分
Id:集群的每个节点ID
Hostname:服务器主机名
Port:服务器监听端口
6.1、ruok 主要用于诊断 Keeper 的客户端/服务器
命令如下:
echo ruok | nc 127.0.0.1 2181 成功则返回 imok
6.2 服务器状态
echo mntr | nc localhost 2181
6.3 服务器和连接状态
echo stat | nc localhost 2181
既然 ClickHouse-Keeper 优势这么明显,那么如何将 Zookeeper 中的数据迁移到 ClickHouse-Keeper 中呢?官方提供了迁移工具 ClickHouse-Keeper-Converter, 它能够将 Zookeeper 中的数据 dump 成 ClicHouse-Keeper 能够加载的 snapshot 。
迁移步骤如下
停止所有 Zookeeper 节点
找到 Zookeeper-leader 节点并再次停止(这一步是为了让 leader 节点生成一份 snapshot )
运行 ClickHouse-Keeper-Converter ,生成 Keeper 的 snapshot 文件
命令参考:
clickhouse-keeper-converter --zookeeper-logs-dir /var/lib/zookeeper/version-2 --zookeeper-snapshots-dir /var/lib/zookeeper/version-2 --output-dir /var/lib/clickhouse/keeper/snapshots
启动 ClickHouse-Keeper ,使其加载上一步中的 snapshot
参考文献:https://clickhouse.com/docs/en/operations/clickhouse-keeper/