在本示例中,你将学习如何搭建一个简单的 ClickHouse 集群, 并对数据进行复制。这里共配置了五台服务器,其中两台用于存放 数据副本,其余三台用于协调数据复制。你将要搭建的集群架构如下所示:
尽管可以在同一台服务器上同时运行 ClickHouse Server 和 ClickHouse Keeper,
但我们强烈建议在生产环境中为 ClickHouse Keeper 使用专用主机,
这也是我们将在本示例中演示的方法。Keeper server 所需配置可以更小,通常每个 Keeper server 配置 4GB RAM 就足够了,
至少在你的 ClickHouse Server 规模扩大之前都是如此。
前置条件
- 你之前已完成本地 ClickHouse 服务器的设置
- 你熟悉 ClickHouse 的基本配置概念,例如配置文件
- 你的机器上已安装 Docker
1
设置目录结构和测试环境
在本教程中,您将使用 Docker compose 搭建 ClickHouse 集群。该方案同样可以修改后适用于独立的本地机器、虚拟机或云实例。运行以下命令为本示例设置目录结构:将以下 创建以下子目录和文件:
docker-compose.yml 文件添加到 cluster_1S_2R 目录中:docker-compose.yml
config.d目录包含 ClickHouse server 配置文件config.xml, 其中定义了每个 ClickHouse 节点的自定义配置。该 配置会与每个 ClickHouse 安装自带的默认config.xmlClickHouse 配置 文件合并。users.d目录包含用户配置文件users.xml,其中 定义了用户的自定义配置。该配置会与每个 ClickHouse 安装自带的默认 ClickHouseusers.xml配置文件合并。
2
配置 ClickHouse 节点
服务器配置
现在修改位于fs/volumes/clickhouse-{}/etc/clickhouse-server/config.d 的每个空配置文件 config.xml。下方高亮显示的行需要根据各节点进行相应修改:以下将对上述配置文件的各个部分进行详细说明。
网络与日志
通过启用 listen host 设置,即可允许通过网络接口进行外部通信。这可确保 ClickHouse server 主机可被其他 主机访问:8123:9000:<logger> 块中定义。以下示例配置将生成一个调试日志,该日志在达到 1000M 时滚动,最多滚动三次:集群配置
集群配置在<remote_servers> 块中定义。
其中集群名称为 cluster_1S_2R。<cluster_1S_2R></cluster_1S_2R> 块定义了集群的布局,使用 <shard></shard> 和 <replica></replica> 配置项,并作为 distributed DDL queries 的模板,这些查询通过 ON CLUSTER 子句在整个集群中执行。默认情况下,distributed DDL queries 是被允许的,但也可以通过设置 allow_distributed_ddl_queries 将其关闭。internal_replication 设置为 true,这样数据只会写入其中一个副本。Keeper 配置
<ZooKeeper> 部分用于告知 ClickHouse,ClickHouse Keeper (或 ZooKeeper) 的运行位置。
由于我们使用的是 ClickHouse Keeper 集群,需要指定该集群中的每个 <node>,
并分别通过 <host> 和 <port> 标签指定其 hostname 和端口号。ClickHouse Keeper 的配置将在本教程的下一步中介绍。虽然可以将 ClickHouse Keeper 和 ClickHouse Server 部署在同一台服务器上,
但在生产环境中,我们强烈建议将 ClickHouse Keeper 部署在专用主机上。
宏配置
此外,<macros> 部分用于为复制表定义参数替换。这些替换项列于 system.macros 中,可在查询中使用 {shard} 和 {replica} 等替换占位符。这些将根据集群的布局分别定义。
用户配置
现在,将以下内容写入位于fs/volumes/clickhouse-{}/etc/clickhouse-server/users.d 的每个空配置文件 users.xml:/users.d/users.xml
在此示例中,为简便起见,default user 未设置密码。
在实际环境中,不建议这样做。
在此示例中,集群中所有节点上的
users.xml 文件都相同。3
配置 ClickHouse Keeper
Keeper 配置
为了使复制正常工作,需要先搭建并配置 ClickHouse Keeper 集群。ClickHouse Keeper 为数据复制提供协调系统, 可作为 ZooKeeper 的替代方案,当然也可以直接使用 ZooKeeper。 不过,推荐使用 ClickHouse Keeper,因为它能提供更好的保障和 可靠性,并且比 ZooKeeper 占用更少的资源。为了实现高可用性并 保持 quorum,建议至少运行三个 ClickHouse Keeper 节点。ClickHouse Keeper 可以与 ClickHouse 一起运行在集群的任何节点上,不过
更推荐将其部署在专用节点上,这样就可以独立于数据库集群对
ClickHouse Keeper 集群进行扩缩容和管理。
keeper_config.xml 文件:fs/volumes/clickhouse-keeper-{}/etc/clickhouse-keeper 中创建的空配置文件。下方高亮显示的内容需要改为各节点对应的具体值:/clickhouse-keeper/keeper_config.xml
每个配置文件都应包含以下唯一配置 (如下所示) 。
所使用的
server_id 对于集群中的对应 ClickHouse Keeper 节点必须是唯一的,
并且要与 <raft_configuration> 部分中定义的服务器 <id> 一致。
tcp_port 是 ClickHouse Keeper 客户端 使用的端口。4
测试设置
请确保你的机器上已运行 Docker。
在 你应该会看到 docker 开始拉取 ClickHouse 和 Keeper 镜像,
然后启动容器:要确认集群是否正常运行,请连接到 如果一切顺利,您将看到 ClickHouse 客户端提示符:运行以下查询,查看为哪些
主机定义了哪些集群拓扑:运行以下查询,检查 ClickHouse Keeper 集群的状态:下面的响应展示了来自 follower 节点的示例响应:下面的响应显示了 leader 节点返回的示例响应:至此,你已成功搭建了一个包含单个分片和两个副本的 ClickHouse 集群。
下一步,你将在该集群中创建一个表。
cluster_1S_2R 目录的根目录下,使用 docker-compose up 命令启动集群:clickhouse-01 或 clickhouse-02 之一,并运行
以下查询。下面显示的是连接到第一个节点的命令:Query
Response
Query
Response
mntr 命令也常用于验证 ClickHouse Keeper 是否正在运行,并获取三个 Keeper 节点之间关系的状态信息。
在此示例使用的配置中,有三个节点协同工作。
这些节点会选举出一个 leader,其余节点则为跟随者。mntr 命令会提供与性能相关的信息,以及特定节点是跟随者还是 leader。在 clickhouse-keeper-01、clickhouse-keeper-02 和
clickhouse-keeper-03 的 shell 中运行以下命令,以检查每个 Keeper 节点的状态。下面显示的是
clickhouse-keeper-01 的命令:Response
Response
5
创建数据库
现在你已经确认集群已正确设置并正常运行,接下来你将重新创建一个与英国房产价格
示例数据集教程中相同的表。该数据集包含自 1995 年以来英格兰和威尔士房地产成交价格的约 3000 万行
数据。在单独的终端选项卡或窗口中分别运行以下命令,以连接到每个主机的客户端:你可以从每台主机上的 在 你可以再次从每台主机的客户端运行与之前相同的查询,
以确认即使该查询仅在
clickhouse-client 运行下面的查询,以确认
除默认数据库外,尚未创建任何数据库:Query
Response
clickhouse-01 客户端中,使用
ON CLUSTER 子句执行以下分布式 DDL 查询,以创建一个名为 uk 的新数据库:clickhouse-01 上运行,
该数据库也已在整个集群中创建:6
在集群上创建表
现在数据库已创建完成,接下来在集群上创建一个表。
在任意一个主机客户端上运行以下查询:请注意,除了添加了
ON CLUSTER 子句并使用 ReplicatedMergeTree 引擎之外,它与原始 CREATE 语句中使用的查询完全相同;该语句出自
UK property prices 示例数据集教程。ON CLUSTER 子句用于分布式执行 CREATE、DROP、ALTER 和 RENAME 等 DDL (数据定义语言)
查询,以确保这些
schema 变更会应用到集群中的所有节点。ReplicatedMergeTree
引擎的工作方式与普通的 MergeTree 表引擎相同,但还会复制数据。你可以在 clickhouse-01 或 clickhouse-02 客户端中运行下面的查询,
以确认该表已在整个集群中创建:Query
Response
7
插入数据
由于数据集较大,完全摄取需要几分钟,我们将先插入一小部分数据。使用以下查询从 请注意,数据已在每台主机上完整地进行了复制:为了演示某台主机发生故障时的情况,请在任意一台主机上创建一个简单的测试数据库和测试表:与 但如果其中一台主机宕机,会发生什么?要模拟这种情况,请执行以下命令停止
运行以下命令确认主机已停止:现在使用以下命令重启 运行 如果您希望在此阶段摄取完整的英国房产价格数据集以便进行探索,可以执行以下查询:从
clickhouse-01 插入一个较小的数据子集:uk_price_paid 表一样,我们可以从任意主机插入数据:clickhouse-01:Response
clickhouse-01 现已停机,向测试表中再插入一行数据并查询该表:Response
clickhouse-01 (之后可再次运行 docker-compose ps 进行确认) :docker exec -it clickhouse-01 clickhouse-client 后,再次从 clickhouse-01 查询测试表:Query
Response
clickhouse-02 或 clickhouse-01 查询该表:Query
Response
结论
- 不间断地处理读查询
- 接受新的写入 (取决于你的一致性设置)
- 保持应用程序的服务可用性
- 自动从健康副本同步缺失的数据
- 无需人工干预即可恢复正常运行
- 快速恢复完整冗余