跳至主要内容

集群部署

本教程假设您已经设置了一个本地 ClickHouse 服务器

通过本教程,您将学习如何设置一个简单的 ClickHouse 集群。它将很小,但具有容错性和可扩展性。然后,我们将使用其中一个示例数据集将其填充数据并执行一些演示查询。

集群部署

此 ClickHouse 集群将是一个同构集群。以下是步骤

  1. 在集群的所有机器上安装 ClickHouse 服务器
  2. 在配置文件中设置集群配置
  3. 在每个实例上创建本地表
  4. 创建一个分布式表

一个分布式表是一种对 ClickHouse 集群中本地表的“视图”。来自分布式表的 SELECT 查询使用所有集群分片的资源执行。您可以为多个集群指定配置并创建多个分布式表以提供对不同集群的视图。

这是一个包含三个分片(每个分片一个副本)的集群的示例配置

<remote_servers>
<perftest_3shards_1replicas>
<shard>
<replica>
<host>example-perftest01j.clickhouse.com</host>
<port>9000</port>
</replica>
</shard>
<shard>
<replica>
<host>example-perftest02j.clickhouse.com</host>
<port>9000</port>
</replica>
</shard>
<shard>
<replica>
<host>example-perftest03j.clickhouse.com</host>
<port>9000</port>
</replica>
</shard>
</perftest_3shards_1replicas>
</remote_servers>

为了进一步演示,让我们使用与我们在单节点部署教程中用于 hits_v1 的相同的 CREATE TABLE 查询创建一个新的本地表,但使用不同的表名

CREATE TABLE tutorial.hits_local (...) ENGINE = MergeTree() ...

创建分布式表提供了对集群中本地表的视图

CREATE TABLE tutorial.hits_all AS tutorial.hits_local
ENGINE = Distributed(perftest_3shards_1replicas, tutorial, hits_local, rand());

一种常见的做法是在集群的所有机器上创建类似的分布式表。这允许在集群的任何机器上运行分布式查询。还有一个替代方案,可以使用 remote 表函数为给定的 SELECT 查询创建一个临时分布式表。

让我们运行 INSERT SELECT 到分布式表中,以将表传播到多个服务器。

INSERT INTO tutorial.hits_all SELECT * FROM tutorial.hits_v1;

正如您所料,如果计算密集型查询利用 3 台服务器而不是 1 台服务器,则运行速度会快 N 倍。

在这种情况下,我们使用一个包含 3 个分片的集群,每个分片包含一个副本。

为了在生产环境中提供弹性,我们建议每个分片包含 2-3 个副本,分布在多个可用区或数据中心(或至少机架)中。请注意,ClickHouse 支持无限数量的副本。

这是一个包含三个副本的一个分片的集群的示例配置

<remote_servers>
...
<perftest_1shards_3replicas>
<shard>
<replica>
<host>example-perftest01j.clickhouse.com</host>
<port>9000</port>
</replica>
<replica>
<host>example-perftest02j.clickhouse.com</host>
<port>9000</port>
</replica>
<replica>
<host>example-perftest03j.clickhouse.com</host>
<port>9000</port>
</replica>
</shard>
</perftest_1shards_3replicas>
</remote_servers>

要启用原生复制,需要 ZooKeeper。ClickHouse 负责所有副本上的数据一致性,并在发生故障后自动运行恢复过程。建议在单独的服务器上部署 ZooKeeper 集群(在这些服务器上没有运行其他进程,包括 ClickHouse)。

注意

ZooKeeper 不是严格的要求:在某些简单的情况下,您可以通过从应用程序代码将其写入所有副本中来复制数据。**不建议**使用此方法,因为在这种情况下,ClickHouse 将无法保证所有副本上的数据一致性。因此,它成为您应用程序的责任。

ZooKeeper 位置在配置文件中指定

<zookeeper>
<node>
<host>zoo01.clickhouse.com</host>
<port>2181</port>
</node>
<node>
<host>zoo02.clickhouse.com</host>
<port>2181</port>
</node>
<node>
<host>zoo03.clickhouse.com</host>
<port>2181</port>
</node>
</zookeeper>

此外,我们需要设置宏来识别每个分片和副本,这些宏在创建表时使用

<macros>
<shard>01</shard>
<replica>01</replica>
</macros>

如果在复制表创建时没有副本,则会实例化一个新的第一个副本。如果已经有活动副本,则新副本会从现有副本克隆数据。您可以选择先创建所有复制表,然后插入数据。另一种选择是创建一些副本,并在数据插入后或期间添加其他副本。

CREATE TABLE tutorial.hits_replica (...)
ENGINE = ReplicatedMergeTree(
'/clickhouse_perftest/tables/{shard}/hits',
'{replica}'
)
...

这里我们使用 ReplicatedMergeTree 表引擎。在参数中,我们指定包含分片和副本标识符的 ZooKeeper 路径。

INSERT INTO tutorial.hits_replica SELECT * FROM tutorial.hits_local;

复制以多主模式运行。数据可以加载到任何副本中,然后系统会自动将其与其他实例同步。复制是异步的,因此在给定时刻,并非所有副本都可能包含最近插入的数据。至少应有一个副本处于活动状态以允许数据摄取。其他副本将在重新激活后同步数据并修复一致性。请注意,此方法允许以较低的可能性丢失最近插入的数据。