数据备份是IT运营中不可或缺的重要部分。在“大数据”部署(例如分析数据库)中,它们最具挑战性。本文将探讨备份ClickHouse所涉及的管道,并介绍用于自动化过程的Clickhouse备份工具。
ClickHouse内置的本机复制支持可提供高可用性和针对单个节点故障的弹性。但是,极少数的灾难情况可能需要从备份中恢复数据。其中包括数据损坏以及分片或群集中所有副本的故障。
任何ClickHouse备份方案的关键组成部分都是“冻结”表。与所有数据库一样,一致的备份取决于ClickHouse处于“静默”状态。ClickHouse不必完全停止数据库,而对“冻结”表进行备份或迁移提供了本机支持。这是无停机时间的操作。
四个简单步骤中的手动备份
ClickHouse通过其 ALTER TABLE…FREEZE
功能提供了对即时时间点备份的本地支持。
- 确认您的影子目录为空:
ls /var/lib/clickhouse/shadow/
- 冻结ClickHouse 数据表:
echo -n 'alter table events freeze' | clickhouse-client
- 如果发生灾难,请保存备份:
cd /var/lib/clickhouse/ sudo mkdir backup sudo cp -r shadow/ backup/my-backup-name
- 最后,为下次清理备份源:
sudo rm -rf /var/lib/clickhouse/shadow/*
ClickHouse使用文件系统硬链接来实现即时备份,而不会导致ClickHouse服务停机(或锁定)。这些硬链接可以进一步用于有效的备份存储。在支持硬链接的文件系统(例如本地文件系统或NFS)上,将cp与-l标志一起使用(或将rsync与–hard-links和–numeric-ids标志一起使用)以避免复制数据。
当使用硬链接时,磁盘上的存储效率更高。因为它们依赖于硬链接,所以即使避免了重复使用磁盘空间,每个备份实际上都是“完整”备份。
测试您的备份
正确地说,如果未测试还原过程,则备份毫无价值。执行常规的测试还原,以确保您的数据在需要时就在那里。
以下是手动恢复的步骤:
- 删除测试表,或找到其他服务器进行测试。
- 创建测试表以进行恢复:
cat events.sql | clickhouse-client
- 将您的备份复制到表的“ detached”目录中:
cd /var/lib/clickhouse
sudo cp -rl backup/my-backup-name/* data/default/events/detached/
- 附上分离的零件:
echo 'alter table events attach partition 202006' | clickhouse-client
- 确认您的数据已还原:
echo 'select count() from events' | clickhouse-client
使用以下方式自动化备份过程 clickhouse-backup
由Alex Akulov创建的clickhouse-backup工具有助于自动化上述手动步骤:https : //github.com/AlexAkulov/clickhouse-backup。我们喜欢clickhouse-backup,并实现了一些新功能,在此首次进行介绍。
要开始使用,您需要安装clickhouse-backup
。完整说明位于ReadMe.md文件中。这是从tarball安装的示例。还提供了RPM,Debian软件包和Docker映像。
wget https://github.com/AlexAkulov/clickhouse-backup/releases/download/v0.6.3/clickhouse-backup.tar.gz tar -xf clickhouse-backup.tar.gz cd clickhouse-backup/ sudo cp clickhouse-backup /usr/local/bin clickhouse-backup -v
此博客文章中介绍的API功能和新的存储选项(例如'remote_storage')尚未在正式版本中提供。您需要从源代码构建或运行最新的docker映像。这是后者的一个例子。
docker run --rm -it --network host -v "/var/lib/clickhouse:/var/lib/clickhouse" -e CLICKHOUSE_PASSWORD="password" -e S3_BUCKET="clickhouse-backup" -e S3_ACCESS_KEY="access_key" -e S3_SECRET_KEY="secret" alexakulov/clickhouse-backup:master --help
对于本文的其余部分,我们假定您具有一个具有新功能的内部版本。在命令行上使用Clickhouse-backup时,需要配置文件。这是一个最小的示例。
$ cat /etc/clickhouse-backup/config.yml general: remote_storage: none
您将需要为非默认的ClickHouse安装或身份验证添加其他配置选项。可以通过运行来创建完整的配置示例clickhouse-backup default-config
。这是您使用的一个很好的起点,它显示了所有可用的设置。
配置完成后,clickhouse-backup将提供各种用于管理备份的子命令。
$ clickhouse-backup help NAME: clickhouse-backup - Tool for easy backup of ClickHouse with cloud support ... COMMANDS: tables Print list of tables create Create new backup upload Upload backup to remote storage list Print list of backups download Download backup from remote storage restore Create schema and restore data from backup delete Delete specific backup default-config Print default config freeze Freeze tables clean Remove data in 'shadow' folder server Run API server help, h Shows a list of commands or help for one command
就像上面的手动备份示例一样,您将需要以Clickhouse用户身份使用sudo
或运行clickhouse-backup
。
该配置文件允许忽略某些数据库或表。该tables
子命令将向您显示要备份的表:
$ clickhouse-backup tables default.events system.metric_log (ignored) system.query_log (ignored) system.query_thread_log (ignored) system.trace_log (ignored)
创建备份非常简单:
$ sudo clickhouse-backup create 2020/07/06 20:13:02 Create backup '2020-07-06T20-13-02' 2020/07/06 20:13:02 Freeze `default`.`events` 2020/07/06 20:13:02 Skip `system`.`metric_log` 2020/07/06 20:13:02 Skip `system`.`query_log` 2020/07/06 20:13:02 Skip `system`.`query_thread_log` 2020/07/06 20:13:02 Skip `system`.`trace_log` 2020/07/06 20:13:02 Copy metadata 2020/07/06 20:13:02 Done. 2020/07/06 20:13:02 Move shadow 2020/07/06 20:13:02 Done.
如您在上面的示例中看到的,备份在同一秒内完成。
您可以查看现有的本地备份:
$ sudo clickhouse-backup list Local backups: - '2020-07-06T20-13-02' (created at 06-07-2020 20:13:02)
注意,出于性能原因,本地备份不计算“大小”。
clickhouse-backup
如上所述,在内部尽可能使用硬链接。备份存储在中/var/lib/clickhouse/backup/BACKUPNAME
。备份名称默认为时间戳,但是您可以选择使用–name标志指定备份名称。备份包含两个目录:一个“元数据”目录,其中包含重新创建架构所需的DDL SQL语句;以及一个“影子”目录,其中包含作为ALTER TABLE ... FREEZE
操作结果的数据。
从备份还原也很容易。例如:
$ echo 'drop table events' | clickhouse-client $ sudo clickhouse-backup restore 2020-07-06T20-13-02 2020/07/06 20:14:46 Create table `default`.`events` 2020/07/06 20:14:46 Prepare data for restoring `default`.`events` 2020/07/06 20:14:46 ALTER TABLE `default`.`events` ATTACH PART '202006_1_1_4' 2020/07/06 20:14:46 ALTER TABLE `default`.`events` ATTACH PART '202006_2_2_2' 2020/07/06 20:14:46 ALTER TABLE `default`.`events` ATTACH PART '202006_3_3_3' 2020/07/06 20:14:46 ALTER TABLE `default`.`events` ATTACH PART '202006_4_4_3' 2020/07/06 20:14:46 ALTER TABLE `default`.`events` ATTACH PART '202006_5_5_2' 2020/07/06 20:14:46 ALTER TABLE `default`.`events` ATTACH PART '202006_6_6_1'
该restore
子命令自动模式和数据恢复。如果只想还原架构,请使用可选--schema
标志。或者,如果只想还原数据(假设架构已存在),则可以使用该--data
标志。后一种情况在还原到已经具有现有数据的服务器时特别有用。
另一个有用的功能是支持使用大多数命令(例如创建和还原)指定表模式。该--table
参数允许您备份(或还原)特定表。你也可以使用一个正则表达式,例如,针对特定的数据库:--table=dbname.*
。
远程备份目标
当然,您可以将备份同步到远程目标,将其保存到S3之类的对象存储中,或使用现有的备份解决方案对其进行存档。本地存储通常不足以满足数据持久性要求。
clickhouse-backup工具支持从远程对象存储(例如S3,GCS或IBM COS)上载和下载备份。最小的AWS S3配置如下所示:
s3: access_key: <YOUR AWS ACCESS KEY> secret_key: <YOUR AWS SECRET KEY> bucket: <YOUR BUCKET NAME> region: us-east-1 path: "/some/path/in/bucket"
配置clickhouse-backup
完凭据和目标存储段后,即可完成其余工作:
$ clickhouse-backup upload 2020-07-06T20-13-02 2020/07/07 15:22:32 Upload backup '2020-07-06T20-13-02' 2020/07/07 15:22:49 Done. The remote backup can be downloaded to local storage before restoration: $ sudo clickhouse-backup download 2020-07-06T20-13-02 2020/07/07 15:27:16 Done.
该clickhouse-backup
配置文件支持backups_to_keep_local
和backups_to_keep_remote
设置-调整它们以满足数据保留要求。例如,set backups_to_keep_local: 7
并且backups_to_keep_remote: 31
保留了一周的夜间备份的本地和一个月的远程控制。将两者都设置为0可禁用备份修剪。
--diff-from
upload子命令也有一个选项。此功能将文件与以前的本地备份进行比较,仅上载新的/更改的文件。必须保留先前的备份,以便从新备份中进行还原。
数据传输时间和成本是远程存储的关键方面。将大表还原到新服务器需要多长时间?这将在很大程度上取决于网络和存储带宽。测试各种恢复方案以充分了解故障中可以实现的恢复时间至关重要。如果您使用公共云,则成本管理将非常重要。
使用Clickhouse-backup API
最后,clickhouse-backup
可以作为提供REST API的服务运行。这是一个新功能。该API反映了命令行命令和选项,并且可能是与现有调度或CI / CD系统集成的更方便的方法。
$ sudo clickhouse-backup server & $ curl localhost:7171/backup/list {"Type":"local","Name":"2020-07-06T20-13-02","Size":0,"Date": "2020-07-06T20:13:02.328066165Z"}
可以在以下位置找到API端点的文档:https : //github.com/AlexAkulov/clickhouse-backup#api
clickhouse-backup
在生产中使用
重要的是要注意的已知限制clickhouse-backup
,在此处记录了这些限制:https : //github.com/AlexAkulov/clickhouse-backup#limitations
此外,文档还包含以下重要警告:
切勿在中更改文件权限/var/lib/clickhouse/backup
。此路径包含硬链接。磁盘上相同数据的所有硬链接上的权限始终相同。这意味着,如果您更改备份路径中硬链接上的权限/所有者/属性,与ClickHouse一起使用的文件的权限也将更改。这可能会导致数据损坏。