ClickHouse-backup从入门到精通:手把手教你配置异地容灾方案(附自动备份脚本)
ClickHouse-backup从入门到精通手把手教你配置异地容灾方案附自动备份脚本最近和几个负责数据平台的朋友聊天发现大家虽然都在用ClickHouse处理海量数据但一聊到备份和容灾不少人还是有点头疼。尤其是当数据量上了PB级别传统的导出导入或者简单拷贝数据目录的方法要么效率低下要么风险极高。我自己在几年前的一次数据迁移事故中吃过亏从那以后就花了不少精力研究如何构建一套稳定、自动化的企业级备份方案。今天我想抛开那些泛泛而谈的教程直接分享一套基于clickhouse-backup工具的实战级异地容灾配置流程里面会包含我踩过的坑、优化过的脚本以及如何与现有监控体系对接。无论你是刚开始规划备份策略还是想优化现有的方案相信都能找到一些实用的思路。1. 理解ClickHouse备份的挑战与核心工具选型ClickHouse以其卓越的OLAP性能闻名但其存储引擎尤其是MergeTree家族的特性也给备份恢复带来了独特挑战。直接复制数据文件/var/lib/clickhouse/data看似简单但在生产环境可能遇到表引擎状态不一致、硬链接问题或者在恢复时因UUID冲突导致失败。而通过SELECT ... INTO OUTFILE导出CSV或Native格式对于亿级数据量来说时间和存储成本都难以接受。这时专门为ClickHouse设计的第三方工具就显得尤为重要。clickhouse-backup是目前社区最活跃、功能最全面的备份工具之一。它的核心原理非常巧妙利用ClickHouse的ALTER TABLE ... FREEZE功能在文件系统层面为表数据创建快照硬链接从而在几乎不影响线上查询的情况下获取一份数据在某个时间点的静止视图。然后工具会打包这份快照以及对应的元数据CREATE TABLE语句形成一个完整的备份集。与简单的文件拷贝相比clickhouse-backup的优势在于一致性通过FREEZE确保备份时间点的数据一致性。灵活性支持全库、单表、多表备份以及灵活的过滤规则。集成化原生支持上传到S3、GCS、Azure Blob等对象存储也支持SFTP、FTP等远程存储。可恢复性备份集包含了完整的元数据恢复时可以自动重建表结构。在决定采用它之前你需要确认你的环境是否符合基本要求ClickHouse版本高于1.1.54390并且主要使用的是MergeTree系列表引擎。对于使用了复杂存储策略Tiered storage或云存储策略的表需要查阅最新版本的兼容性说明。2. 从零开始部署与配置clickhouse-backup安装clickhouse-backup有多种方式我个人偏好使用下载预编译的二进制文件这样版本管理更灵活也避免了包管理器的依赖冲突。2.1 安装与基础配置首先从GitHub Releases页面下载最新稳定版的二进制文件。假设我们以root用户操作但请注意最佳实践是使用clickhouse用户来运行备份任务以避免权限问题。# 下载并解压 wget https://github.com/AlexAkulov/clickhouse-backup/releases/download/v2.4.0/clickhouse-backup-linux-amd64.tar.gz tar -xzf clickhouse-backup-linux-amd64.tar.gz -C /usr/local/bin/ chmod x /usr/local/bin/clickhouse-backup # 创建配置目录 mkdir -p /etc/clickhouse-backup/接下来是配置的核心。默认的配置文件模板可以通过命令生成clickhouse-backup default-config /etc/clickhouse-backup/config.yml。我们重点关注以下几个部分general: max_file_size: 107374182400 # 单个备份文件最大100GB超过会自动分割 disable_progress_bar: false backups_to_keep_local: 3 # 本地保留最近3个备份避免磁盘撑满 backups_to_keep_remote: 30 # 远程存储保留30个备份用于长期归档 log_level: info allow_empty_backups: false clickhouse: username: default password: your_secure_password # 如果设置了密码务必填写 host: localhost port: 9000 skip_tables: - system.* # 通常跳过系统表 - default.* # 根据情况跳过测试库 - monitoring.metrics_log # 跳过某些不需要备份的日志表 timeout: 10m sync_replicated_tables: true # 对于复制表确保备份一致性 log_sql_queries: false注意skip_tables配置非常有用可以排除那些不需要备份的临时表、日志表能显著减少备份体积和时间。务必根据你的实际库表结构进行调整。配置好后可以用一个简单命令测试连通性和配置是否正确clickhouse-backup tables这个命令会列出所有可备份的表及其预估大小是验证配置是否生效的第一步。2.2 首次全量备份与恢复演练配置无误后立即执行一次手动全量备份并进行恢复演练。这是容灾方案中至关重要的一环备份不能恢复就等于没有备份。# 创建名为“initial_full_backup”的备份 clickhouse-backup create initial_full_backup # 查看创建的备份 clickhouse-backup list备份文件默认存储在ClickHouse的数据目录下的backup子目录中例如/var/lib/clickhouse/backup/initial_full_backup。里面主要包含两个部分metadata/: 所有数据库和表的SQL定义文件。shadow/: 通过FREEZE创建的数据快照。现在我们找一个测试环境或者临时表进行恢复演练# 假设我们只恢复某个特定的测试数据库 test_backup clickhouse-backup restore initial_full_backup --tabletest_backup.* --rm参数--rm会在恢复前删除已存在的表请确保在安全的环境下操作。恢复完成后立即验证数据完整性和一致性比如对比行数、抽样查询关键数据。3. 构建自动化异地备份流程本地备份只是第一步要应对服务器硬盘损坏、机房级别故障必须将备份数据传送至异地。clickhouse-backup原生支持多种远程存储这里我们以最常用的S3兼容对象存储和通过SSH同步到远程服务器两种方案为例。3.1 方案一配置S3对象存储备份对象存储几乎是现代备份方案的标准选择它提供了高持久性、无限扩展性和地理冗余。你需要准备好S3的访问密钥、Secret密钥、桶Bucket名称和端点Endpoint如果是非AWS S3。在config.yml中配置S3部分s3: access_key: YOUR_ACCESS_KEY secret_key: YOUR_SECRET_KEY bucket: your-clickhouse-backups endpoint: s3.us-east-1.amazonaws.com # 根据你的存储区域修改 region: us-east-1 path: production/cluster_a/ # 在桶内的路径前缀便于管理多集群 disable_ssl: false compression_level: 1 compression_format: tar storage_class: STANDARD # 对于不常访问的归档备份可考虑“GLACIER”或“DEEP_ARCHIVE” sse: AES256 # 启用服务器端加密配置完成后创建并直接上传备份到S3的命令变得非常简单# 创建备份并自动上传到S3 clickhouse-backup create_remote s3_backup_$(date %Y%m%d) # 查看远程备份列表 clickhouse-backup list remote关键优化点生命周期规则在S3桶上配置生命周期策略自动将超过一定时间如90天的备份转移到更低成本的归档存储层并最终过期删除。增量备份考虑clickhouse-backup目前的全量备份对于大数据集可能耗时耗资源。对于超大规模集群可以结合其“增量”备份功能检查特定版本或者采用“表级别”的备份策略每天只备份增量变化大的核心表。3.2 方案二通过脚本与SSH同步至远程服务器如果你的策略是备份到公司内网的另一个机房或专属备份服务器SSHRsync是经典可靠的选择。虽然clickhouse-backup支持SFTP配置但我更推荐使用rsync因为它能更好地处理增量同步和断点续传。首先确保ClickHouse服务器可以免密SSH登录到备份服务器。然后编写一个封装脚本将备份、同步、清理逻辑整合在一起。#!/bin/bash # /usr/local/bin/clickhouse_backup_sync.sh set -euo pipefail # 配置变量 BACKUP_NAMEch_backup_$(date %Y%m%d_%H%M%S) LOCAL_BACKUP_DIR/var/lib/clickhouse/backup REMOTE_USERbackupuser REMOTE_HOSTbackup-server.internal.com REMOTE_DIR/data/clickhouse_backups/production/ LOG_FILE/var/log/clickhouse-backup.log RETENTION_DAYS_LOCAL3 RETENTION_DAYS_REMOTE30 # 日志函数 log() { echo [$(date %Y-%m-%d %H:%M:%S)] $1 | tee -a $LOG_FILE } log 开始ClickHouse备份任务 # 1. 创建本地备份 log 创建本地备份: $BACKUP_NAME if ! /usr/local/bin/clickhouse-backup create $BACKUP_NAME; then log 错误本地备份创建失败 exit 1 fi # 2. 使用rsync同步到远程服务器使用压缩和部分传输优化 LOCAL_PATH$LOCAL_BACKUP_DIR/$BACKUP_NAME log 同步备份到远程服务器: $REMOTE_HOST if ! rsync -avz --partial --delete $LOCAL_PATH $REMOTE_USER$REMOTE_HOST:$REMOTE_DIR; then log 警告远程同步过程出现错误但本地备份已存在。 # 这里可以加入告警通知如发送邮件或Slack消息 fi # 3. 清理本地旧备份保留最近3天 log 清理本地过期备份保留${RETENTION_DAYS_LOCAL}天 find $LOCAL_BACKUP_DIR -maxdepth 1 -name ch_backup_* -type d -mtime $RETENTION_DAYS_LOCAL -exec rm -rf {} \; 2/dev/null || true # 4. 清理远程旧备份通过SSH执行保留30天 log 清理远程过期备份保留${RETENTION_DAYS_REMOTE}天 ssh $REMOTE_USER$REMOTE_HOST find \$REMOTE_DIR\ -maxdepth 1 -name \ch_backup_*\ -type d -mtime $RETENTION_DAYS_REMOTE -exec rm -rf {} \; 2/dev/null || true log 备份任务完成 将这个脚本加入crontab实现定时自动化# 每天凌晨2点执行备份 0 2 * * * /bin/bash /usr/local/bin/clickhouse_backup_sync.sh3.3 两种方案的对比与选型建议为了更清晰地帮你决策我将两种核心异地备份方案的关键特性对比如下特性维度S3兼容对象存储方案SSH远程服务器方案架构复杂度低无需维护备份服务器中需维护备份服务器及SSH密钥对可扩展性近乎无限按需使用受备份服务器存储容量限制成本模型按存储量、请求量、流量计费主要为硬件购置与运维成本数据传输通常走公网可加密依赖带宽通常走内网速度更快、成本低管理开销低生命周期策略等可自动化中需要手动监控磁盘空间、维护脚本恢复速度取决于下载带宽可能较慢内网传输恢复速度快适用场景云上环境、混合云、追求免运维纯内网环境、对数据出境有要求、成本敏感我的建议是如果业务部署在公有云上直接使用S3方案是最省心的。如果是自建IDC且拥有另一个机房那么SSHRsync方案在成本和可控性上更有优势。对于核心生产系统我强烈建议采用混合策略近期备份如7天内通过SSH同步到异地机房用于快速恢复同时将所有备份上传到S3进行长期归档和作为最终保障。4. 生产环境进阶权限、监控与故障处理当备份方案进入生产环境就不能只满足于“能跑通”还需要考虑安全、可观测性和异常处理。4.1 权限最小化原则切勿使用default用户或具有ALL权限的用户进行备份。应该为clickhouse-backup创建一个专属用户并授予最小必要权限。在ClickHouse中执行CREATE USER backup_user IDENTIFIED WITH sha256_password BY StrongBackupPass123!; GRANT SHOW TABLES, SELECT, CREATE TABLE, DROP TABLE ON *.* TO backup_user; GRANT SYSTEM FREEZE ON *.* TO backup_user; -- 执行FREEZE所必需然后在config.yml中更新用户名和密码。对于S3的访问密钥也应遵循最小权限原则仅授予对特定备份桶的读写权限。4.2 监控与告警集成备份任务“静默失败”是运维的噩梦。必须建立有效的监控。监控备份脚本执行结果上面的脚本已将日志写入文件。可以配置logrotate管理日志并用fail2ban或监控agent扫描日志中的“错误”关键字并触发告警。监控备份文件大小与新鲜度在备份服务器或通过S3 API监控最新备份文件的时间戳和大小。如果超过24小时没有新备份或备份文件大小异常如为0或显著小于往常则发出告警。# 示例检查本地最新备份是否在24小时内 latest_backup$(find /var/lib/clickhouse/backup -maxdepth 1 -type d -name ch_backup_* -printf %T %p\n | sort -n | tail -1 | cut -f2- -d ) if [[ -n $latest_backup ]]; then if [[ $(find $latest_backup -mtime 0) ]]; then echo 告警最新备份已超过24小时 fi fi监控ClickHouse备份相关系统表ClickHouse的system.backup_actions表如果版本支持可以记录备份操作的状态。定期恢复验证这是最高级别的监控。可以每月一次将备份恢复到独立的测试集群运行一些验证查询确保备份数据是可用的。这个过程可以自动化。4.3 常见故障场景与应对备份失败Freeze命令超时现象备份日志卡住最终因超时失败。排查检查ClickHouse服务器负载是否过高磁盘IO是否瓶颈。对于超大表可以尝试在配置文件中调整timeout参数或考虑在业务低峰期进行备份。配置调整clickhouse: timeout: 30m # 根据实际情况增加超时时间 freeze_by_part: true # 尝试启用按分区冻结可能对超大表更友好恢复失败UUID冲突错误现象恢复时报错“Directory for table data ... already exists”。根因备份中的表UUID与目标集群中现有表的UUID冲突。解决这是clickhouse-backup恢复时的一个经典问题。解决方法是在恢复时使用--rm参数先删除现有表或者在恢复前手动编辑备份目录中metadata/database/table.json文件删除或注释掉uuid字段让ClickHouse在恢复时分配新的UUID。远程上传失败网络或权限问题现象create_remote失败或脚本中rsync/scp失败。排查检查网络连通性。验证S3凭证或SSH密钥权限。检查备份服务器磁盘空间是否已满。策略在脚本中做好错误判断和重试机制。对于关键备份可以考虑实现“备份-验证-上传”的步骤确保本地备份成功后再进行传输。最后别忘了将整个备份恢复流程文档化并定期进行灾难恢复演练。真正的容灾能力不在于工具多先进而在于整个团队对流程的熟悉程度和预案的可执行性。我自己的习惯是每季度模拟一次“核心数据库服务器宕机”的场景从异地的备份中恢复服务这能暴露出很多配置和流程上的细微问题。

相关新闻

告别startActivityForResult!Android开发者必学的registerForActivityResult实战指南(Kotlin/Java双版本)

告别startActivityForResult!Android开发者必学的registerForActivityResult实战指南(Kotlin/Java双版本)

告别startActivityForResult!Android开发者必学的registerForActivityResult实战指南(Kotlin/Java双版本) 如果你最近打开Android Studio,在写startActivityForResult时看到了那个刺眼的删除线,心里咯噔了一下&#xf…

2026/7/3 3:21:11 阅读更多 →
CentOS7下OpenSSH 9.7升级全攻略:从依赖安装到服务配置(附常见问题解决方案)

CentOS7下OpenSSH 9.7升级全攻略:从依赖安装到服务配置(附常见问题解决方案)

CentOS 7 系统安全加固:手动编译升级 OpenSSH 9.7 的深度实践与避坑指南 在当前的运维安全实践中,保持核心服务组件的最新状态,尤其是像SSH这样的远程访问入口,其重要性不言而喻。对于仍在使用 CentOS 7 这类经典稳定版系统的生产…

2026/7/8 5:26:22 阅读更多 →
从餐厅到代码:用Celery模拟外卖系统任务分发(Python3.11+Django版)

从餐厅到代码:用Celery模拟外卖系统任务分发(Python3.11+Django版)

从餐厅到代码:用Celery模拟外卖系统任务分发(Python3.11Django版) 想象一下,你走进一家繁忙的餐厅,前台服务员微笑着记下你的订单,然后转身将一张写着“宫保鸡丁一份,加辣”的单子贴在后厨的订单…

2026/7/3 6:23:46 阅读更多 →

最新新闻

WSEN-ISDS 6自由度IMU传感器与PIC18F46K22的集成应用

WSEN-ISDS 6自由度IMU传感器与PIC18F46K22的集成应用

1. 项目背景与硬件选型解析 在机器人导航、无人机控制和工业自动化领域,精确的空间运动追踪一直是核心技术挑战。传统方案往往需要分别部署加速度计和陀螺仪模块,不仅增加了系统复杂度,还面临数据同步和校准难题。WSEN-ISDS (2536030320001)这…

2026/7/8 11:59:27 阅读更多 →
3分钟让QQ音乐文件告别平台限制:QMCDecode实现跨设备音频自由

3分钟让QQ音乐文件告别平台限制:QMCDecode实现跨设备音频自由

3分钟让QQ音乐文件告别平台限制:QMCDecode实现跨设备音频自由 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录&#xff0…

2026/7/8 11:55:23 阅读更多 →
STM32与IIM-20670运动传感器的高精度姿态测量实现

STM32与IIM-20670运动传感器的高精度姿态测量实现

1. 项目背景与核心组件选型 在工业自动化、无人机导航和机器人控制等领域,高精度运动跟踪系统的需求日益增长。IIM-20670作为TDK InvenSense推出的6轴运动跟踪传感器,结合STM32F411RE微控制器的强大处理能力,能够为各类应用提供可靠的惯性测量…

2026/7/8 11:55:23 阅读更多 →
鸣潮工具箱:如何彻底解决游戏性能与账号管理的双重困境?

鸣潮工具箱:如何彻底解决游戏性能与账号管理的双重困境?

鸣潮工具箱:如何彻底解决游戏性能与账号管理的双重困境? 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 你是否曾在《鸣潮》的绚丽世界中遭遇这样的困扰:高配电脑却被锁…

2026/7/8 11:51:12 阅读更多 →
IIM-20670与PIC18F86K90运动跟踪系统开发指南

IIM-20670与PIC18F86K90运动跟踪系统开发指南

1. IIM-20670与PIC18F86K90的硬件架构解析 IIM-20670是TDK-InvenSense推出的6轴运动跟踪传感器,采用2.5x3x0.9mm的LGA-14封装。这个微型封装内集成了3轴MEMS陀螺仪和3轴MEMS加速度计,每个轴都配备了独立的16位ADC进行信号转换。陀螺仪支持31.25至2000度/…

2026/7/8 11:49:04 阅读更多 →
市场上餐厨油回收源头厂家

市场上餐厨油回收源头厂家

核心优势作为一家专注于餐厨废油/废弃动植物油脂回收、清运及资源化处置的专业公司,山东美翔环境设备有限公司(简称钜焜)致力于为餐饮门店、单位食堂、食品加工厂、酒店等提供一站式服务。我们的核心优势在于源头工厂直营模式,无中…

2026/7/8 11:49:04 阅读更多 →

日新闻

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: …

2026/7/8 0:00:48 阅读更多 →
MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N1 到批处理的全路径 一、从"功能正确"到"性能可接受"——MyBatis 批量操作的三段式进化 MyBatis 在日常增删改查场景中几乎是无感的——实体映射直观、SQL 控制灵活。但当数据量从千级上升到十万级、百万级,许…

2026/7/8 0:00:48 阅读更多 →
工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

1. 工业负载控制方案概述在工业自动化、电机驱动和照明控制等高需求场景中,可靠地控制电感和电阻负载是核心挑战之一。TPD2015FN作为东芝的8通道高端智能功率开关IC,配合PIC18F45K22微控制器,能够构建一套稳定、高效的负载控制系统。这套组合…

2026/7/8 0:02:48 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/7 14:24:45 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/7 15:59:06 阅读更多 →

月新闻