JumpServer 生产环境高可用终极指南:一场半夜宕机教会我的四道防线
2026/8/20 20:58:10 网站建设 项目流程

JumpServer 生产环境高可用终极指南:一场半夜宕机教会我的四道防线

【免费下载链接】jumpserverJumpServer is an open-source Privileged Access Management (PAM) platform that provides DevOps and IT teams with on-demand and secure access to SSH, RDP, Kubernetes, Database and RemoteApp endpoints through a web browser.项目地址: https://gitcode.com/GitHub_Trending/ju/jumpserver

凌晨 2 点 17 分,报警电话把你从睡梦中拽起。JumpServer 登录页白屏,线上 300 多名工程师的 SSH 会话全部断开,运维群瞬间炸锅——堡垒机单点故障,让整个研发体系一夜瘫痪。

这样的场景是否似曾相识?单机部署的 JumpServer 像走钢丝:一个进程挂了,运维入口就没了。本文不灌鸡汤,只交付一套可落地的方案:一套"数据层 + 接入层 + 服务层 + 观测层"四道防线架构,支撑 JumpServer 故障切换时间压到 30 秒内,可用性目标 99.9%,并给出每个环节可复制的命令与踩坑点。

一、先复盘故障,再设计架构

那场事故的根因清单,值得你逐条对照:

  • 应用单点:唯一 Web 进程崩溃,全站失联
  • 状态不共享:会话和缓存落在本机,节点重启即丢
  • 无健康探针:故障发现靠用户反馈,恢复靠人工重启
  • 无灾备路径:数据库没做主从,备份文件陈旧 3 天

从这次故障倒推,能扛住它的集群必须满足四个条件:数据可复制、请求可转移、节点可替换、故障可感知。下文逐条补齐。

二、架构总览:四道防线各司其职

目标架构如下,把原本耦合的单体拆成四层,任何一层都不再是单点:

  • 接入层负责流量分发与 VIP 漂移,是用户唯一入口,自身必须双活;
  • 服务层跑 2+ 个对等 JumpServer 节点,通过注册机制自动发现彼此,互为主备;
  • 数据层用 PostgreSQL 主从 + Redis 集群承载全部持久化与中间态,这是"节点可替换"的前提;
  • 共享存储存放录像、密钥、临时文件,保证任意节点接管后上下文一致。

三、资源规划与前置准备

节点规格可按下表起步,后续按业务量横向扩展应用节点即可:

节点角色数量建议规格职责
接入层(Keepalived+Nginx)22C4GVIP 漂移、流量分发、健康检查
应用节点24C8GJumpServer Core/Celery/Koko 等组件
PostgreSQL 主从24C16G业务数据主从复制
Redis 集群32C4G会话、缓存、Celery Broker
共享存储1100G+录像与配置文件持久化

所有节点先统一环境:

# 安装 Docker 与 Compose 插件(各节点执行) yum install -y yum-utils && yum-config-manager --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin systemctl enable --now docker

⚠️ 应用节点务必保持内核与 Docker 版本一致,避免跨节点行为差异导致排查困难。

四、第一道防线:让数据可复制

1. 启动 PostgreSQL 主从

主库初始化:

docker run -d --name pg-master \ -e POSTGRES_USER=jumpserver -e POSTGRES_PASSWORD='<强密码>' \ -e POSTGRES_DB=jumpserver \ -v /data/postgres/master:/var/lib/postgresql/data \ -p 5432:5432 postgres:13

从库用pg_basebackup全量同步后,配置primary_conninfo指向主库地址,并设置hot_standby = on。完成后验证复制状态:

SELECT client_addr, state, sync_state FROM pg_stat_replication;

2. 搭建 Redis 3 节点集群

JumpServer 依赖 Redis 承载用户会话、缓存与 Celery 调度,单点 Redis 会拖垮整个集群:

# 创建 6 个 Redis 实例(3主3从),7000-7002 为主,7003-7005 为从 for port in 7000 7001 7002 7003 7004 7005; do docker run -d --name redis-$port \ -p $port:$port \ redis:6 redis-server --port $port \ --cluster-enabled yes --cluster-config-file nodes-$port.conf done # 组建集群 docker exec redis-7000 redis-cli --cluster create \ 10.0.1.10:7000 10.0.1.10:7001 10.0.1.10:7002 \ 10.0.1.10:7003 10.0.1.10:7004 10.0.1.10:7005 \ --cluster-replicas 1

配置 JumpServer 时在 config_example.yml 中声明数据库与 Redis 地址,替换默认的DB_HOST: 127.0.0.1REDIS_HOST: 127.0.0.1。参考配置见官方示例 config_example.yml。

五、第二道防线:服务节点可替换

1. 共享存储先行

录像与密钥文件必须落共享盘,否则会话迁移后无法回放:

# 存储端导出 echo "/data/share 10.0.1.0/24(rw,sync,no_root_squash)" > /etc/exports systemctl enable --now nfs-server # 每个应用节点挂载 mkdir -p /opt/jumpserver/data && mount -t nfs 10.0.1.5:/data/share /opt/jumpserver/data

2. 构建镜像并启动双节点

镜像构建可直接复用官方脚本 utils/build_docker.sh:

bash utils/build_docker.sh v3.10.0

随后在两个节点分别启动容器(环境变量一致,共享同一套数据层):

docker run -d --name jumpserver \ -v /opt/jumpserver/data:/opt/jumpserver/data \ -e DB_HOST=10.0.1.6 -e DB_PORT=5432 \ -e REDIS_HOST=10.0.1.7:7000,10.0.1.7:7001,10.0.1.7:7002 \ -p 8080:8080 jumpserver/jumpserver:v3.10.0

启动后两个节点会通过心跳注册到同一张组件表,日志里出现Terminal registration即代表彼此可见。此时停掉任意节点,登录页依然可用——第二道防线成立。

六、第三道防线:请求可转移

Nginx 侧用被动健康检查剔除故障节点,Keepalived 保证接入层自身不挂:

upstream jms_backend { server 10.0.1.10:8080 max_fails=3 fail_timeout=10s; server 10.0.1.11:8080 max_fails=3 fail_timeout=10s; } server { listen 80; location / { proxy_pass http://jms_backend; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # JumpServer 内置健康检查接口,200 即存活 location /health/ { proxy_pass http://jms_backend/health/; } }

再结合官方心跳脚本 utils/check_celery.sh 定期探测异步任务是否卡死,把判定标准从"进程在"升级为"任务在推进":

# 20 秒内无新心跳即判定异常,返回非 0 test $(($(date +%s) - $(stat -c %Y /tmp/worker_heartbeat_celery))) -lt 20

七、第四道防线:故障可感知、数据可恢复

1. 故障注入验证

直接杀掉应用节点容器,观察流量是否在 10 秒内切到另一节点:

docker stop jumpserver # 模拟节点宕机 curl -I http://<VIP>/health/ # 应持续返回 200

2. 监控与告警

JumpServer 自身提供了组件健康检查与告警框架 apps/ops/notifications.py,磁盘、内存、CPU、组件在线状态均可配阈值并自动邮件通知。生产环境至少盯住以下指标:

指标阈值参考说明
组件在线状态必须 100%任何组件离线即告警
磁盘使用率< 80%录像落盘最易爆盘
CPU Load< 5高峰期逼近上限需扩容
PostgreSQL 复制延迟< 5s延迟过大说明从库落后

3. 备份与恢复演练

数据库备份可直接参考官方脚本 utils/backup_db.sh 的思路,用 cron 每天全量 + 每小时 WAL 归档,并每季度做一次真实恢复演练——备份没恢复过就等于没有备份。

八、写在最后:给生产环境的 4 条建议

  1. 应用节点起步 2 个,按 CPU Load 与在线会话数横向扩容,架构天然支持无感加节点;
  2. 升级用滚动方式:先摘一个节点、升级、验证、挂回,再处理另一个,避免全量重启窗口;
  3. 把灾备演练写进季度日程,故障注入不只是验证,更是锻炼团队肌肉记忆;
  4. 录像与配置的备份单独留存一份冷备,共享存储也不是永不损坏的。

从单机到四道防线,JumpServer 集群不再是一张 PPT,而是你在下次深夜报警前就能亲手交付的工程。现在,打开你的第一个节点,把心跳接上。

【免费下载链接】jumpserverJumpServer is an open-source Privileged Access Management (PAM) platform that provides DevOps and IT teams with on-demand and secure access to SSH, RDP, Kubernetes, Database and RemoteApp endpoints through a web browser.项目地址: https://gitcode.com/GitHub_Trending/ju/jumpserver

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询