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中选择安装方式

我们选择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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容