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 目录结构界面:

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

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

相关推荐
拓端研究室TRL3 小时前
【梯度提升专题】XGBoost、Adaboost、CatBoost预测合集:抗乳腺癌药物优化、信贷风控、比特币应用|附数据代码...
大数据
黄焖鸡能干四碗3 小时前
信息化运维方案,实施方案,开发方案,信息中心安全运维资料(软件资料word)
大数据·人工智能·软件需求·设计规范·规格说明书
编码小袁3 小时前
探索数据科学与大数据技术专业本科生的广阔就业前景
大数据
WeeJot嵌入式4 小时前
大数据治理:确保数据的可持续性和价值
大数据
zmd-zk5 小时前
kafka+zookeeper的搭建
大数据·分布式·zookeeper·中间件·kafka
激流丶5 小时前
【Kafka 实战】如何解决Kafka Topic数量过多带来的性能问题?
java·大数据·kafka·topic
测试界的酸菜鱼5 小时前
Python 大数据展示屏实例
大数据·开发语言·python
时差9535 小时前
【面试题】Hive 查询:如何查找用户连续三天登录的记录
大数据·数据库·hive·sql·面试·database
Mephisto.java5 小时前
【大数据学习 | kafka高级部分】kafka中的选举机制
大数据·学习·kafka
苍老流年5 小时前
Hive中各种Join的实现
数据仓库·hive·hadoop