作者:俊达
1 说明上一篇文章中,我们介绍了clickhouse-backup工具。除了备份恢复,我们也可以使用该工具来迁移数据。这篇文章中,我们提供一个使用clickhouse-backup做集群迁移的方案。
2 前置条件1、源端和目标端网络联通,主机之间开启ssh免密登录
2、Clickhouse配置保持一致。
集群名称一致节点配置参数保持一致clickhouse版本一致3、迁移后库表结构和源端保持一致
3 CK集群架构1、源和目标集群的shard数量一样,shard对shard迁移。各个shard可并行进行备份恢复操作。2、备份在源端每一个shard的第一个replica上执行。3、表结构需要在目标shard的每一个节点上恢复。4、数据只需要在目标shard的第一个节点上恢复。
3 操作步骤全量1、源端全量备份
clickhouse-backup --config config.yml create full_back_shard_i2、将备份文件同步到目标服务器同步到目标shard第一个节点
rsync -av /data/clickhouse/data/backup/full_back_shard_i root@remote:/data/clickhouse/data/backup同步到目标shard其他节点其他节点只需要同步metadata,不需要同步shadow目录下的数据文件。
rsync --exlude shadow -av /data/clickhouse/data/backup/full_back_shard_i root@remote:/data/clickhouse/data/backup3、目标服务器恢复数据(1)目标shard所有节点执行加上--schema参数,建立表结构。
clickhouse-backup --config config.yml restore --rm --schema full_back_shard_i(2)目标shard第一个节点执行加上--data参数,加载数据。集群中的其他副本会从该节点同步数据。
clickhouse-backup --config config.yml restore --rm --data full_back_shard_i增量1、源端备份数据指定create_remote,将增量数据上传到sftp
clickhouse-backup --config config.yml create_remote --diff-from=full_back_shard_i inc_backup_12、目标端恢复数据
通过restore_remote恢复数据
(1)目标shard所有节点执行(如果表结构没有变化,这一个步骤可以忽略)
clickhouse-backup --config config.yml restore_remote --rm --schema inc_backup_1clickhouse-backup --config config.yml delete local inc_backup_1(2)目标shard第一个节点执行增量恢复时也需要添加--rm参数,删除历史数据再做恢复。
clickhouse-backup --config config.yml restore_remote --rm --data inc_backup_1关于rm选项如果不加--rm,表中又有数据,默认情况下会忽略该表的恢复。从日志中可以看到类似信息:
2022/11/14 07:09:55.879763 warn local_15507.oracle_sql_stat2 skipped cause system.replicas entry already exists and replication in progress from another replica logger=clickhouse如果恢复时不想先清空原有的数据(比如恢复某一个分区的数据),需要在config.yml中配置参数。
# config.ymlcheck_replicas_before_attach: false# restore without rm optionclickhouse-backup --config config.yml restore --data partition_backup_i这种情况下,如果restore命令执行多次,会导致数据重复。
4 基于分区的增量迁移前置条件若满足以下条件,可以使用基于分区的增量迁移
全量数据已经恢复到目标shard表结构没有发生变化明确只存在部分分区存在数据变化若选定的分区数据量相对所有数据占比不高,基于分区的增量迁移能提高迁移效率。
具体步骤如下:
1、源端备份分区数据在源端shard第一个replica执行
clickhouse-backup --config config.yml create --partitions=xxx partition_backup_i2、将备份文件rsync到目标shard第一个节点
rsync -av /data/clickhouse/data/backup/partition_backup_i root@remote:/data/clickhouse/data/backup3、目标shard清空对应分区的数据在目标分区第一个replica执行
for tab in tabsdo clickhouse-client --password=xx --database=xx --query="alter table $tab drop partition 'partion-xx'";done4、恢复数据在目标shard的第一个replica上执行
clickhouse-backup --config config.yml restore --partitions=xxx --data partition_backup_i加上--data参数
不能加--rm参数
注意config.yml需要配置check_replicas_before_attach: false。
#config.ymlclickhouse: username: default password: "hello123" host: localhost port: 9000 ... check_replicas_before_attach: false恢复命令不能重复执行。若要执行,需要先清空partition内已有的数据。
更多技术信息请查看云掣官网