当前位置: 首页>后端>正文

ClickHouse备份恢复

官网说明

参考官网:

https://clickhouse.com/docs/zh/operations/backup

不同公司有不同的可用资源和业务需求,因此不存在一个通用的解决方案可以应对各种情况下的ClickHouse备份和恢复。 适用于 1GB 数据的方案可能并不适用于几十 PB 数据的情况。 有多种具备各自优缺点的可能方法,将在下面对其进行讨论。最好使用几种方法而不是仅仅使用一种方法来弥补它们的各种缺点。

将源数据复制到其它地方

通常摄入到ClickHouse的数据是通过某种持久队列传递的,例如 Apache Kafka

https://kafka.apache.org

在这种情况下,可以配置一组额外的订阅服务器,这些订阅服务器将在写入ClickHouse时读取相同的数据流,并将其存储在冷存储中。 大多数公司已经有一些默认推荐的冷存储,可能是对象存储或分布式文件系统,如 HDFS

https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html

这种方法较为一般,相当于在别的地方又存了一份。

文件系统快照

某些本地文件系统提供快照功能(例如, ZFS

https://en.wikipedia.org/wiki/ZFS

),但它们可能不是提供实时查询的最佳选择。 一个可能的解决方案是使用这种文件系统创建额外的副本,并将它们与用于SELECT 查询的 分布式

https://clickhouse.com/docs/zh/engines/table-engines/special/distributed 

表分离。 任何修改数据的查询都无法访问此类副本上的快照。 作为回报,这些副本可能具有特殊的硬件配置,每个服务器附加更多的磁盘,这将是经济高效的。
这种方式将需要更多的存储资源。

clickhouse-copier

https://clickhouse.com/docs/zh/operations/utilities/clickhouse-copier

clickhouse-copier是一个多功能工具,最初创建它是为了用于重新切分pb大小的表。 因为它能够在ClickHouse表和集群之间可靠地复制数据,所以它也可用于备份和还原数据。

对于较小的数据量,一个简单的 INSERT INTO ... SELECT ... 到远程表也可以工作。

part操作

ClickHouse允许使用 ALTER TABLE ... FREEZE PARTITION ... 查询以创建表分区的本地副本。 这是利用硬链接(hardlink)到 /var/lib/clickhouse/shadow/ 文件夹中实现的,所以它通常不会因为旧数据而占用额外的磁盘空间。 创建的文件副本不由ClickHouse服务器处理,所以你可以把它们留在那里:你将有一个简单的备份,不需要任何额外的外部系统,但它仍然容易出现硬件问题。 出于这个原因,最好将它们远程复制到另一个位置,然后删除本地副本。 分布式文件系统和对象存储仍然是一个不错的选择,但是具有足够大容量的正常附加文件服务器也可以工作(在这种情况下,传输将通过网络文件系统或者也许是 rsync

https://en.wikipedia.org/wiki/Rsync

来进行).

数据可以使用 ALTER TABLE ... ATTACH PARTITION ... 从备份中恢复。

有关与分区操作相关的查询的详细信息,请参阅 更改文档

https://clickhouse.com/docs/zh/sql-reference/statements/alter#alter_manipulations-with-partitions

第三方工具可用于自动化此方法: clickhouse-backup

https://github.com/AlexAkulov/clickhouse-backup

手动备份及恢复

此处方式即官网中的part操作。

备份
创建备份路径:
创建用户存放备份数据的目录shadow并授权

sudo mkdir -p /var/lib/clickhouse/shadow/
chown clickhouse:clickhouse /var/lib/clickhouse/shadow/

如果目录已存在,需要先清空目录下的数据

执行备份命令:

echo -n 'alter table t_order_mt freeze' | clickhouse-client

执行命令不会锁表
默认不备份元数据

将备份数据保存到其他路径:

sudo mkdir -p /var/lib/clickhouse/backup/
sudo cp -r /var/lib/clickhouse/shadow/ /var/lib/clickhouse/backup/my-backup-name

为下次备份准备,删除shadow下的数据:

sudo rm -rf /var/lib/clickhouse/shadow/*

恢复
模拟删除备份过的表

echo 'drop table t_order_mt' | clickhouse-client

通过show tables检查

重新创建表

cat t_order_mt.sql | clickhouse-client

将备份复制到detached目录并授权,仅拷贝分区目录

sudo cp -rl backup/my-backup-name/1/store/cb1/uuid/*  data/default/t_order_mt/detached

clickhouse使用文件系统硬链接来实现即时备份,而不会导致Clickhouse服务停机(或锁定)。这些硬链接可以进一步用于有效的备份存储。在支持硬链接的文件系统(例如本地文件系统或NFS)上,将cp与-l标志一起使用(或将rsync与-hard-links和-numeric-ids标志一起使用)以避免复制数据。

然后执行attach
按分区恢复(注意授权得给clickhouse):

echo 'alter table t_order_mt attach partition 20200601' | clickhouse-client

clickhouse-backup

上面FREEZE,DETACH手动备份数据的过程可使用clickhouse备份工具clickhouse-backup自动化实现。
还支持增量备份,支持元数据备份。

工具地址:

https://github.com/AlexAkulov/clickhouse-backup

我们进入后选择tags进入到版本选择,选择最新版,然后在assets中选择安装方式

ClickHouse备份恢复,第1张

我们选择rpm包,上传后安装:

sudo rpm -ivh clickhouse-backup-2.4.2-1.x86_64.rpm

用rpm方式安装后,默认配置文件在/etc/clickhouse-backup/,可执行文件在/usr/bin下,一共就这俩文件。

如果用二进制压缩包,解压后也需要手动将文件挪位置:

cp clickhouse-backup /usr/local/bin/ 
cp config.yml /etc/clickhouse-backup/

查看使用说明:

clickhouse-backup help

查看哪些表可以备份(默认过滤掉system):

clickhouse-backup tables

配置文件config.yml如下:

general:
  remote_storage: sftp   # 通过sftp,上传到远程服务器的话,需要这个参数,否则为none
  max_file_size: 1099511627776
  disable_progress_bar: false
  backups_to_keep_local: 2   # 本地备份的个数,大于2则自动删除旧的备份,默认为0,不删除备份
  backups_to_keep_remote: 2  # 远程备份的个数
  log_level: info
  allow_empty_backups: false
clickhouse:
  username: default    # 本地clickhouse的连接参数
  password: ""
  host: localhost
  port: 9010
  disk_mapping: {}
  skip_tables:
  - system.*
  - db.*
  - information_schema.*
  - INFORMATION_SCHEMA.*
  timeout: 5m
  freeze_by_part: false
  secure: false
  skip_verify: false
  sync_replicated_tables: true
  skip_sync_replica_timeouts: true
  log_sql_queries: false
s3:
  access_key: ""
  secret_key: ""
  bucket: ""
  endpoint: ""
  region: us-east-1
  acl: private
  force_path_style: false
  path: ""
  disable_ssl: false
  part_size: 536870912
  compression_level: 1
  compression_format: tar
  sse: ""
  disable_cert_verification: false
  storage_class: STANDARD
gcs:
  credentials_file: ""
  credentials_json: ""
  bucket: ""
  path: ""
  compression_level: 1
  compression_format: tar
cos:
  url: ""
  timeout: 2m
  secret_id: ""
  secret_key: ""
  path: ""
  compression_format: tar
  compression_level: 1
api:
  listen: localhost:7171
  enable_metrics: true
  enable_pprof: false
  username: ""
  password: ""
  secure: false
  certificate_file: ""
  private_key_file: ""
  create_integration_tables: false
ftp:
  address: ""
  timeout: 2m
  username: ""
  password: ""
  tls: false
  path: ""
  compression_format: tar
  compression_level: 1
sftp:
  address: "host"
  port: 端口号
  username: "用户名"
  password: "密码"
  key: ""
  path: "/home/data_dev/clickhouse_backup"   # 上传文件到远程服务器的路径
  compression_format: tar
  compression_level: 1
azblob:
  endpoint_suffix: core.windows.net
  account_name: ""
  account_key: ""
  sas: ""
  container: ""
  path: ""
  compression_level: 1
  compression_format: tar
  sse_key: ""

备份
创建备份:

sudo clickhouse-backup create

查看现有的本地备份(根据配置文件中备份路径来的):

sudo clickhouse-backup list

备份文件存储在/ar/lib/clickhouse/backup/BACKUPNAME。备份名称默认为时间戳,但是可以选择使用-name标志指定备份名称。备份包含两个目录:一个"metadata"目录,其中包含重新创建架构所需的DDL SQL语句;以及一个"shadow"目录,其中包含作为ALTER TABLE...FREEZE操作结果的数据(即备份数据)。

备份部份表:

clickhouse-backup create  -t 数据库.表名1,数据库.表名2

恢复
查看恢复数据相关参数:

clickhouse-backup restore --help

模拟删除备份过的表

echo 'drop table t_order_mt' | clickhouse-client

模拟删除备份过的库

echo 'drop database default' | clickhouse-client

从备份还原:

sudo clickhouse-backup restore 2020-0601T13-00-00

-- schema:只还原表结构
--data:只还原数据
--table:备份(或还原)特定表。也可以使用一个正则表达式,例如针对特定的数据库:--table=dbname.*

如果报目录已存在则可能是原路径下文件未被删除。

clickhouse-backup参考

https://blog.csdn.net/qq_36602951/article/details/127353925

https://www.xamrdz.com/backend/3zb1994038.html

相关文章: