目录
- 副本
- 分布式表
- 1 副本写入流程
- 2 配置步骤
- 3 复制表的创建
- 4 删除副本
- 5 MergeTree 转换为 ReplicatedMergeTree
- 6 ReplicatedMergeTree 转换为 MergeTree
副本
副本的目的主要是保障数据的高可用性,即使一台 ClickHouse 节点宕机,那么也可以从 其他服务器获得相同的数据。
只有 MergeTree 系列里的表可支持副本:
- ReplicatedMergeTree
- ReplicatedSummingMergeTree
- ReplicatedReplacingMergeTree
- ReplicatedAggregatingMergeTree
- ReplicatedCollapsingMergeTree
- ReplicatedVersionedCollapsingMergetree
- ReplicatedGraphiteMergeTree
副本是表级别的,不是整个服务器级的。所以,服务器里可以同时有复制表和非复制表。副本不依赖分片。每个分片有它自己的独立副本。
对于 INSERT
和 ALTER
语句操作数据的会在压缩的情况下被复制(更多信息,看 ALTER )。
而 CREATE
,DROP
,ATTACH
,DETACH
和 RENAME
语句只会在单个服务器上执行,不会被复制。
The CREATE TABLE
在运行此语句的服务器上创建一个新的可复制表。如果此表已存在其他服务器上,则给该表添加新副本。The DROP TABLE
删除运行此查询的服务器上的副本。The RENAME
重命名一个副本。换句话说,可复制表不同的副本可以有不同的名称。
分布式表
默认情况下,CREATE
、DROP
、ALTER
和RENAME
查询仅影响执行它们的当前服务器。 在集群设置中,可以使用ON CLUSTER
子句以分布式方式运行此类查询。
以下查询在cluster中的每个主机上创建all_hits Distributed表:
代码语言:javascript复制CREATE TABLE IF NOT EXISTS all_hits ON CLUSTER cluster (p Date, i Int32) ENGINE = Distributed(cluster, default, hits)
1 副本写入流程
2 配置步骤
(1)启动 zookeeper 集群
(2)在 hadoop102 的/etc/clickhouse-server/config.d 目录下创建一个名为 metrika.xml 的配置文件,内容如下: 注:也可以不创建外部文件,直接在 config.xml 中指定
代码语言:javascript复制<?xml version="1.0"?><yandex> <zookeeper-servers> <node index="1"><host>hadoop102</host> <port>2181</port> </node> <node index="2"> <host>hadoop103</host> <port>2181</port> </node> <node index="3"> <host>hadoop104</host> <port>2181</port> </node> </zookeeper-servers></yandex>
代码语言:javascript复制(3)同步到 hadoop103 和 hadoop104 上
sudo /home/cuizb/bin/xsync /etc/clickhouse-server/config.d/metrika.xml
代码语言:javascript复制(4)在 hadoop102 的/etc/clickhouse-server/config.xml 中增加
<zookeeper incl="zookeeper-servers" optional="true" ></zookeeper><include_from>/etc/clickhouse-server/config.d/metrika.xml</include_from>
代码语言:javascript复制5)同步到 hadoop103 和 hadoop104 上
sudo /home/cuizb/bin/xsync /etc/clickhouse-server/config.xml
分别在 hadoop102 和 hadoop103 上启动 ClickHouse 服务
注意:因为修改了配置文件,如果以前启动了服务需要重启
代码语言:javascript复制sudo clickhouse restart
注意:我们演示副本操作只需要在 hadoop102 和 hadoop103 两台服务器即可,上面的操作,我们 hadoop104 可以你不用同步,我们这里为了保证集群中资源的一致性,做了同步。
(6)在 hadoop102 和 hadoop103 上分别建表
副本只能同步数据,不能同步表结构,所以我们需要在每台机器上自己手动建表
一、
代码语言:javascript复制create table t_order_rep2 ( id UInt32, sku_id String, total_amount Decimal(16,2), create_time Datetime ) engine =ReplicatedMergeTree('/clickhouse/table/01/t_order_rep','rep_102') partition by toYYYYMMDD(create_time) primary key (id) order by (id,sku_id);
二、
代码语言:javascript复制create table t_order_rep2 ( id UInt32, sku_id String, total_amount Decimal(16,2), create_time Datetime ) engine =ReplicatedMergeTree('/clickhouse/table/01/t_order_rep','rep_103') partition by toYYYYMMDD(create_time) primary key (id) order by (id,sku_id);
ReplicatedMergeTree 中,
第一个参数是分片的zk_path一般按照:
/clickhouse/table/{shard}/{table_name}
的格式写,如果只有一个分片就写 01 即可。 第二个参数是副本名称,相同的分片副本名称不能相同。
(7)在 hadoop102 上执行 insert 语句
(8)在 hadoop103 上执行 select,可以查询出结果,说明副本配置正确
3 复制表的创建
- 在每个副本服务器上运行
CREATE TABLE
查询。将创建新的复制表,或给现有表添加新副本。 - 如果其他副本上已包含了某些数据,在表上添加新副本,则在运行语句后,数据会从其他副本复制到新副本。换句话说,新副本会与其他副本同步。
- 在表引擎名称上加上
Replicated
前缀。例如:ReplicatedMergeTree
。
Replicated*MergeTree 参数
zoo_path
— ZooKeeper 中该表的路径。replica_name
— ZooKeeper 中的该表的副本名称。
示例:
代码语言:javascript复制# 创建本地表CREATE TABLE database.table_name( EventDate DateTime, CounterID UInt32, UserID UInt32) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/table_name', '{replica}')PARTITION BY toYYYYMM(EventDate)ORDER BY (CounterID, EventDate, intHash32(UserID))SAMPLE BY intHash32(UserID)# 创建分布式表CREATE TABLE database.dtable_name ON CLUSTER cluster_name as database.table_name ENGINE = Distributed(cluster_name, database.table_name, rand()或者javaHash(字段))
路径包含下面这些部分:
/clickhouse/tables/
是公共前缀,我们推荐使用这个。{layer}-{shard}
是分片标识部分。在此示例中,由于 Yandex.Metrica 集群使用了两级分片,所以它是由两部分组成的。但对于大多数情况来说,你只需保留 {shard} 占位符即可,它会替换展开为分片标识。table_name
是该表在 ZooKeeper 中的名称。使其与 ClickHouse 中的表名相同比较好。 这里它被明确定义,跟 ClickHouse 表名不一样,它并不会被 RENAME 语句修改。rand()或者javaHash(字段)
这两个参数的意义是:为了让数据均匀的散列分布在集群上,便于出现数据集中出现在某一台服务器上。
4 删除副本
要删除副本,使用 DROP TABLE
。但它只删除那个 – 位于运行该语句的服务器上的副本。
5 MergeTree 转换为 ReplicatedMergeTree
我们使用 MergeTree
来表示 MergeTree系列
中的所有表引擎,ReplicatedMergeTree
同理。如果你有一个手动同步的 MergeTree
表,您可以将其转换为可复制表。如果你已经在 MergeTree
表中收集了大量数据,并且现在要启用复制,则可以执行这些操作。
- 如果各个副本上的数据不一致,则首先对其进行同步,或者除保留的一个副本外,删除其他所有副本上的数据。
- 重命名现有的 MergeTree 表,然后使用旧名称创建
ReplicatedMergeTree
表。将数据从旧表移动到新表(/var/lib/clickhouse/data/db_name/table_name/
)目录内的 ‘detached’ 目录中。然后在其中一个副本上运行ALTER TABLE ATTACH PARTITION
,将这些数据片段添加到工作集中。
6 ReplicatedMergeTree 转换为 MergeTree
使用其他名称创建 MergeTree 表。将具有ReplicatedMergeTree
表数据的目录中的所有数据移动到新表的数据目录中。然后删除ReplicatedMergeTree
表并重新启动服务器。
如果你想在不启动服务器的情况下清除 ReplicatedMergeTree
表:
- 删除元数据目录中的相应
.sql
文件(/var/lib/clickhouse/metadata/
)。 - 删除 ZooKeeper 中的相应路径(
/path_to_table/replica_name
)。
之后,你可以启动服务器,创建一个 MergeTree
表,将数据移动到其目录,然后重新启动服务器。
官方文档:https://clickhouse.tech/docs/en/engines/table-engines/mergetree-family/replication/