jenkins开源版不原生支持多主模式,所谓“多主高可用”实为共享存储+负载均衡+故障感知协同实现:所有实例挂载同一/var/jenkins_home,由nginx/haproxy分发请求,依赖强一致nfs、灵敏健康检查(如inter 2s fall 2)及同构无状态启动,确保秒级切换与数据零丢失。

1. 共享存储必须满足强一致性与低延迟
所有 Jenkins 主实例必须读写同一份 /var/jenkins_home,且不能出现缓存不一致或写入延迟。NFS 是最常用方案,但需严格调优:
- 服务端使用
nfs-kernel-server(Debian/Ubuntu)或nfs-utils(CentOS/RHEL),导出选项必须含sync,hard,intr,noac,禁用客户端缓存(noac); - 客户端挂载参数推荐:
rw,hard,intr,timeo=10,retrans=3,vers=4.2,sec=sys,避免因 NFS 暂时不可达导致 Jenkins 进程卡死; - 共享目录权限设为
jenkins:jenkins(UID/GID 须在所有节点统一),禁止 root_squash,确保 Jenkins 进程可写; - 不建议用 CIFS/Samba 或对象存储(如 S3)替代,它们无法满足 Jenkins 插件、Job 配置、构建日志等对 POSIX 文件锁和原子重命名的强依赖。
2. 多 Jenkins 实例部署需完全同构且无本地状态
每个“主”节点不是独立 Master,而是共享 home 的镜像实例:
- 全部节点安装相同版本 Jenkins(建议 LTS)、相同 Java 版本(OpenJDK 11+)、相同插件集(插件配置也存在
plugins/目录下,随共享存储同步); - 禁用所有依赖本地磁盘的插件(如某些日志归档插件若配置了绝对路径到
/tmp就会出问题); - 启动命令统一为:
java -Djenkins.home=/var/jenkins_home -jar /usr/share/jenkins/jenkins.war --httpPort=8080,不指定--prefix或其他影响 URL 路径的参数; - 各节点系统时间必须严格同步(
systemd-timesyncd或chrony),误差控制在 50ms 内,否则会影响构建时间戳和流水线锁判断。
3. 负载均衡器配置决定“秒级切换”的真实性
HAProxy 或 Nginx 是主流选择,重点在健康检查策略和会话处理:
- 使用 TCP 层健康检查(
option tcp-check)而非 HTTP,避免因 Jenkins 启动中返回 503 导致误判;检查频率设为check inter 2s fall 2 rise 3(2 秒探测、连续 2 次失败即摘除、3 次成功恢复),实现约 4–6 秒内完成故障识别与剔除; - 禁用会话保持(sticky session):Jenkins Web 界面本身无服务端 Session 状态(登录态基于 Cookie+Token),开启 sticky 反而阻碍故障转移;
- 配置
http-request set-header X-Forwarded-Proto https和X-Real-IP,确保 Jenkins 正确识别反向代理后的协议与客户端 IP; - 若使用 HAProxy,建议启用
http-check expect status 200并配合 Jenkins 的/login路径做轻量 HTTP 探活(需确保未登录时返回 200)。
4. 容灾切换验证与关键注意事项
真正的“秒级”不是理论值,必须实测验证:
- 手动 kill 一个 Jenkins 进程后,观察 HAProxy 日志是否在
- 触发一次构建任务,在运行中杀掉当前执行节点的 Jenkins 进程,检查任务是否自动重试(需开启 “Retry build after failure” 类插件或 Pipeline 中加
retry块),或至少不卡死、不报文件锁异常; - 注意 Jenkins 插件兼容性:部分插件(如
cloudbees-folder、pipeline-stage-view)在多实例共享 home 下表现正常;但build-monitor-plugin等 UI 类插件可能因缓存冲突显示异常,建议关闭; - 备份仍不可少:共享存储只是高可用基础,不是备份。每日需对
/var/jenkins_home执行快照或 rsync 到异地,防止误删或勒索软件破坏。











