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

📅 发布时间:2026/8/20 20:58:36
JumpServer 生产环境高可用终极指南:一场半夜宕机教会我的四道防线
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 集群承载全部持久化与中间态这是节点可替换的前提共享存储存放录像、密钥、临时文件保证任意节点接管后上下文一致。三、资源规划与前置准备节点规格可按下表起步后续按业务量横向扩展应用节点即可节点角色数量建议规格职责接入层KeepalivedNginx22C4GVIP 漂移、流量分发、健康检查应用节点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_USERjumpserver -e POSTGRES_PASSWORD强密码 \ -e POSTGRES_DBjumpserver \ -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.1与REDIS_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/data2. 构建镜像并启动双节点镜像构建可直接复用官方脚本 utils/build_docker.shbash utils/build_docker.sh v3.10.0随后在两个节点分别启动容器环境变量一致共享同一套数据层docker run -d --name jumpserver \ -v /opt/jumpserver/data:/opt/jumpserver/data \ -e DB_HOST10.0.1.6 -e DB_PORT5432 \ -e REDIS_HOST10.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_fails3 fail_timeout10s; server 10.0.1.11:8080 max_fails3 fail_timeout10s; } 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/ # 应持续返回 2002. 监控与告警JumpServer 自身提供了组件健康检查与告警框架 apps/ops/notifications.py磁盘、内存、CPU、组件在线状态均可配阈值并自动邮件通知。生产环境至少盯住以下指标指标阈值参考说明组件在线状态必须 100%任何组件离线即告警磁盘使用率 80%录像落盘最易爆盘CPU Load 5高峰期逼近上限需扩容PostgreSQL 复制延迟 5s延迟过大说明从库落后3. 备份与恢复演练数据库备份可直接参考官方脚本 utils/backup_db.sh 的思路用 cron 每天全量 每小时 WAL 归档并每季度做一次真实恢复演练——备份没恢复过就等于没有备份。八、写在最后给生产环境的 4 条建议应用节点起步 2 个按 CPU Load 与在线会话数横向扩容架构天然支持无感加节点升级用滚动方式先摘一个节点、升级、验证、挂回再处理另一个避免全量重启窗口把灾备演练写进季度日程故障注入不只是验证更是锻炼团队肌肉记忆录像与配置的备份单独留存一份冷备共享存储也不是永不损坏的。从单机到四道防线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),仅供参考