查看可以搬迁的表
备份数据
备份文件
table.json
metadata.json
上传数据到obs
目标节点下载数据
恢复数据
进阶使用
目标节点和源节点数据路径不一致
表名变更
搬迁物化视图
多盘存储
增量搬迁
缺陷
基本使用clickhouse-backup是一款针对clickhouse数据备份的开源工具:https://github.com/AlexAkulov/clickhouse-backup
下载安装根据节点的操作系统,选择最新版本的rpm包。这里选择v2.1.3的x86版本。
如果需要指定安装路径:
rpm -ivh --prefix=/path clickhouse-backup-2.1.3-1.x86_64.rpm 配置文件 clickhouse-backup default-config # 查看默认配置 clickhouse-backup print-config # 显示当前配置如果需要修改配置,则需要在/etc/clickhouse-backup/config.yml中配置。
主要的配置:
该命令会显示可以搬迁的库表,并显示对应表的数据量。
如:clickhouse-backup create -t default.test backup_test
备份后可以通过list查看备份的结果
备份数据存放的路径由clickhouse的config.xml中的path指定,在本例中是在:/data/bigdata/clickhouse/data1/
在该路径下,会生成metadata,shadow和metadata.json。如下:
以物化视图的内表为例:
{ "table": "test", "database": "default", "parts": { "default": [ # 存储策略对应的disk { "name": "all_1_1_0" } ] }, "query": "CREATE TABLE default.test UUID '30a3b4d8-bba0-4922-87ea-c6e416166018' (`id` String, `name` String) ENGINE = MergeTree ORDER BY id SETTINGS index_granularity = 8192", "size": { "default": 403 }, "total_bytes": 145, "metadata_only": false } metadata.json { "backup_name": "backup_test", # 备份文件名 "disks": { # 存储策略对应的disk,默认是default。 "default": "/data/bigdata/clickhouse/data/", "disk_name_1": "/data/bigdata/disks/disk1/", "disk_name_2": "/data/bigdata/disks/disk2/" }, "version": "2.1.3", "creation_date": "2023-01-11T09:09:58.363473551Z", "tags": "regular", "clickhouse_version": "v22.3.2.1-lts", "data_size": 403, "metadata_size": 368, "databases": [ { "name": "default", "engine": "Atomic", "query": "CREATE DATABASE default\nENGINE = Atomic" }, { "name": "test", "engine": "Atomic", "query": "CREATE DATABASE test\nENGINE = Atomic" } ], "tables": [ { "database": "default", "table": "test" } ], "functions": [], "data_format": "" } 上传数据到obs clickhouse-backup upload backup_name # 上传指定的备份文件需要指定remote_storage为s3,同时配置s3的ak,sk等信息。
在执行clickhouse-backup upload backup_test后,在obs上可以看到上传的数据。
如:clickhouse-backup download backup_test
在config.xml指定的存储目录下会生成备份数据
如:clickhouse-backup restore backup_test
恢复后,可以查询到数据已经同步完成。
前面已经讲了最基本的使用方式,也就是目标集群和源集群的所有配置都是一样的场景。但是,搬迁时,两个集群间往往有许多变量。针对特殊情况,现记录如下:
目标节点和源节点数据路径不一致源节点的路径配置:
<path>/data/bigdata/clickhouse/data/</path>目标节点的路径配置:
<path>/data/bigdata/clickhouse/data1/</path>在源节点生成备份数据后,磁盘路径对应的是/data/bigdata/clickhouse/data/(对应的磁盘策略为default)
test_path.json
源节点表名 test_src
目标节点表名 test_dest
backupname为backup_test_src
方法一:
在目标节点直接恢复数据,然后使用clickhouse的rename命令
方法二:
如果目标节点已经存在该表,且表不能重建,则可以用如下方法
适配内容:
(1)适配table_name.json
a. 将test_src.json重命名为test_dest.json;
b. 修改test_dest.json中的表名和uuid(uuid要填写实际的值,select uuid from system.tables where name =‘test_dest’;)
源节点和目标节点的物化视图sql如下:
CREATE TABLE default.test_local ( `id` UInt8, `name` String, `xxx` String ) ENGINE = MergeTree ORDER BY id CREATE MATERIALIZED VIEW default.test_view ( `id` UInt8, `name` String, `xxx` String ) ENGINE = AggregatingMergeTree ORDER BY id SETTINGS index_granularity = 8192 AS SELECT id, name, xxx FROM ( SELECT * FROM default.test_local ) GROUP BY id, name, xxx物化视图的数据迁移,应该搬迁它的inner表,因为数据都存储在inner表中。
注:inner表的关联关系:
如果有指定,则在建表语句中由TO关键字指定,如果没有指定,则默认是该物化视图对应的uuid(select uuid,name from system.tables where name=‘test_view’)
这里以不指定inner表的方式为例。
1、源节点数据备份
源节点的视图和inner的对应关系
2、目标节点恢复数据
在目标节点已经建立物化视图,对应的inner表为:
(1)适配table_name.json
a. 重命名table_name.json;
所以,重命名
mv /data/bigdata/clickhouse/data/backup/backup_test_view/metadata/default/%2Einner_id%2E10f71dd6%2Dc32b%2D4653%2Daee6%2D31cac394ae6d.json /data/bigdata/clickhouse/data/backup/backup_test_view/metadata/default/%2Einner_id%2E7238df78%2D039c%2D44d7%2Db238%2Ddf78039c24d7.jsonb. 修改table_name.json中的表名和uuid
(2)适配metadata.json
最后,恢复数据:
如果源节点和目标节点都是多盘存储,且路径一致,则不需要额外适配。
如果源节点是default存储策略,目标节点是多盘存储,则需要按照前面的方法进行适配。
例子如下:
源节点只设置了path,目标节点设置了多盘存储
(2)适配metadata.json
新增存盘策略
(3)适配数据目录
mkdir -p /data/bigdata/disks/disk1/backup/backup_test_default mv /data/bigdata/clickhouse/data/backup/backup_test_default/shadow /data/bigdata/disks/disk1/backup/backup_test_default/ mv /data/bigdata/disks/disk1/backup/backup_test_default/shadow/default/test_disk_default/default /data/bigdata/disks/disk1/backup/backup_test_default/shadow/default/test_disk_default/disk_name_1如此操作,数据正常恢复。后续插入的数据也会在disk_name_1和disk_name_2间轮询写入。
增量搬迁clickhouse-backup支持备份恢复某个分区的数据(不支持part级别),可以通过这种方式以达到增量搬迁的效果。
源节点中的数据内容如下:
(1)备份某分区方式
# 源节点 clickhouse-backup create -t default.test_partition --partitions 6711e2b2592d86d18fc0f260cf33ef2b backup_test_p_1 clickhouse-backup create -t default.test_partition --partitions d63c5d7a5ac187945961e06e17d46b6e backup_test_p_2 clickhouse-backup upload backup_test_p_1 clickhouse-backup upload backup_test_p_2 # 目标节点 clickhouse-backup download backup_test_p_1 clickhouse-backup download backup_test_p_2 clickhouse-backup restore backup_test_p_1 clickhouse-backup restore --data backup_test_p_2 # 增量的要指定为data模式,否则原有数据会被覆盖(2)备份整表,恢复部分分区方式
# 源节点 clickhouse-backup create -t default.test_partition backup_test_p clickhouse-backup upload backup_test_p # 目标节点 clickhouse-backup download backup_test_p clickhouse-backup restore --data --partitions 6711e2b2592d86d18fc0f260cf33ef2b backup_test_p # 指定需要恢复的分区 clickhouse-backup restore --data --partitions d63c5d7a5ac187945961e06e17d46b6e backup_test_p 缺陷1、目前clickhouse-backup只支持MergeTree引擎系列的表