基于PARTITION和PART来实现ClickHouse快速数据备份
背景
ClickHouse 数据备份机制一直不太完善,ClickHouse 23.4 才提供了较为完善好用的备份功能,基于Backup and Restore来进行表数据的备份。此功能出现之前,一般采用clickhouse-copier、clickhouse-backup框架或者使用导出文本文件的方式来进行数据备份,这些方案都是基于表级别的备份,存在整体备份机制较复杂、大数据量的备份效率很低等问题。
现有技术缺点
对于ClickHouse的数据备份,现有的处理方案,一般有如下两种方式:一种是采用clickhouse-copier、clickhouse-backup框架进行表级别的数据同步,此种方法需要引入额外的同步框架,会使整体复杂性提高。另一种是使用导出文件的方式来进行数据备份,此种方法对于大数据量的情况下效率很低,且会占用额外的存储空间。本方案提供一种基于表分区、块的备份机制,基于Linux scp命令进行文件传输,以满足表下更细粒度的备份场景。
总体流程
1、分离表中待同步的数据
基于表级别,使用ATTACH PARTITION|PART 命令来进行表分区级别、块级别的数据分离。以api_log表为例:
#分离出2023年1月份的数据
ALTER TABLE api_log DETACH PARTITION 202301;
#分离出块202301_2_2_0的数据
ALTER TABLE api_log DETACH PART 202301_2_2_0;
分离后的数据会被移动到detached目录下。
2、将数据拷贝到远程备份机器上
在远程备份的机器上,搭建同一版本的CH实例,并新建待备份的表。使用scp命令将detached目录下分离好的数据,拷贝到远程机器上CH实例对应表数据detached目录下。根据不同的业务场景,我们可以基于表的分区粒度或者块的粒度进行数据的拷贝备份。
3、在备份机器上将数据加载到表中
命令行的方式登录备份机器上的ClickHouse实例,执行如下命令,将数据加载到表中。
#加载2023年1月份的数据
ALTER TABLE api_log ATTACH PARTITION 202301;
#加载块202301_2_2_0的数据
ALTER TABLE api_log ATTACH PART 202301_2_2_0;
这样就可以直接使用SQL语句来查询api_log表中的相关数据了。
4、周期及手动同步
可以编写统一的同步SHELL脚本,作为手动和周期的数据同步入口。入参为:表名、分区名或者块名。通过Linux的crontab来周期执行此SHELL,以达到周期同步的目的。
转载自:https://juejin.cn/post/7247058712195858488