副本
该引擎基于Atomic引擎。它通过将 DDL 日志写入 ZooKeeper 并在给定数据库的所有副本上执行,支持元数据的复制。
一个 ClickHouse 服务器可以同时运行和更新多个副本数据库。但同一个副本数据库不能有多个副本。
创建数据库
引擎参数
zoo_path
— ZooKeeper 路径。相同的 ZooKeeper 路径对应于相同的数据库。shard_name
— 分片名称。数据库副本按shard_name
分组到分片中。replica_name
— 副本名称。相同分片的所有副本名称必须不同。
对于ReplicatedMergeTree表,如果没有提供参数,则使用默认参数:/clickhouse/tables/{uuid}/{shard}
和{replica}
。这些可以在服务器设置中更改 default_replica_path 和 default_replica_name。宏 {uuid}
被展开为表的 uuid,{shard}
和{replica}
被展开为来自服务器配置的值,而不是数据库引擎参数中的值。但在将来,可以使用副本数据库的 shard_name
和 replica_name
。
细节和建议
使用 Replicated
数据库的 DDL 查询类似于ON CLUSTER查询,但有一些细微的差别。
首先,DDL 请求尝试在发起者(最初接收到用户请求的主机)上执行。如果请求没有满足,则用户会立即收到错误,其他主机不会尝试满足该请求。如果请求在发起者上成功完成,则所有其他主机将自动重试,直到完成。发起者会尝试等待查询在其他主机完成(不超过distributed_ddl_task_timeout),并返回一个表,显示每个主机上的查询执行状态。
出错时的行为由distributed_ddl_output_mode设置来调节,对于 Replicated
数据库,最好将其设置为 null_status_on_timeout
—— 即如果某些主机未能在distributed_ddl_task_timeout内执行请求,则不抛出异常,而是在表中显示它们的 NULL
状态。
system.clusters系统表包含一个与副本数据库同名的集群,包含数据库的所有副本。该集群在创建/删除副本时自动更新,可用于分布式表。
创建数据库的新副本时,该副本会自行创建表。如果副本长时间不可用并且落后于复制日志 —— 它会检查其本地元数据与 ZooKeeper 中的当前元数据,首先将多余的数据表移动到一个单独的非副本数据库(以免意外删除多余的内容),然后创建缺失的表,如果表名已更改则更新表名。数据在 ReplicatedMergeTree
级别复制,即如果表没有被复制,则数据不会被复制(数据库仅负责元数据)。
允许执行ALTER TABLE FREEZE|ATTACH|FETCH|DROP|DROP DETACHED|DETACH PARTITION|PART
查询,但不被复制。数据库引擎只会将分区/片段添加/获取/移除到当前副本。但是,如果表本身使用了副本表引擎,则在使用 ATTACH
后,数据将被复制。
如果仅需要配置集群而无需维护表复制,请参阅集群发现功能。
使用示例
创建一个包含三个主机的集群:
运行 DDL 查询:
显示系统表:
创建分布式表并插入数据:
在另一个主机上添加副本:
集群配置将如下所示:
分布式表也将从新主机获取数据: