故障容忍的复制
描述
在此架构中,配置了五台服务器。两台用于托管数据的副本。其他三台服务器用于协调数据的复制。在此示例中,我们将创建一个数据库和一个将通过 ReplicatedMergeTree 表引擎在两个数据节点之间进行复制的表。
级别:基础
术语
副本
数据的副本。ClickHouse始终至少有一个数据副本,因此副本的最小数量为1。这是一个重要细节,您可能不习惯将数据的原始副本视为副本,但这是ClickHouse代码和文档中使用的术语。添加数据的第二个副本可以提供故障容错能力。
分片
数据的子集。ClickHouse始终至少为您的数据提供一个分片,因此如果您不将数据拆分到多个服务器上,您的数据将存储在一个分片中。在多个服务器上对数据进行分片可以在超出单个服务器的容量时分担负载。目标服务器由分片键确定,并在创建分布式表时定义。分片键可以是随机的,也可以是哈希函数的输出。涉及分片的部署示例将使用 rand()
作为分片键,并提供有关何时以及如何选择不同分片键的进一步信息。
分布式协调
ClickHouse Keeper提供数据复制和分布式DDL查询执行的协调系统。ClickHouse Keeper与Apache ZooKeeper兼容。
环境
架构图

节点 | 描述 |
---|---|
clickhouse-01 | 数据 |
clickhouse-02 | 数据 |
clickhouse-keeper-01 | 分布式协调 |
clickhouse-keeper-02 | 分布式协调 |
clickhouse-keeper-03 | 分布式协调 |
在生产环境中,我们强烈建议为 ClickHouse Keeper 使用 专用 主机。在测试环境中,ClickHouse Server 和 ClickHouse Keeper 可以在同一服务器上运行。另一个基本示例 扩展 使用了这种方法。在这个示例中,我们展示了将 Keeper 与 ClickHouse Server 分离的推荐方法。Keeper 服务器可以更小,4GB RAM 通常足够每个 Keeper 服务器,直到你的 ClickHouse 服务器变得非常庞大。
安装
在两台服务器 clickhouse-01
和 clickhouse-02
上安装 ClickHouse 服务器和客户端,按照 您所选择的归档类型的说明 (.deb, .rpm, .tar.gz 等)。
在三台服务器 clickhouse-keeper-01
、clickhouse-keeper-02
和 clickhouse-keeper-03
上安装 ClickHouse Keeper,遵循 您所选择的归档类型的说明 (.deb, .rpm, .tar.gz 等)。
编辑配置文件
在通过添加或编辑配置文件来配置 ClickHouse Server 时,您应该:
- 将文件添加到
/etc/clickhouse-server/config.d/
目录 - 将文件添加到
/etc/clickhouse-server/users.d/
目录 - 保持
/etc/clickhouse-server/config.xml
文件不变 - 保持
/etc/clickhouse-server/users.xml
文件不变
clickhouse-01 配置
对于 clickhouse-01,有五个配置文件。您可以选择将这些文件合并为一个文件,但为了文档的清晰起见,分别查看这些文件可能更简单。当您浏览配置文件时,您会看到 clickhouse-01 和 clickhouse-02 之间的大部分配置是相同的;差异将被突出显示。
网络和日志配置
这些值可以根据需要进行自定义。此示例配置为您提供:
- 一个将在 1000M 处翻滚三次的调试日志
- 使用
clickhouse-client
连接时显示的名称为cluster_1S_2R node 1
- ClickHouse 将在 8123 和 9000 端口上监听 IPV4 网络。
宏配置
宏 shard
和 replica
减少了分布式 DDL 的复杂性。配置的值会自动替换到您的 DDL 查询中,从而简化您的 DDL。此配置的宏指定了每个节点的分片和副本编号。
在这个 1 个分片 2 个副本的示例中,clickhouse-01 上的副本宏为 replica_1
,clickhouse-02 上的副本宏为 replica_2
。由于只有一个分片,分片宏在 clickhouse-01 和 clickhouse-02 上均为 1
。
复制和分片配置
从顶部开始:
- XML 的 remote_servers 部分指定了环境中的每个集群。属性
replace=true
将默认 ClickHouse 配置中的样本 remote_servers 替换为此文件中指定的 remote_server 配置。如果没有此属性,此文件中的远程服务器将附加到默认样本列表中。 - 在此示例中,有一个名为
cluster_1S_2R
的集群。 - 为名为
cluster_1S_2R
的集群创建了一个值为mysecretphrase
的秘密。该秘密跨环境中的所有远程服务器共享,以确保正确的服务器组合在一起。 - 集群
cluster_1S_2R
具有一个分片和两个副本。查看本文档开头的架构图,并与以下 XML 中的shard
定义进行比较。分片定义包含两个副本。每个副本的主机和端口被指定。一个副本存储在clickhouse-01
上,另一个副本存储在clickhouse-02
上。 - 分片的内部复制设置为 true。每个分片可以在配置文件中定义 internal_replication 参数。如果此参数设置为 true,则写入操作选择第一个健康副本并将数据写入其中。
配置 Keeper 的使用
此配置文件 use-keeper.xml
正在配置 ClickHouse Server 使用 ClickHouse Keeper 来协调复制和分布式 DDL。此文件指定 ClickHouse Server 应在 clickhouse-keeper-01 至 clickhouse-keeper-03 节点上使用 Keeper,端口为 9181,该文件在 clickhouse-01
和 clickhouse-02
上是相同的。
clickhouse-02 配置
由于 clickhouse-01 和 clickhouse-02 的配置非常相似,因此这里只指出差异。
网络和日志配置
此文件在 clickhouse-01 和 clickhouse-02 上相同,唯一的例外是 display_name
。
宏配置
宏配置在 clickhouse-01 和 clickhouse-02 之间有所不同。该节点的 replica
设置为 02
。
复制和分片配置
此文件在 clickhouse-01 和 clickhouse-02 上相同。
配置 Keeper 使用
此文件在 clickhouse-01 和 clickhouse-02 上相同。
clickhouse-keeper-01 配置
配置 ClickHouse Keeper 时,通过编辑配置文件你应该:
- 备份
/etc/clickhouse-keeper/keeper_config.xml
- 编辑
/etc/clickhouse-keeper/keeper_config.xml
文件
ClickHouse Keeper 提供数据复制和分布式 DDL 查询执行的协调系统。ClickHouse Keeper 与 Apache ZooKeeper 兼容。 此配置启用 ClickHouse Keeper,端口为 9181。突出显示的行指定此 Keeper 实例的 server_id
为 1。enable-keeper.xml
文件在三台服务器中的唯一差异就是这一点。clickhouse-keeper-02
将具有 server_id
设置为 2
,clickhouse-keeper-03
将具有 server_id
设置为 3
。 漂亮的配置部分在所有三台服务器上都是相同的,下面突出显示以显示 server_id
和 raft 配置内的 server
实例之间的关系。
如果出于任何原因替换或重建 Keeper 节点,请勿重用现有的 server_id
。例如,如果重建 server_id
为 2
的 Keeper 节点,请将其分配给 4
或更高的 server_id。
clickhouse-keeper-02 配置
clickhouse-keeper-01
和 clickhouse-keeper-02
之间只有一行差异。该节点的 server_id
设置为 2
。
clickhouse-keeper-03 配置
在 clickhouse-keeper-01
和 clickhouse-keeper-03
之间只有一行差异。该节点的 server_id
设置为 3
。
测试
要体验 ReplicatedMergeTree 和 ClickHouse Keeper,您可以运行以下命令:
- 在上面配置的集群上创建一个数据库
- 在数据库上使用 ReplicatedMergeTree 表引擎创建一个表
- 在一个节点上插入数据,并在另一个节点上查询
- 停止一个 ClickHouse 服务器节点
- 在运行的节点上插入更多数据
- 重启停止的节点
- 验证重新启动的节点在查询时数据是否可用
验证 ClickHouse Keeper 是否正在运行
mntr
命令用于验证 ClickHouse Keeper 是否正在运行,并获取有关三个 Keeper 节点关系的状态信息。在此示例中使用的配置中有三个节点协同工作。节点将选举一个领导者,剩余节点将是跟随者。mntr
命令提供与性能相关的信息,以及特定节点是否为跟随者或领导者。
您可能需要安装 netcat
以便向 Keeper 发送 mntr
命令。请参阅 nmap.org 页面获取下载信息。
验证 ClickHouse 集群功能
在一个 shell 中使用 clickhouse client
连接到节点 clickhouse-01
,并在另一个 shell 中连接到节点 clickhouse-02
。
- 在上面配置的集群上创建一个数据库
- 使用 ReplicatedMergeTree 表引擎在数据库上创建一个表
- 在一个节点上插入数据并在另一个节点上查询
- 在节点
clickhouse-02
上查询该表
- 在另一个节点上插入数据并在节点
clickhouse-01
上查询
-
停止一个 ClickHouse 服务器节点 通过运行与启动节点相类似的操作系统命令停止一个 ClickHouse 服务器节点。如果您使用
systemctl start
启动该节点,请使用systemctl stop
停止它。 -
在运行的节点上插入更多数据
选择数据:
- 重新启动停止的节点并从那里选择