使用clickhouse-backup迁移数据

俊达2年前技术文章1594

说明

上一篇文章中,我们介绍了clickhouse-backup工具。除了备份恢复,我们也可以使用该工具来迁移数据。


这篇文章中,我们提供一个使用clickhouse-backup做集群迁移的方案。

前置条件

1、源端和目标端网络联通,主机之间开启ssh免密登录

2、Clickhouse配置保持一致。

  • 集群名称一致

  • 节点配置参数保持一致

  • clickhouse版本一致

3、迁移后库表结构和源端保持一致


CK集群架构


clickhouse-cluster.png

1、源和目标集群的shard数量一样,shard对shard迁移。各个shard可并行进行备份恢复操作。

2、备份在源端每一个shard的第一个replica上执行。

3、表结构需要在目标shard的每一个节点上恢复。

4、数据只需要在目标shard的第一个节点上恢复。


操作步骤

全量

1、源端全量备份

clickhouse-backup --config config.yml create full_back_shard_i


2、将备份文件同步到目标服务器

同步到目标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/backup


3、目标服务器恢复数据

3.1、目标shard所有节点执行

加上--schema参数,建立表结构。

clickhouse-backup --config config.yml restore --rm --schema full_back_shard_i

3.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_1



2、目标端恢复数据



通过restore_remote恢复数据

2.1 目标shard所有节点执行

(如果表结构没有变化,这一个步骤可以忽略)

clickhouse-backup --config config.yml restore_remote --rm --schema inc_backup_1
clickhouse-backup --config config.yml delete local inc_backup_1


2.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.yml
check_replicas_before_attach: false

# restore without rm option
clickhouse-backup --config config.yml restore --data partition_backup_i


这种情况下,如果restore命令执行多次,会导致数据重复。


基于分区的增量迁移

前置条件

若满足以下条件,可以使用基于分区的增量迁移

1、全量数据已经恢复到目标shard

2、表结构没有发生变化

3、明确只存在部分分区存在数据变化


若选定的分区数据量相对所有数据占比不高,基于分区的增量迁移能提高迁移效率。

具体步骤如下:

1、源端备份分区数据

在源端shard第一个replica执行

clickhouse-backup --config config.yml create --partitions=xxx partition_backup_i


2、将备份文件rsync到目标shard第一个节点

rsync -av /data/clickhouse/data/backup/partition_backup_i root@remote:/data/clickhouse/data/backup


3、目标shard清空对应分区的数据

在目标分区第一个replica执行

for tab in tabs
do
    clickhouse-client --password=xx --database=xx --query="alter table $tab drop partition 'partion-xx'";
done


4、恢复数据

在目标shard的第一个replica上执行

clickhouse-backup --config config.yml restore --partitions=xxx --data partition_backup_i


加上--data参数

不能加--rm参数

注意config.yml需要配置check_replicas_before_attach: false。

#config.yml
clickhouse:
  username: default
  password: "hello123"
  host: localhost
  port: 9000
  ...
  check_replicas_before_attach: false


恢复命令不能重复执行。若要执行,需要先清空partition内已有的数据。


相关文章

Java-API-MapReduce的操作WordCount篇

Java-API-MapReduce的操作WordCount篇

首先就是pom文件<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/...

MySQL优化器特性(三)表关联之BKA(Batched Key Access)优化

MySQL优化器特性(三)表关联之BKA(Batched Key Access)优化

单表range查询时,可以使用MRR优化,先对rowid进行排序,然后再回表查询数据。在表关联的时候,也可以使用类似的优化方法,先根据关联条件取出被关联表的rowid,将rowid缓存在join bu...

MySQL运维实战(2.4) SSL认证在MySQL中的应用

MySQL支持使用tls进行通信。tls主要有几个作用对客户端、服务端之间的通信数据进行加密。包括客户端发往服务端的SQL,服务端返回给客户端的数据。客户端可以验证服务端的身份。服务端也可以验证客户端...

Hbase rowkey设计原则

HBase 中的 rowkey 设计需要遵循以下原则:1 rowkey 唯一原则若在 HBase 中向同一张表插入相同 rowkey 的记录,如没有设置版本数量,则此 rowkey 原先的数据会被覆盖...

MySQL运维实战(2.1) 登录失败次数太多导致主机被block的问题处理

参数max_connect_errorsMySQL有参数max_connect_errors,当一个主机尝试登录MySQL,失败的次数超过了max_connect_errors,则这个主机将无法登录到...

MySQL运维实战之备份和恢复(8.7)将数据库恢复到指定时间点的另外一种方法

使用mysql原生复制功能实现时间点恢复使用mysqlbinlog解析并执行binlog是实现mysql时间点恢复的一种常用的方法。这里提供另外一种实现时间点恢复的方法:使用mysql的复制功能来实现...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。