如果把一个Jenkins的整个目录赋值到另一个Jenkins的目录,则需要务必保持两个Jenkins版本是相同的,不然容易出现Jenkins插件兼容性问题。
另外使用inotify+rsync备份的时候(从主Jenkins往备Jenkins备份),注意,一旦切换到备Jenkins,就要里面终止同步进程,知道为什么吗?
原因是,如果不停止同步任务,那么主Jenkins的内容会不停的同步到备Jenkins,那么在备Jenkins上的新Jobs会被删除掉,这样备Jenkins上不能使用的。我的同步策略是,保持备Jenkins的/var/lib/jenkins目录和主Jenkins一致,那么比如/var/lib/jenkins/jobs的内容也一致
方案是:
1、通过keepalived实现jenkins主备,一个虚拟IP后面两个物理IP。
2、通过inotify+rsync实现master的jobs目录、workspace(可以不同步)同步到slave上的jobs、workspace,这样切换到slave的jenkins,才能保证任务是是相同的。
后来把整个Jenkins目录都备份了,查看yum安装的jenkins安装目录为/var/lib/jenkins,把这个目录都备份后,从主jenkins切换到备jenkins后,用户感知到的前端是完全相同的,其中包括每个Jobs的配置,slave节点配置,Jenkins的全局配置等等,其实就是同一个Jenkins,这样保持了主备的一致性。对主jenkins的一些更改,自然同步到备jenkins上。
这些视图信息保存在/var/lib/jenkins/config.xml里
节点信息保存在/var/lib/jenkins/nodes里
jobs任务保存在/var/lib/jenkins/jobs里
3、备机需要重启,以使从master同步过来的jobs内容在slave上的jenkins生效。
4、一旦切换到slave,应该立即停止master向slave的同步操作,即应该立即停止rsync同步进程,不然slave上新产生的内容会被删除掉
其实可以优化同步策略,只把主Jenkins的内容同步到备Jenkins上,而不删除备Jenkins上新增的内容
5、同时开启slave的rsync进程,开始反向同步:这里是双向同步
基本上有下面几个状态:
master的jenkins工作时,开启master的rsync进程,向slave同步
master的jenkins异常时,关闭master的rsync进程,关闭master的jenkins进程
slave的jenkins开始工作时,启动slave的jenkins,启动slave的rsync进程,开始向master同步
master异常恢复后,关闭slave的jenkins进程,关闭slave的rsync进程
注意这里异常判断条件是看虚拟IP指向那台物理IP,指向的认为是正常的
jenkins性能提升:http://discuss.greatops.net/t/jenkins/32