跳到主要内容
跳到主要内容

集群部署

本教程假设您已经设置了本地 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_v1CREATE 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 台服务器而不是一台服务器,则运行速度会快 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;

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