温馨提示×

Java在CentOS上如何实现高可用性

小樊
34
2025-12-17 10:41:04
栏目: 编程语言

在 CentOS 上构建 Java 应用的高可用

一、总体架构与组件

  • 前端入口高可用:使用 Nginx 作为反向代理与负载均衡,前端再叠加 Keepalived 提供 VIP(虚拟 IP),实现 Nginx 层的故障自动切换,消除单点。
  • 应用层高可用:部署多实例 Tomcat(或 Spring Boot 内嵌容器)形成集群,Nginx 进行轮询/最少连接等策略分发请求。
  • 数据与中间件高可用:后端使用 MySQL 主从复制Redis/Memcached 分布式缓存、Kafka/RabbitMQ 消息队列,降低数据库压力并提升解耦与容错能力。
  • 可观测性:部署 Prometheus + Grafana 做指标监控与告警,使用 ELK(Elasticsearch/Logstash/Kibana) 做集中日志管理。
  • 典型拓扑:2 台 Nginx+Keepalived(主/备) + 2 台 Tomcat(或多台),对外暴露 VIP:80/443,后端 Tomcat 多实例 8080。该组合在 CentOS 7/8 上实践成熟、运维简单。

二、快速落地步骤

  • 环境准备
    • 在所有节点安装相同版本的 JDK 8/11/17(建议 OpenJDK 或企业版保持一致),配置 JAVA_HOME/PATH;安装常用工具(如 wget、vim、curl)。
  • 部署 Tomcat 集群
    • 安装 Tomcat 8/9,建议一个节点运行多个实例(修改 server.xml 中的 8005/8080/8009 等端口)以便单机多实例与资源隔离;提供启停脚本或 systemd unit,便于标准化运维。
  • 部署 Nginx 负载均衡
    • 安装 Nginx,在 /etc/nginx/conf.d/ 下配置 upstream 指向多个 Tomcat 实例,常用策略为轮询或最少连接;按需开启 sticky(会话保持)或改为无状态会话(如 JWT/Redis Session)。
  • 部署 Keepalived 实现 VIP 漂移
    • 两台 Nginx 节点安装 Keepalived,配置 VRRP 实例:设置 state MASTER/BACKUPpriorityvirtual_router_idadvert_int,并绑定 VIP;通过 track_script 执行健康检查脚本探测 Tomcat/应用健康接口,失败则降低优先级触发切换。
  • 数据与中间件
    • 数据库采用 主从复制 或更高可用形态;缓存使用 Redis 集群/主从;消息队列使用 镜像队列/集群 模式,避免单点。
  • 监控与日志
    • 部署 Prometheus 抓取 Nginx/Tomcat/JVM 指标,Grafana 做可视化与阈值告警;ELK 收集并分析应用与访问日志。

三、关键配置示例

  • Nginx 负载均衡(/etc/nginx/conf.d/tomcat.conf)
    upstream tomcat {
        server 192.168.77.152:8080 max_fails=2 fail_timeout=10s;
        server 192.168.77.153:8080 max_fails=2 fail_timeout=10s;
        # least_conn;  # 可选:最少连接
    }
    
    server {
        listen 80;
        server_name your.domain;
        location / {
            proxy_pass http://tomcat;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    
  • Keepalived 主节点示例(/etc/keepalived/keepalived.conf)
    global_defs { router_id LVS_DEVEL }
    vrrp_instance VI_1 {
        state MASTER
        interface eth0
        virtual_router_id 51
        priority 101
        advert_int 1
        authentication { auth_type PASS auth_pass YourPass }
        virtual_ipaddress { 192.168.77.188/24 }
        track_script {
            chk_tomcat
        }
    }
    vrrp_script chk_tomcat {
        script "/usr/local/bin/check_tomcat.sh"
        interval 2
        weight -20
        fall 2
        rise 2
    }
    
  • Tomcat 健康检查脚本(/usr/local/bin/check_tomcat.sh)
    #!/usr/bin/env bash
    curl -f http://localhost:8080/health || exit 1
    
    说明:健康检查脚本应返回 0(健康)或 非 0(异常);Keepalived 根据脚本退出码与权重自动切换 VIP。上述 Nginx 配置与 Keepalived+脚本的做法已在多实例 Tomcat 场景中验证可行。

四、验证与运维要点

  • 故障演练:停止主 Nginx 或关闭某台 Tomcat,验证 VIP 是否漂移到备机、业务是否无感切换;演练后检查连接耗尽、长事务与重试策略。
  • 会话与一致性:有状态应用建议开启 sticky 或改为 无状态会话(如 Redis 集中会话);数据库写入需考虑幂等与重试安全。
  • 优雅停机:发布时先摘除节点(Nginx 下线或 health 返回 503)、等待 连接排空 再停止实例,避免 5xx 激增。
  • 监控告警:为 HTTP 5xx、JVM Full GC、线程池满、连接池耗尽、VIP 漂移 设置阈值告警;结合 Prometheus/GrafanaELK 快速定位。
  • 伸缩与容量:横向扩展 Tomcat 实例并调整 Nginx 权重;数据库与缓存需同步扩容或引入分片/集群模式。

五、常见陷阱与优化建议

  • 单点预防:入口必须双机(Nginx+Keepalived),数据库/缓存/MQ 也要消除单点;VIP 与网关策略需与网络团队确认 二层/三层 可达性。
  • 健康检查深度:脚本不应只探测端口存活,建议调用 /health 或业务就绪接口,并结合 连接耗时/返回码 做综合判定。
  • 连接与超时:合理配置 proxy_connect_timeout、proxy_read_timeout、max_fails/fail_timeout,避免抖动放大;Tomcat 线程池与 JVM GC 参数需压测后固化。
  • 日志与追踪:统一 MDC/RequestId,在 ELK 中建立关键路径仪表盘(P99、错误率、慢查询)。
  • 版本与一致性:集群节点 JDK/中间件版本 保持一致,减少因版本差异导致的兼容性问题。

0