高可用与备份恢复
Jenkins 的高可用和数据库高可用思路不同——Jenkins 的"状态"几乎全在 $JENKINS_HOME 文件系统里。因此备份恢复是第一优先级,多实例是第二优先级。
本篇目标:能制定并执行 $JENKINS_HOME 的备份策略,理解多 Master 方案的取舍,完成一次恢复演练。
1. 核心:备份 $JENKINS_HOME
Jenkins 的所有配置、Job、凭证、插件状态、构建记录都在 $JENKINS_HOME。备份它 = 备份整个 Jenkins。
1.1 需要备份什么
| 内容 | 位置(在 $JENKINS_HOME 下) | 优先级 |
|---|---|---|
| Job 配置 | jobs/ | 高 |
| 凭证 | secrets/、credentials.xml | 高(含密钥) |
| 全局配置 | config.xml | 高 |
| 插件状态 | plugins/(可重装,但版本信息重要) | 中 |
| 构建记录 / 产物 | jobs/*/builds/ | 中(大,按需) |
| 用户 / 权限 | users/ | 中 |
1.2 备份方式对比
| 方式 | 说明 | 推荐 |
|---|---|---|
直接拷贝 $JENKINS_HOME | 简单,但非原子、可能备份到写一半的状态 | 加锁/停止写入时做 |
| ThinBackup 插件 | 按 Job 归档,支持恢复到指定时间 | 中小团队常用 |
| 快照(云盘/文件系统) | 原子、快 | 生产首选 |
| 定时 rsync + 版本 | 配合快照做增量 | 结合场景 |
# 云盘快照(生产首选):对挂载 $JENKINS_HOME 的卷做快照
# 或 rsync 备份
rsync -a --delete /var/jenkins_home/ backup:/backup/jenkins-home/ \
--exclude 'workspace/' --exclude 'logs/'
备份时机
构建进行中拷贝 $JENKINS_HOME 可能拿到写一半的文件。生产上建议:先停写入(SafeRestart 或维护窗口),或使用支持一致性的快照。恢复前用 jenkins-jobs / 校验工具检查完整性。
1.3 备份策略建议
频率:每日全量 + 保留 30 天;关键变更(升级/大改)前手动快照
验证:每周做一次"恢复到测试目录"演练,确认能启动
异地:备份文件复制到异地或对象存储,防单点故障
2. 恢复演练
# 1. 在测试机器解压备份
tar xzf jenkins-home-backup.tgz -C /tmp/jenkins-restore/
# 2. 用备份启动一个临时 Jenkins
docker run -d --name jenkins-restore \
-v /tmp/jenkins-restore:/var/jenkins_home \
-p 18080:8080 \
jenkins/jenkins:lts-jdk17
# 3. 访问 http://localhost:18080,确认 Job、凭证、配置都在
# 4. 触发一个 Job 验证能跑通
恢复演练至少验证:
- Jenkins 能正常启动,无配置损坏
- Job 列表完整,可运行
- 凭证可解密使用(
secrets/一致) - 用户能登录,权限正常
- Agent 能重新连接
3. 多 Master(HA)方案
3.1 方案对比
| 方案 | 架构 | 优点 | 缺点 |
|---|---|---|---|
| 单 Master + 多 Agent(推荐) | 一个调度中心 | 简单、数据一致 | Master 本身单点 |
| 主备 + 共享存储 | 备实例共享 $JENKINS_HOME | 故障切换快 | 共享存储本身要 HA,并发写有风险 |
| 冷备 | 备机定期同步,不运行 | 简单 | 切换有延迟,手动 |
| Jenkins 官方 HA(试验) | 多控制器 + 共享状态 | 真正高可用 | 配置复杂、仍不稳定 |
现实建议
大多数团队的正确选择是:单 Master + 多 Agent + 可靠的备份恢复。Jenkins 不是低延迟数据库,Master 宕机几十分钟通常可接受,重点是"恢复时间"而不是"零停机"。盲目上多 Master 反而引入状态一致性问题。
3.2 多 Agent 本身就是"弹性高可用"
构建负载由多个 Agent 承接,Master 挂了 Agent 只是等命令,不丢构建。所以:
- 把 Master 做好备份(快速恢复);
- Agent 可多(弹性),Master 求稳(不跑构建)。
4. 灾备演练
RTO(恢复时间目标):建议 < 4 小时
RPO(数据丢失容忍):建议 ≤ 24 小时(每日备份)
# 定期演练记录
# 1. 从最新备份恢复出临时实例
# 2. 记录恢复耗时(RTO 达标?)
# 3. 验证关键 Job 能构建
# 4. 记录发现的缺口(凭证丢失?插件缺版本?)
5. 练习与验收
练习 A
- 用 rsync 或 ThinBackup 对当前 Jenkins 做一次全量备份
- 在新目录恢复备份,启动临时 Jenkins 实例,确认 Job 和凭证完整
- 记录从备份到恢复的耗时
练习 B
- 模拟故障:删掉一个 Job,再从备份恢复
- 配置每日备份 + 保留策略(脚本或插件)
- 评估你们的 RTO / RPO,写一份灾备演练记录
验收清单
- 知道 $JENKINS_HOME 是备份核心,理解各子目录的重要性
- 能执行备份和恢复演练,验证 Job/凭证/用户完整
- 了解多 Master 方案的取舍,知道单 Master + 多 Agent + 备份是常见正解
- 制定了备份频率、保留期和异地存储策略
- 有可量化的 RTO / RPO 并演练过
下一篇:安全加固。