有好多同学培训后咨询Jenkins的数据备份问题,今天就把Jenkins的常用的数据备份方法给大家总结一下。
Jenkins的数据存储结构
进行有效的Jenkins数据备份,首先要理解Jenkins的数据存储结构,然后根据业务场景选择合适的粒度进行备份。
典型的jenkins实例包含以下文件和目录:
*.xml 需要备份
config-history 需要备份
fingerprints 需要备份
global-build-stats 需要备份
*.key* 需要备份
jobs jobs配置需要备份(config.xml, nextBuildNumber), builds目录(build logs等)根据需求而定
logs 插件logs,根据需求而定,可以不备份
monitoring 可以不备份,插件会实时生成监控数据
nodes 需要备份
plugins 需要备份 *.jpi及 *.hpi,可以不备份每个插件子目录,jenkins启动后会更新插件子目录
secrets 需要备份
updates 需要备份
userContent 用户上传内容,可以根据需要备份
users 用户缓存信息,最好备份
使用插件备份
Jenkins 有好几个插件供用户使用,可以实现简单的备份
https://wiki.jenkins.io/display/JENKINS/Backup+Plugin
https://wiki.jenkins.io/display/JENKINS/PeriodicBackup+Plugin
https://wiki.jenkins.io/display/JENKINS/thinBackup
这些插件的基本原理是备份特定的配置信息,归档存储到master,同时提供restore的功能。
潜在问题: 数据归档在master,单点问题依然存在。如果master宕机了,备份数据无法获得,也就失去了意义了。
使用Rsync异地备份
为了避免master单点故障,可以将数据备份到远程备份机器。可以使用rsync工具同步Jenkins home到远程,可以利用rsync工具的 “--exclude-from=FILE”功能,定制一个exclude文件,过滤掉无需备份的数据。
潜在问题: 这种方法解决了单点备份的问题,但是需要权衡全量备份和增量备份的问题。如果每次同步到远端一个新的目录,每次同步将是一个全量备份,数据同步量大,速度慢;如果每次同步到相同的远端目录,将是增量备份,数据同步量少,速度快。每次全量备份,在牺牲网路带宽和远端存储等资源下,备份会有多个版本;而每次增量备份,远端备份和最新数据同步后,只保留最新版本。
全量还是增量,多版本还是最新版本等,用户需要去权衡。
使用版本控制工具进行备份
如果把Jenkins home看成代码的话,我们可以使用版本控制的方法备份到代码仓库。一般情况下,公司的代码仓库安全性比较高。
这种方法基于版本控制仓库的备份方法,通过版本控制工具将备份服务器需要的配置增量备份到版本仓库中。
把Jenkins配置备份到版本控制仓库,有两大好处:
1. 增量备份,避免了归档备份等冗余备份对CPU,Disk等的浪费
2. 理论上可以恢复到所有历史版本,取决于备份周期
比如使用Gitlab作为备份仓库,基本步骤:
1. 创建gitlab repo用作Jenkins home 备份远程repo
2. 设置gitlab repo权限,确保Jenkins account可以 push code等
3. 将Jenkins home 初始化为本地repo
4. 添加 .gitignore 文件
5. 将Jenkins home 本地仓库内容push到远程repo中,创建master分支
6. 创建Jenkins job或者Crontab 实现定时周期性备份
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICdzFWRoRXdvN1LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX90TUhNHZtJGasd1YoZFShZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DNwUjNzMDNwEDMzEDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
潜在问题: 不要手动在Jenkins home下使用 类似 git pull 等命令,谨记Jenkins home下数据是第一最新数据,代码仓库只是备份数据。每次备份,代码仓库会生成一个新的commit版本,周期取决于备份job或者cron的设置周期。