ClickHouse Keeper (clickhouse-keeper)
本页面不适用于 ClickHouse Cloud。此处记录的流程在 ClickHouse Cloud 服务中已自动化。
ClickHouse Keeper 提供数据 复制和 分布式 DDL 查询执行的协调系统。ClickHouse Keeper 与 ZooKeeper 兼容。
实现细节
ZooKeeper 是第一个广为人知的开源协调系统之一。它使用 Java 实现,并具有相当简单且强大的数据模型。ZooKeeper 的协调算法 ZooKeeper Atomic Broadcast (ZAB) 不为读取提供线性一致性保证,因为每个 ZooKeeper 节点都在本地提供读取服务。与 ZooKeeper 不同,ClickHouse Keeper 使用 C++ 编写,并使用 RAFT 算法 实现。该算法允许读取和写入的线性一致性,并且有多种开源实现,使用不同的语言。
默认情况下,ClickHouse Keeper 提供与 ZooKeeper 相同的保证:线性一致性的写入和非线性一致性的读取。它具有兼容的客户端-服务器协议,因此任何标准的 ZooKeeper 客户端都可以用于与 ClickHouse Keeper 交互。快照和日志的格式与 ZooKeeper 不兼容,但 clickhouse-keeper-converter 工具可以实现 ZooKeeper 数据到 ClickHouse Keeper 快照的转换。ClickHouse Keeper 中的服务器间协议也与 ZooKeeper 不兼容,因此不可能存在混合的 ZooKeeper / ClickHouse Keeper 集群。
ClickHouse Keeper 支持与 ZooKeeper 相同的访问控制列表 (ACL)。ClickHouse Keeper 支持相同的权限集,并具有相同的内置方案:world、auth 和 digest。摘要认证方案使用 username:password 对,密码以 Base64 编码。
不支持外部集成。
配置
ClickHouse Keeper 可以用作 ZooKeeper 的独立替代品,也可以作为 ClickHouse 服务器的内部部分。在两种情况下,配置几乎相同 .xml 文件。
Keeper 配置设置
主要的 ClickHouse Keeper 配置标签是 <keeper_server>,具有以下参数
| 参数 | 描述 | 默认值 |
|---|---|---|
tcp_port | 客户端连接的端口。 | 2181 |
tcp_port_secure | 客户端和 keeper-server 之间 SSL 连接的安全端口。 | - |
server_id | 唯一的服务器 ID,ClickHouse Keeper 集群的每个参与者都必须具有唯一的编号(1、2、3,依此类推)。 | - |
log_storage_path | 协调日志的路径,就像 ZooKeeper 一样,最好将日志存储在不繁忙的节点上。 | - |
snapshot_storage_path | 协调快照的路径。 | - |
enable_reconfiguration | 通过 reconfig 启用动态集群重新配置。 | False |
max_memory_usage_soft_limit | Keeper 最大内存使用的软限制(字节)。 | max_memory_usage_soft_limit_ratio * physical_memory_amount |
max_memory_usage_soft_limit_ratio | 如果未设置 max_memory_usage_soft_limit 或设置为零,我们将使用此值来定义默认的软限制。 | 0.9 |
cgroups_memory_observer_wait_time | 如果未设置 max_memory_usage_soft_limit 或设置为 0,我们将使用此间隔来观察物理内存量。一旦内存量发生变化,我们将通过 max_memory_usage_soft_limit_ratio 重新计算 Keeper 的内存软限制。 | 15 |
http_control | HTTP 控制 接口的配置。 | - |
digest_enabled | 启用实时数据一致性检查 | True |
create_snapshot_on_exit | 在关闭时创建快照 | - |
hostname_checks_enabled | 启用集群配置的合理性主机名检查(例如,如果使用远程端点时使用 localhost) | True |
four_letter_word_white_list | 4lw 命令白名单。 | conf, cons, crst, envi, ruok, srst, srvr, stat, wchs, dirs, mntr, isro, rcvr, apiv, csnp, lgif, rqld, ydld |
enable_ipv6 | 启用 IPv6 | True |
其他常见参数从 ClickHouse 服务器配置继承而来(listen_host、logger 等)。
内部协调设置
内部协调设置位于 <keeper_server>.<coordination_settings> 部分,具有以下参数
| 参数 | 描述 | 默认值 |
|---|---|---|
operation_timeout_ms | 单个客户端操作的超时时间(毫秒) | 10000 |
min_session_timeout_ms | 客户端会话的最小超时时间(毫秒) | 10000 |
session_timeout_ms | 客户端会话的最大超时时间(毫秒) | 100000 |
dead_session_check_period_ms | ClickHouse Keeper 检查死会话并删除它们的频率(毫秒) | 500 |
heart_beat_interval_ms | ClickHouse Keeper leader 向 followers 发送心跳的频率(毫秒) | 500 |
election_timeout_lower_bound_ms | 如果 follower 在此间隔内未收到 leader 的心跳,则它可以启动 leader 选举。必须小于或等于 election_timeout_upper_bound_ms。理想情况下,它们不应该相等。 | 1000 |
election_timeout_upper_bound_ms | 如果 follower 在此间隔内未收到 leader 的心跳,则必须启动 leader 选举。 | 2000 |
rotate_log_storage_interval | 将多少条日志记录存储在单个文件中。 | 100000 |
reserved_log_items | 在压缩之前存储多少条协调日志记录。 | 100000 |
snapshot_distance | ClickHouse Keeper 将创建新快照的频率(以日志中的记录数为单位)。 | 100000 |
snapshots_to_keep | 保留多少个快照。 | 3 |
stale_log_gap | leader 认为 follower 过时并向其发送快照而不是日志的阈值。 | 10000 |
fresh_log_gap | 节点何时变为新鲜。 | 200 |
max_requests_batch_size | 在将其发送到 RAFT 之前请求批处理中的最大大小。 | 100 |
force_sync | 在每次写入协调日志时调用 fsync。 | true |
quorum_reads | 通过整个 RAFT 共识以类似的速度执行读取请求作为写入。 | false |
raft_logs_level | 关于协调的文本日志记录级别(trace、debug 等)。 | 系统默认 |
auto_forwarding | 允许将来自 followers 的写入请求转发到 leader。 | true |
shutdown_timeout | 等待完成内部连接并关闭(毫秒)。 | 5000 |
startup_timeout | 如果服务器在指定超时时间内无法连接到其他仲裁参与者,它将终止(毫秒)。 | 30000 |
async_replication | 启用异步复制。保留所有写入和读取保证,同时实现更好的性能。默认情况下禁用设置,以不破坏向后兼容性 | false |
latest_logs_cache_size_threshold | 最新日志条目内存中缓存的最大总大小 | 1GiB |
commit_logs_cache_size_threshold | 用于提交的下一个日志条目的内存中缓存的最大总大小 | 500MiB |
disk_move_retries_wait_ms | 在磁盘之间移动文件失败后重试之间的等待时间 | 1000 |
disk_move_retries_during_init | 在初始化期间磁盘之间移动文件失败后的重试次数 | 100 |
experimental_use_rocksdb | 将 rocksdb 用作后端存储 | 0 |
仲裁配置位于 <keeper_server>.<raft_configuration> 部分,包含服务器描述。
整个仲裁的唯一参数是 secure,它为仲裁参与者之间的通信启用加密连接。如果需要 SSL 连接进行节点之间的内部通信,则可以将该参数设置为 true,否则可以不指定。
每个 <server> 的主要参数是
id— 仲裁中的服务器标识符。hostname— 放置此服务器的主机名。port— 此服务器侦听连接的端口。can_become_leader— 设置为false以将服务器设置为learner。如果省略,则值为true。
在更改 ClickHouse Keeper 集群的拓扑(例如,替换服务器)的情况下,请确保保持 server_id 到 hostname 的映射一致,并避免对不同的服务器混淆或重用现有的 server_id(例如,如果依赖自动化脚本来部署 ClickHouse Keeper)
如果 Keeper 实例的主机可以更改,我们建议定义并使用主机名而不是原始 IP 地址。更改主机名等于删除并重新添加服务器,在某些情况下可能无法执行此操作(例如,没有足够的 Keeper 实例来满足仲裁要求)。
默认情况下禁用 async_replication 以避免破坏向后兼容性。如果集群中的所有 Keeper 实例都运行支持 async_replication(v23.9+)的版本,我们建议启用它,因为它可以在没有任何缺点的情况下提高性能。
可以在 集成测试 中找到具有三个节点的仲裁配置示例,带有 test_keeper_ 前缀。服务器 #1 的示例配置
如何运行
ClickHouse Keeper 捆绑在 ClickHouse 服务器包中,只需将 <keeper_server> 配置添加到你的 /etc/your_path_to_config/clickhouse-server/config.xml 并像往常一样启动 ClickHouse 服务器。如果你想运行独立的 ClickHouse Keeper,你可以以类似的方式启动它,使用
如果你没有符号链接 (clickhouse-keeper),你可以创建它或将 keeper 作为参数传递给 clickhouse
四字母单词命令
ClickHouse Keeper 还提供 4lw 命令,这些命令几乎与 Zookeeper 相同。每个命令由四个字母组成,例如 mntr、stat 等。有一些更有趣的命令:stat 提供有关服务器和连接客户端的一些常规信息,而 srvr 和 cons 提供有关服务器和连接的扩展详细信息。
4lw 命令具有白名单配置 four_letter_word_white_list,其默认值为 conf,cons,crst,envi,ruok,srst,srvr,stat,wchs,dirs,mntr,isro,rcvr,apiv,csnp,lgif,rqld,ydld。
你可以通过 telnet 或 nc 在客户端端口上向 ClickHouse Keeper 发出命令。
下面是详细的 4lw 命令
ruok:测试服务器是否在非错误状态下运行。如果服务器正在运行,它将响应imok。否则,它将根本不响应。imok的响应并不一定表示服务器已加入仲裁,只是服务器进程处于活动状态并绑定到指定的客户端端口。使用“stat”获取有关仲裁和客户端连接信息的详细信息。
mntr: 输出可用于监控集群健康状况的变量列表。
srvr: 列出服务器的完整详细信息。
stat: 列出服务器和连接客户端的简要详细信息。
srst: 重置服务器统计信息。该命令将影响srvr、mntr和stat的结果。
conf: 打印服务配置的详细信息。
cons: 列出连接到此服务器的所有客户端的完整连接/会话详细信息。包括接收/发送的数据包数量、会话 ID、操作延迟、执行的最后一个操作等信息…
crst: 重置所有连接的连接/会话统计信息。
envi: 打印服务环境的详细信息
dirs: 显示快照和日志文件在字节中的总大小
isro: 测试服务器是否以只读模式运行。如果服务器处于只读模式,将响应ro;如果未处于只读模式,将响应rw。
wchs: 列出服务器上监视的简要信息。
wchc: 列出服务器上监视的详细信息,按会话划分。此命令输出一个会话(连接)列表,以及相关的监视(路径)。请注意,根据监视的数量,此操作可能会很昂贵(影响服务器性能),请谨慎使用。
wchp: 列出服务器上监视的详细信息,按路径划分。此命令输出一个路径(znode)列表,以及相关的会话。请注意,根据监视的数量,此操作可能会很昂贵(即影响服务器性能),请谨慎使用。
dump: 列出未完成的会话和临时节点。这仅适用于 leader。
csnp: 安排快照创建任务。如果成功,则返回已提交的最后一个日志索引;如果失败,则返回Failed to schedule snapshot creation task.。请注意,lgif命令可以帮助您确定快照是否完成。
lgif: Keeper 日志信息。first_log_idx:我在日志存储中的第一个日志索引;first_log_term:我在日志存储中的第一个日志项;last_log_idx:我在日志存储中的最后一个日志索引;last_log_term:我在日志存储中的最后一个日志项;last_committed_log_idx:我在状态机中提交的最后一个日志索引;leader_committed_log_idx:从我的角度来看,leader 提交的日志索引;target_committed_log_idx:应该提交的目标日志索引;last_snapshot_idx:最后一个快照中最大的已提交日志索引。
rqld: 请求成为新的 leader。如果请求已发送,则返回Sent leadership request to leader.;如果请求未发送,则返回Failed to send leadership request to leader.。请注意,如果节点已经是 leader,则结果与请求已发送相同。
ftfl: 列出所有功能标志以及它们是否为 Keeper 实例启用。
ydld: 请求放弃领导权并成为 follower。如果接收到请求的服务器是 leader,它将首先暂停写入操作,等待继任者(当前 leader 永远不能是继任者)完成最新日志的同步,然后辞职。继任者将自动选择。如果请求已发送,则返回Sent yield leadership request to leader.;如果请求未发送,则返回Failed to send yield leadership request to leader.。请注意,如果节点已经是 follower,则结果与请求已发送相同。
pfev: 返回收集到的所有事件的值。对于每个事件,它返回事件名称、事件值和事件描述。
HTTP 控制
ClickHouse Keeper 提供了一个 HTTP 接口来检查副本是否准备好接收流量。它可用于云环境,例如 Kubernetes。
启用 /ready 端点的配置示例
功能标志
Keeper 与 ZooKeeper 及其客户端完全兼容,但它也引入了一些 ClickHouse 客户端可用的独特功能和请求类型。由于这些功能可能会引入向后不兼容的更改,因此大多数功能默认情况下是禁用的,并且可以使用 keeper_server.feature_flags 配置启用。可以显式禁用所有功能。如果您想为您的 Keeper 集群启用新功能,我们建议您首先将集群中的所有 Keeper 实例更新到支持该功能的版本,然后启用该功能本身。
禁用 multi_read 并启用 check_not_exists 的功能标志配置示例
以下功能可用
| 特性 | 描述 | 默认值 |
|---|---|---|
multi_read | 支持读取多请求 | 1 |
filtered_list | 支持按节点类型(临时或持久)过滤结果的列表请求 | 1 |
check_not_exists | 支持 CheckNotExists 请求,该请求断言节点不存在 | 1 |
create_if_not_exists | 支持 CreateIfNotExists 请求,该请求将尝试创建一个节点(如果它不存在)。如果它存在,则不应用任何更改,并返回 ZOK | 1 |
remove_recursive | 支持 RemoveRecursive 请求,该请求删除节点及其子树 | 1 |
从版本 25.7 开始,默认情况下启用了一些功能标志。
将 Keeper 升级到 25.7+ 的推荐方法是先升级到版本 24.9+。
从 ZooKeeper 迁移
无法无缝迁移 ZooKeeper 到 ClickHouse Keeper。您必须停止 ZooKeeper 集群,转换数据,然后启动 ClickHouse Keeper。clickhouse-keeper-converter 工具允许将 ZooKeeper 日志和快照转换为 ClickHouse Keeper 快照。它仅适用于 ZooKeeper > 3.4。迁移步骤
-
停止所有 ZooKeeper 节点。
-
可选,但建议:找到 ZooKeeper leader 节点,启动并停止它。这将强制 ZooKeeper 创建一致的快照。
-
在 leader 上运行
clickhouse-keeper-converter,例如
- 将快照复制到配置了
keeper的 ClickHouse 服务器节点,或启动 ClickHouse Keeper 代替 ZooKeeper。快照必须持久存在于所有节点上,否则,空节点可能会更快,并且其中一个节点可能会成为 leader。
keeper-converter 工具不可从 Keeper 独立二进制文件中获得。如果您安装了 ClickHouse,可以直接使用该二进制文件
否则,您可以 下载二进制文件 并按照上述说明运行该工具,而无需安装 ClickHouse。
丢失仲裁后的恢复
由于 ClickHouse Keeper 使用 Raft,因此它可以容忍一定数量的节点崩溃,具体取决于集群大小。
例如,对于 3 个节点的集群,如果只有 1 个节点崩溃,它将继续正常工作。
集群配置可以动态配置,但有一些限制。重新配置也依赖于 Raft,因此要从集群中添加/删除节点,您需要拥有仲裁。如果您同时丢失了集群中的太多节点,而无法再次启动它们,Raft 将停止工作,并且不允许您使用常规方式重新配置集群。
但是,ClickHouse Keeper 具有恢复模式,允许您强制使用单个节点重新配置集群。只有在无法再次启动节点或在同一端点启动新实例时,才应将其作为最后的手段使用。
继续之前需要注意的重要事项
- 确保失败的节点无法再次连接到集群。
- 在指定步骤之前,不要启动任何新节点。
确保上述事项为真后,您需要执行以下操作
- 选择一个 Keeper 节点作为您的新 leader。请注意,该节点的数据将用于整个集群,因此我们建议使用具有最新状态的节点。
- 在执行任何操作之前,请备份所选节点的
log_storage_path和snapshot_storage_path文件夹。 - 在您想要使用的所有节点上重新配置集群。
- 将四字母命令
rcvr发送到您选择的节点,这将使该节点进入恢复模式,或者停止所选节点上的 Keeper 实例,并使用--force-recovery参数重新启动它。 - 逐个启动新节点上的 Keeper 实例,确保在启动下一个实例之前,
mntr返回follower作为zk_server_state。 - 在恢复模式下,leader 节点在与新节点实现仲裁之前,将为
mntr命令返回错误消息,并拒绝来自客户端和 follower 的任何请求。 - 在实现仲裁后,leader 节点将返回到正常的运行模式,接受使用 Raft 验证的所有请求,
mntr应返回leader作为zk_server_state。
使用磁盘与 Keeper
Keeper 支持用于存储快照、日志文件和状态文件的 外部磁盘 的子集。
支持的磁盘类型是
- s3_plain
- s3
- local
以下是配置中包含的磁盘定义示例。
要使用磁盘存储日志,应将 keeper_server.log_storage_disk 配置设置为磁盘的名称。要使用磁盘存储快照,应将 keeper_server.snapshot_storage_disk 配置设置为磁盘的名称。此外,可以使用 keeper_server.latest_log_storage_disk 和 keeper_server.latest_snapshot_storage_disk 分别使用不同的磁盘存储最新的日志或快照。在这种情况下,Keeper 会在创建新的日志或快照时自动将文件移动到正确的磁盘。要使用磁盘存储状态文件,应将 keeper_server.state_storage_disk 配置设置为磁盘的名称。
在磁盘之间移动文件是安全的,如果在传输过程中 Keeper 停止,则不会有数据丢失的风险。在文件完全移动到新磁盘之前,不会从旧磁盘中删除它。
将 keeper_server.coordination_settings.force_sync 设置为 true(默认值为 true)的 Keeper 无法满足所有类型的磁盘的一些保证。目前,只有 local 类型的磁盘才支持持久同步。如果使用 force_sync,则 log_storage_disk 应该是一个 local 磁盘(如果未使用 latest_log_storage_disk)。如果使用 latest_log_storage_disk,则它始终应该是一个 local 磁盘。如果禁用 force_sync,则可以使用任何设置中的所有类型的磁盘。
Keeper 实例的可能存储设置如下
此实例会将所有最新的日志存储在磁盘 log_s3_plain 上,而最新的日志将存储在磁盘 log_local 上。相同的逻辑适用于快照,所有最新的快照都将存储在 snapshot_s3_plain 上,而最新的快照将存储在 snapshot_local 磁盘上。
更改磁盘设置
在应用新的磁盘配置之前,请手动备份所有 Keeper 日志和快照。
如果定义了分层磁盘配置(使用单独的磁盘存储最新文件),Keeper 将尝试在启动时自动将文件移动到正确的磁盘。 之前的保证仍然适用;在文件完全移动到新磁盘之前,它不会从旧磁盘中删除,因此可以安全地进行多次重启。
如果需要将文件移动到完全新的磁盘(或从 2 磁盘配置移动到单个磁盘配置),可以使用 keeper_server.old_snapshot_storage_disk 和 keeper_server.old_log_storage_disk 的多个定义。
以下配置展示了如何从之前的 2 磁盘配置移动到完全新的单磁盘配置
在启动时,所有日志文件都将从 log_local 和 log_s3_plain 移动到 log_local2 磁盘。 同样,所有快照文件都将从 snapshot_local 和 snapshot_s3_plain 移动到 snapshot_local2 磁盘。
配置日志缓存
为了最大限度地减少从磁盘读取的数据量,Keeper 在内存中缓存日志条目。 如果请求量大,日志条目将占用过多内存,因此缓存的日志量受到限制。 这些配置控制着限制:
latest_logs_cache_size_threshold- 缓存中存储的最新日志的总大小commit_logs_cache_size_threshold- 需要接下来提交的后续日志的总大小
如果默认值太大,可以通过减小这两个配置来减少内存使用量。
可以使用 pfev 命令来检查从每个缓存和从文件中读取的日志量。 还可以使用 Prometheus 端点的指标来跟踪两个缓存的当前大小。
Prometheus
Keeper 可以暴露指标数据,供 Prometheus 抓取。
设置
endpoint– Prometheus 服务器抓取指标的 HTTP 端点。 从 '/' 开始。port–endpoint的端口。metrics– 标志,设置为从 system.metrics 表中暴露指标。events– 标志,设置为从 system.events 表中暴露指标。asynchronous_metrics– 标志,设置为从 system.asynchronous_metrics 表中暴露当前指标值。
示例
检查 (将 127.0.0.1 替换为您的 ClickHouse 服务器的 IP 地址或主机名)
请参阅 ClickHouse Cloud Prometheus 集成。
ClickHouse Keeper 用户指南
本指南提供了配置 ClickHouse Keeper 的简单和最小设置,并提供了一个测试分布式操作的示例。 该示例使用 Linux 上的 3 个节点执行。
1. 配置节点使用 Keeper 设置
-
在 3 个主机 (
chnode1,chnode2,chnode3) 上安装 3 个 ClickHouse 实例。(有关安装 ClickHouse 的详细信息,请参阅 快速入门。) -
在每个节点上,添加以下条目以允许通过网络接口进行外部通信。
-
将以下 ClickHouse Keeper 配置添加到所有三个服务器,并更新每个服务器的
<server_id>设置;对于chnode1将为1,chnode2将为2,依此类推。这些是上面使用的基本设置
参数 描述 示例 tcp_port Keeper 客户端使用的端口 9181 相当于 zookeeper 中的 2181 默认值 server_id 用于 raft 配置的每个 ClickHouse Keeper 服务器的标识符 1 coordination_settings 用于诸如超时等参数的部分 超时:10000,日志级别:trace server 参与的服务器定义 每个服务器定义的列表 raft_configuration Keeper 集群中每个服务器的设置 每个服务器及其设置 id Keeper 服务中服务器的数字 ID 1 主机名 Keeper 集群中每个服务器的主机名、IP 或 FQDN chnode1.domain.comport 用于服务器间 Keeper 连接的监听端口 9234 -
启用 Zookeeper 组件。 它将使用 ClickHouse Keeper 引擎
这些是上面使用的基本设置
参数 描述 示例 node ClickHouse Keeper 连接的节点列表 每个服务器的设置条目 host 每个 ClickHouse Keeper 节点的主机名、IP 或 FQDN chnode1.domain.comport ClickHouse Keeper 客户端端口 9181 -
重启 ClickHouse 并验证每个 Keeper 实例是否正在运行。 在每个服务器上执行以下命令。
ruok命令在 Keeper 正在运行且健康时返回imok -
system数据库有一个名为zookeeper的表,其中包含 ClickHouse Keeper 实例的详细信息。 让我们查看该表该表如下所示
2. 在 ClickHouse 中配置集群
-
让我们配置一个简单的集群,其中包含 2 个分片,并且仅在 2 个节点上有一个副本。 第三个节点将用于实现 ClickHouse Keeper 中的 quorum 要求。 更新
chnode1和chnode2上的配置。 以下集群定义每个节点一个分片,总共 2 个分片,没有复制。 在此示例中,一些数据将在一个节点上,而另一些数据将在另一个节点上参数 描述 示例 shard 集群定义中副本的列表 每个分片的副本列表 replica 每个副本的设置列表 每个副本的设置条目 host 将托管副本分片的服务器的主机名、IP 或 FQDN chnode1.domain.comport 用于使用本机 tcp 协议进行通信的端口 9000 用户 用于验证集群实例的用户名 默认 password 用于允许连接到集群实例的用户密码 ClickHouse123! -
重启 ClickHouse 并验证是否创建了集群
您应该看到您的集群
3. 创建和测试分布式表
-
使用 ClickHouse 客户端在
chnode1上创建新的数据库。ON CLUSTER子句会自动在两个节点上创建数据库。 -
在
db1数据库上创建一个新表。 同样,ON CLUSTER会在两个节点上创建表。 -
在
chnode1节点上,添加几行 -
在
chnode2节点上添加几行 -
请注意,在每个节点上运行
SELECT语句只会显示该节点上的数据。 例如,在chnode1上在
chnode2上 -
-
您可以创建一个
Distributed表来表示两个分片上的数据。 具有Distributed表引擎的表不存储自己的任何数据,但允许在多个服务器上进行分布式查询处理。 读取命中所有分片,写入可以分布到分片上。 在chnode1上运行以下查询 -
请注意,查询
dist_table返回来自两个分片的四行数据
摘要
本指南演示了如何使用 ClickHouse Keeper 设置集群。 使用 ClickHouse Keeper,您可以配置集群并定义可以在分片之间复制的分布式表。
使用唯一路径配置 ClickHouse Keeper
本页面不适用于 ClickHouse Cloud。此处记录的流程在 ClickHouse Cloud 服务中已自动化。
描述
本文介绍了如何使用内置的 {uuid} 宏设置在 ClickHouse Keeper 或 ZooKeeper 中创建唯一条目。 唯一路径在频繁创建和删除表时很有帮助,因为这避免了等待几分钟进行 Keeper 垃圾回收以删除路径条目,因为每次创建路径都会在该路径中使用一个新的 uuid;路径永远不会被重用。
示例环境
一个三节点集群,将在所有三个节点上配置 ClickHouse Keeper,并在两个节点上配置 ClickHouse。 这为 ClickHouse Keeper 提供了三个节点(包括一个仲裁节点),以及由两个副本组成的单个 ClickHouse 分片。
| node | description |
|---|---|
chnode1.marsnet.local | 数据节点 - 集群 cluster_1S_2R |
chnode2.marsnet.local | 数据节点 - 集群 cluster_1S_2R |
chnode3.marsnet.local | ClickHouse Keeper 仲裁节点 |
集群配置示例
设置使用 {uuid} 的表的过程
- 在每个服务器上配置宏,例如服务器 1
请注意,我们为 shard 和 replica 定义了宏,但 {uuid} 在这里没有定义,它是内置的,无需定义。
- 创建数据库
- 使用宏和
{uuid}在集群上创建表
- 创建分布式表
测试
- 将数据插入到第一个节点(例如
chnode1)
- 将数据插入到第二个节点(例如,
chnode2)
- 使用分布式表查看记录
替代方案
默认复制路径可以通过宏和使用 {uuid} 预先定义
- 为每个节点上的表设置默认值
如果节点用于某些数据库,则可以在每个节点上定义一个宏 {database}。
- 无需显式参数即可创建表
- 验证它使用了默认配置中使用的设置
故障排除
获取表信息和 UUID 的示例命令
获取有关上述表中 zookeeper 中信息的示例命令
如果从早期版本升级,数据库必须是 Atomic,则 default 数据库可能是 Ordinary 类型。
检查
例如,
ClickHouse Keeper 动态重新配置
本页面不适用于 ClickHouse Cloud。此处记录的流程在 ClickHouse Cloud 服务中已自动化。
描述
如果启用了 keeper_server.enable_reconfiguration,ClickHouse Keeper 部分支持 ZooKeeper reconfig 命令进行动态集群重新配置。
如果关闭此设置,您可以通过手动更改副本的 raft_configuration 部分来重新配置集群。确保您编辑所有副本的文件,因为只有 leader 会应用更改。或者,您可以通过任何 ZooKeeper 兼容客户端发送 reconfig 查询。
虚拟节点 /keeper/config 包含以下格式的最新提交的集群配置
- 每个服务器条目由换行符分隔。
server_type要么是participant,要么是learner(learner 不参与 leader 选举)。server_priority是一个非负整数,用于告诉 哪些节点应该在 leader 选举中优先。优先级为 0 表示服务器将永远不会成为 leader。
示例
您可以使用 reconfig 命令添加新服务器、删除现有服务器以及更改现有服务器的优先级,以下是一些示例(使用 clickhouse-keeper-client)
以下是 kazoo 的示例
joining 中的服务器应采用上述服务器格式。服务器条目应由逗号分隔。在添加新服务器时,您可以省略 server_priority(默认值为 1)和 server_type(默认值为 participant)。
如果要更改现有服务器优先级,请将其添加到 joining 中,目标优先级为目标值。服务器主机、端口和类型必须与现有服务器配置相同。
服务器的添加和删除顺序按照 joining 和 leaving 中出现的顺序进行。joining 中的所有更新在 leaving 中的更新之前处理。
在 Keeper 重新配置实现中存在一些注意事项
-
仅支持增量重新配置。带有非空
new_members的请求被拒绝。ClickHouse Keeper 实现依赖于 NuRaft API 来动态更改成员资格。NuRaft 有一种逐个添加单个服务器或删除单个服务器的方式。这意味着对配置的每次更改(
joining的每个部分,leaving的每个部分)必须单独决定。因此,没有可用的批量重新配置,因为它会误导最终用户。更改服务器类型(participant/learner)也不可行,因为它不受 NuRaft 支持,唯一的方法是删除并添加服务器,这同样会产生误导。
-
您无法使用返回的
znodestat值。 -
不使用
from_version字段。所有带有设置from_version的请求都被拒绝。这是因为/keeper/config是一个虚拟节点,这意味着它不存储在持久存储中,而是根据每个请求指定的节点配置动态生成。做出此决定是为了不重复数据,因为 NuRaft 已经存储了此配置。 -
与 ZooKeeper 不同,没有办法通过提交
sync命令来等待集群重新配置。新配置将最终应用,但没有时间保证。 -
reconfig命令可能由于各种原因而失败。您可以检查集群的状态,查看更新是否已应用。
将单节点 keeper 转换为集群
有时有必要将实验性的 keeper 节点扩展为集群。以下是针对 3 个节点集群逐步执行此操作的方案
- 重要提示:新节点必须以小于当前法定数量的批次添加,否则它们将在自身中选举出 leader。在本例中,一次一个。
- 现有的 keeper 节点必须启用
keeper_server.enable_reconfiguration配置参数。 - 使用完整的 keeper 集群新配置启动第二个节点。
- 启动后,使用
reconfig将其添加到节点 1。 - 现在,启动第三个节点并使用
reconfig添加它。 - 通过添加新的 keeper 节点并重新启动它来更新
clickhouse-server配置以应用更改。 - 更新节点 1 的 raft 配置,并可选地重新启动它。
为了确信该过程,这里有一个 sandbox 仓库。
不支持的功能
虽然 ClickHouse Keeper 旨在与 ZooKeeper 完全兼容,但目前仍有一些功能尚未实现(尽管开发正在进行中)
create不支持返回Stat对象create不支持 TTLaddWatch不适用于PERSISTENT监视removeWatch和removeAllWatches不受支持- 不支持
setWatches - 创建
CONTAINER类型 znode 不受支持 SASL 身份验证不受支持