官网说明
参考官网:
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
上面的过程可使用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下,一共就这俩文件。
查看使用说明:
clickhouse-backup help
查看哪些表可以备份(默认过滤掉system):
clickhouse-backup tables
备份
创建备份:
sudo clickhouse-backup create
查看现有的本地备份(根据配置文件中备份路径来的):
sudo clickhouse-backup list
备份文件存储在/ar/lib/clickhouse/backup/BACKUPNAME。备份名称默认为时间戳,但是可以选择使用-name标志指定备份名称。备份包含两个目录:一个"metadata"目录,其中包含重新创建架构所需的DDL SQL语句;以及一个"shadow"目录,其中包含作为ALTER TABLE...FREEZE操作结果的数据(即备份数据)。
恢复
模拟删除备份过的表
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.*
如果报目录已存在则可能是原路径下文件未被删除。








网友评论