Java技术债务Java技术债务

  •  首页
  •  分类
  •  归档
  •  标签
  • 博客日志
  • 资源分享
  •  友链
  •  关于本站
注册
登录

ClickHouse的副本以及分布式表的创建(九)

ClickHouse,数据库

文章目录


副本

副本的目的主要是保障数据的高可用性,即使一台 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表:

CREATE TABLE IF NOT EXISTS all_hits ON CLUSTER cluster (p Date, i Int32) ENGINE = Distributed(cluster, default, hits)

1 副本写入流程

ClickHouse的副本以及分布式表的创建(九) - Java技术债务

2 配置步骤

(1)启动 zookeeper 集群

(2)在 hadoop102 的/etc/clickhouse-server/config.d 目录下创建一个名为 metrika.xml 的配置文件,内容如下: 注:也可以不创建外部文件,直接在 config.xml 中指定

<?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>

(3)同步到 hadoop103 和 hadoop104 上

sudo /home/cuizb/bin/xsync /etc/clickhouse-server/config.d/metrika.xml

(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>

5)同步到 hadoop103 和 hadoop104 上

sudo /home/cuizb/bin/xsync /etc/clickhouse-server/config.xml

分别在 hadoop102 和 hadoop103 上启动 ClickHouse 服务

注意:因为修改了配置文件,如果以前启动了服务需要重启

sudo clickhouse restart

注意:我们演示副本操作只需要在 hadoop102 和 hadoop103 两台服务器即可,上面的操作,我们 hadoop104 可以你不用同步,我们这里为了保证集群中资源的一致性,做了同步。

(6)在 hadoop102 和 hadoop103 上分别建表

副本只能同步数据,不能同步表结构,所以我们需要在每台机器上自己手动建表

一、

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);

二、

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 中的该表的副本名称。

示例:

# 创建本地表
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/

副本

副本的目的主要是保障数据的高可用性,即使一台 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表:

CREATE TABLE IF NOT EXISTS all_hits ON CLUSTER cluster (p Date, i Int32) ENGINE = Distributed(cluster, default, hits)

1 副本写入流程

ClickHouse的副本以及分布式表的创建(九) - Java技术债务

2 配置步骤

(1)启动 zookeeper 集群

(2)在 hadoop102 的/etc/clickhouse-server/config.d 目录下创建一个名为 metrika.xml 的配置文件,内容如下: 注:也可以不创建外部文件,直接在 config.xml 中指定

<?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>

(3)同步到 hadoop103 和 hadoop104 上

sudo /home/cuizb/bin/xsync /etc/clickhouse-server/config.d/metrika.xml

(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>

5)同步到 hadoop103 和 hadoop104 上

sudo /home/cuizb/bin/xsync /etc/clickhouse-server/config.xml

分别在 hadoop102 和 hadoop103 上启动 ClickHouse 服务

注意:因为修改了配置文件,如果以前启动了服务需要重启

sudo clickhouse restart

注意:我们演示副本操作只需要在 hadoop102 和 hadoop103 两台服务器即可,上面的操作,我们 hadoop104 可以你不用同步,我们这里为了保证集群中资源的一致性,做了同步。

(6)在 hadoop102 和 hadoop103 上分别建表

副本只能同步数据,不能同步表结构,所以我们需要在每台机器上自己手动建表

一、

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);

二、

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 中的该表的副本名称。

示例:

# 创建本地表
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/

完
  • 本文作者:Java技术债务
  • 原文链接: https://cuizb.top/myblog/article/1640446189
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY 3.0 CN协议进行许可。转载请署名作者且注明文章出处。
阅读全文
Java技术债务

Java技术债务

Java技术债务
Java技术债务
热门文章
  1. ClickHouse使用过程中的一些查询优化(六)2003
  2. MySQL数据库被攻击,被删库勒索,逼迫我使出洪荒之力进行恢复数据764
  3. MySQL主从同步原理458
  4. 线程池的理解以及使用414
  5. Spring Cloud Gateway整合nacos实战(三)409
分类
  • Java
    30篇
  • 设计模式
    27篇
  • 数据库
    20篇
  • Spring
    18篇
  • MySQL
    13篇
  • ClickHouse
    11篇
  • Kubernetes
    10篇
  • Redis
    9篇
  • Docker
    8篇
  • SpringBoot
    7篇
  • JVM
    6篇
  • Linux
    5篇
  • Spring Cloud
    5篇
  • 多线程
    5篇
  • Netty
    4篇
  • Kafka
    4篇
  • 面经
    4篇
  • Nginx
    3篇
  • JUC
    3篇
  • 随笔
    2篇
  • 分布式
    1篇
  • MyBatis
    1篇
  • 报错合集
    1篇
  • 生活记录
    1篇
  • 源码
    1篇
  • 性能优化
    1篇

最新评论

  • MySQL数据库被攻击,被删库勒索,逼迫我使出洪荒之力进行恢复数据2022-05-06
    Java技术债务:@capture 一起探讨学习,服务器被黑很正常,及时做好备份以及做好防护
  • MySQL数据库被攻击,被删库勒索,逼迫我使出洪荒之力进行恢复数据2022-04-13
    capture:我的刚上线两天,网站里就两篇文章也被攻击了,纳闷
  • Java常用集合List、Map、Set介绍以及一些面试问题2022-01-18
    Java技术债务:HashSet和TreeSet 相同点:数据不能重复 不同点: 1、底层存储结构不同; HashSet底层使用HashMap哈希表存储 TreeSet底层使用TreeMap树结构存储 2、唯一性方式不同 HashSet底层使用hashcode()和equal()方法判断 TreeSet底层使用Comparable接口的compareTo判断的 3、HashSet无序,TreeSet有序
  • undefined2021-12-14
    Java技术债务:如果不指定线程池,CompletableFuture会默认使用ForkJoin线程池,如果同一时间出现大量请求的话,会出现线程等待问题,建议使用自定义线程池。。。
  • undefined2021-12-02
    you:很好,对于小白相当不错了,谢谢
  • CSDN
  • 博客园
  • 程序猿DD
  • 纯洁的微笑
  • spring4all
  • 廖雪峰的官方网站
  • 猿天地
  • 泥瓦匠BYSocket
  • crossoverJie
  • 张先森个人博客
  • 越加网

© 2021-2022 Java技术债务 - Java技术债务 版权所有
总访问量 0 次 您是本文第 0 位童鞋
豫ICP备2021034516号
Java技术债务 豫公网安备 51011402000164号

微信公众号

Java技术债务
Java技术债务

专注于Spring,SpringBoot等后端技术探索

以及MySql数据库开发和Netty等后端流行框架学习

日志
分类
标签
RSS

有不足之处也希望各位前辈指出