在 ClickHouse 集群模式下,创建表的 DDL 语句通常取决于你希望数据如何分布在集群中的各个节点上。一般来说,你会用到分布式表 (Distributed) 和分区表 (MergeTree 及其变种)。下面是一个常见的创建表的示例,包含分布式表和本地表。
假设我们有一个两节点的 ClickHouse 集群,节点名称分别为 node1 和 node2,集群名称为 my_cluster。
1. 在每个节点上创建本地表
首先,在每个节点上创建一个本地表。这些本地表通常使用 MergeTree 家族中的引擎,例如 ReplicatedMergeTree 或 ReplacingMergeTree。本地表在集群中的每个节点上都有自己的数据副本。
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()是用于选择目标分片的散列函数。
使用注意事项
- ZooKeeper 配置:确保 ClickHouse 集群中的每个节点都正确配置了 ZooKeeper,因为
ReplicatedMergeTree依赖 ZooKeeper 进行协调。 - 表名和路径:创建
ReplicatedMergeTree表时,ZooKeeper 路径 (/clickhouse/tables/{shard}/my_local_table) 必须唯一,以防止数据冲突。 - 集群拓扑:
my_cluster和{shard}必须在集群配置文件中正确配置,并且在每个 ClickHouse 节点的配置中定义清楚。
通过这种方式,ClickHouse 在集群模式下能够实现数据的分布式存储和查询,提供高可用性和扩展性。