ClickHouse 集群模式 DDL

79 阅读2分钟

在 ClickHouse 集群模式下,创建表的 DDL 语句通常取决于你希望数据如何分布在集群中的各个节点上。一般来说,你会用到分布式表 (Distributed) 和分区表 (MergeTree 及其变种)。下面是一个常见的创建表的示例,包含分布式表和本地表。

假设我们有一个两节点的 ClickHouse 集群,节点名称分别为 node1node2,集群名称为 my_cluster

1. 在每个节点上创建本地表

首先,在每个节点上创建一个本地表。这些本地表通常使用 MergeTree 家族中的引擎,例如 ReplicatedMergeTreeReplacingMergeTree。本地表在集群中的每个节点上都有自己的数据副本。

sql
复制代码
CREATE TABLE my_local_table ON CLUSTER my_cluster
(
    id UInt64,
    name String,
    timestamp DateTime
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/my_local_table', '{replica}')
ORDER BY id
PARTITION BY toYYYYMM(timestamp)

这里的关键部分是 ReplicatedMergeTree 引擎:

  • /clickhouse/tables/{shard}/my_local_table 是 ZooKeeper 中存储表信息的路径,{shard} 将被 ClickHouse 解释为分片名称。
  • {replica} 将被 ClickHouse 解释为副本名称。

2. 在集群上创建分布式表

接着,创建一个分布式表。这张表不会直接存储数据,而是将查询请求分发给集群中的各个本地表。

sql
复制代码
CREATE TABLE my_distributed_table ON CLUSTER my_cluster
(
    id UInt64,
    name String,
    timestamp DateTime
)
ENGINE = Distributed(my_cluster, 'default', 'my_local_table', rand());

这里的 Distributed 引擎的参数解释如下:

  • my_cluster 是集群名称。
  • 'default' 是数据库名称(即本地表所在的数据库)。
  • 'my_local_table' 是在每个节点上创建的本地表名称。
  • rand() 是用于选择目标分片的散列函数。

使用注意事项

  1. ZooKeeper 配置:确保 ClickHouse 集群中的每个节点都正确配置了 ZooKeeper,因为 ReplicatedMergeTree 依赖 ZooKeeper 进行协调。
  2. 表名和路径:创建 ReplicatedMergeTree 表时,ZooKeeper 路径 (/clickhouse/tables/{shard}/my_local_table) 必须唯一,以防止数据冲突。
  3. 集群拓扑my_cluster{shard} 必须在集群配置文件中正确配置,并且在每个 ClickHouse 节点的配置中定义清楚。

通过这种方式,ClickHouse 在集群模式下能够实现数据的分布式存储和查询,提供高可用性和扩展性。