ClickHouse 高可用之副本

文章目录

ClickHouse 副本

ClickHouse 通过副本机制,可以将数据拷贝存储在不同的节点上。这样,如果一个节点发生故障,数据仍然可以从其他节点中获取,确保系统的可用性。

支持副本的引擎

在 ClickHouse 中,并不是所有的引擎都支持副本,而副本有专门的引擎,在官网中可以看到:

其中只有 MergeTree 家族中的引擎支持副本,并且需要在原引擎的基础上,加上副本前缀 Replicated

还需要注意,副本都是表级别的,并不是相对于服务器而言,一般是哪个表需要创建副本,就对哪个表使用副本引擎。

注意,副本只能同步数据,并不能同步表结构,所以我们需要在副本同步时,先创建对应的表。

配置高可用副本

说到高可用,那必然是少不了 Zookeeper,数据协调和存储还得看 Zookeeper。

通过以引擎参数的形式提供 ZooKeeper 集群的名称和路径,ClickHouse 支持将副本的元信息存储在备用 ZooKeeper 集群上。也就是说,支持将不同数据表的元数据存储在不同的 ZooKeeper 集群上。

我这里配置两个副本,也就是说一共在三台机器上部署,一共有三份数据,充分保障 ClickHouse 中数据的安全、稳定性。

Zookeeper 和 ClickHouse 的搭建可以看我写的下面两篇文章:

在部署完 Zookeeper 分布式以及 ClickHouse 单机版(每台机器都要安装)后,就可以进行 ClickHouse 副本的配置了。

修改 ClickHouse 配置文件

在其中添加 Zookeeper 集群的信息,先修改一台机器的配置,然后再进行分发同步。

shell 复制代码
# 请先切换到 root 账户
su root

# 进入到 ClickHouse 的配置文件目录
cd /etc/clickhouse-server

# 修改配置默认的配置文件
vim config.xml

进入文本编辑器,输入 :/zookeeper 快速定位到:

填写你的 Zookeeper 信息,如下所示:

修改完成后,同步该文件到其它两台机器 。分发完成后,重启每台机器的 Zookeeper、ClickHouse

副本应用

1.副本表概述

官方给出的副本表创建示例:

副本表示例 SQL:

sql 复制代码
CREATE TABLE 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);

其中副本表引擎在创建时,需要传入两个参数:ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/table_name', '{replica}')

参数说明

  • 参数一:指定在 ZooKeeper 中存储的路径,推荐模板:/clickhouse/tables/{layer}-{shard}/{database}/{table},其中 {layer}-{shard} 表示分片标识信息,大多数情况下,只需要写入一个占位符。

  • 参数二:ZooKeeper 中该表的副本名称,该值必须与其它机器不同!

在创建副本表时,它们可以存储在不同的库中,并不会影响副本的创建,只需要保证它们使用的是同一个 Zookeeper 路径即可。

2.创建副本表

除了副本名称外,其余都需要保持一致。

进入 ClickHouse

shell 复制代码
# 我没有配置账户与密码
clickhouse-client -m

机器1 中创建。

sql 复制代码
CREATE TABLE test_rp
(
    EventDate DateTime DEFAULT now(),
    CounterID UInt32,
    UserID UInt32
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/01/test_rp', 'test_rp01')
PARTITION BY toYYYYMM(EventDate)
ORDER BY (EventDate);

机器2 中创建。

sql 复制代码
CREATE TABLE test_rp
(
    EventDate DateTime DEFAULT now(),
    CounterID UInt32,
    UserID UInt32
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/01/test_rp', 'test_rp02')
PARTITION BY toYYYYMM(EventDate)
ORDER BY (EventDate);

机器3 中创建。

sql 复制代码
CREATE TABLE test_rp
(
    EventDate DateTime DEFAULT now(),
    CounterID UInt32,
    UserID UInt32
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/01/test_rp', 'test_rp03')
PARTITION BY toYYYYMM(EventDate)
ORDER BY (EventDate);

3.写入模拟数据

机器1 中的表内插入一些模拟数据:

sql 复制代码
insert into test_rp (CounterID,UserID ) values (1,1001),(2,1002),(3,1003);

4.副本验证

数据插入完成后,分别在 机器1机器2机器3 上查询该表,检查副本是否创建成功。

sql 复制代码
select * from test_rp;

机器1 查询结果

我们数据是在 机器1 上写入的,所以它肯定有数据。

机器2 查询结果

副本同步成功。

机器3 查询结果

副本同步成功。

各位也可以反过来测试,在其它机器上插入,然后在不同的机器上进行查询,我这里就不再进行演示了。

扩展 ------ 在 Zookeeper 中查看副本表信息

如果你想要在 Zookeeper 中查看副本表的目录结构以及存储情况,那么你可以使用 Zookeeper 的可视化工具进行查看。当然,在命令行中查看也是可以的。

这里使用国内个人开发者设计的 PrettyZoo ------ 颜值与功能双在线的 Zookeeper 可视化工具

软件下载地址 ------ PrettyZoo

解压后即可使用,单机左上角 + 号连接 Zookeeper:

创建完成后,直接点击 connect 进行连接:

连接成功后,会自动进入 Zookeeper 目录结构界面:

查看我们创建的副本表的元数据信息:

其中存储了副本表的各种元数据信息,大家感兴趣的话就自己下载玩玩吧,这里不过多介绍了。

相关推荐
哲讯智能科技3 小时前
SAP环保-装备制造领域创新解决方案
大数据
钡铼技术物联网关3 小时前
Ubuntu工控卫士在制造企业中的应用案例
大数据·人工智能·物联网·边缘计算
闯闯桑4 小时前
scala 中的@BeanProperty
大数据·开发语言·scala
闯闯桑4 小时前
Scala 中的隐式转换
大数据·scala
hjehheje4 小时前
hbase实训 阿达
clickhouse
hjehheje6 小时前
clickhouse删除一条数据
数据库·clickhouse·oracle
用户Taobaoapi20146 小时前
淘宝商品列表查询 API 接口详解
大数据
涛思数据(TDengine)7 小时前
taosd 写入与查询场景下压缩解压及加密解密的 CPU 占用分析
大数据·数据库·时序数据库·tdengine
DuDuTalk7 小时前
DuDuTalk接入DeepSeek,重构企业沟通数字化新范式
大数据·人工智能
大数据追光猿7 小时前
Qwen 模型与 LlamaFactory 结合训练详细步骤教程
大数据·人工智能·深度学习·计算机视觉·语言模型