XXL-Job 2.4.0 高可用集群部署:Docker Compose + Nginx 负载均衡 2 节点实战

📅 2026/7/6 22:25:21 👁️ 阅读次数 📝 编程学习
XXL-Job 2.4.0 高可用集群部署:Docker Compose + Nginx 负载均衡 2 节点实战

XXL-Job 2.4.0 高可用集群部署:Docker Compose + Nginx 负载均衡实战指南

在分布式系统架构中,任务调度平台的高可用性是企业级应用的核心需求。本文将深入探讨如何基于Docker Compose和Nginx构建XXL-Job 2.4.0的高可用集群,提供一套完整的生产级部署方案。

1. 架构设计与核心组件

XXL-Job作为一款轻量级分布式任务调度平台,其高可用集群部署需要解决三个关键问题:数据库一致性、时钟同步和访问令牌统一。我们的架构采用双节点调度中心+负载均衡的方案:

  • 调度中心集群:两个XXL-Job Admin节点构成无状态服务集群
  • 数据库层:共享MySQL实例确保任务状态一致性
  • 负载均衡:Nginx实现请求分发和故障转移
  • 执行器:可水平扩展的执行器集群(本文重点在调度中心部署)
graph TD A[客户端] --> B[Nginx 8989] B --> C[Admin节点1:8080] B --> D[Admin节点2:8080] C --> E[MySQL数据库] D --> E C --> F[执行器集群] D --> F

2. 环境准备与配置约束

2.1 基础环境要求

  • Docker 20.10.0+
  • Docker Compose 1.29.0+
  • MySQL 5.7+(建议8.0)
  • 至少4GB可用内存
  • 系统时钟同步(建议配置NTP服务)

2.2 关键约束条件

  1. 数据库约束

    • 所有Admin节点必须连接同一个MySQL实例
    • 如果使用MySQL主从,必须强制走主库写入
    • 建议配置连接池参数:autoReconnect=true&failOverReadOnly=false
  2. 时钟同步

    # 所有节点执行NTP同步 timedatectl set-ntp true systemctl restart systemd-timesyncd
  3. Token一致性

    • 集群所有节点必须配置相同的xxl.job.accessToken
    • 执行器配置的Token必须与调度中心匹配

3. 集群部署实战

3.1 目录结构规划

建议采用以下目录结构管理部署文件:

/app/xxljob-cluster/ ├── docker-compose.yml ├── nginx/ │ └── nginx.conf ├── logs1/ ├── logs2/ └── initdb/ └── tables_xxl_job.sql

3.2 数据库初始化

获取官方SQL脚本并初始化数据库:

wget https://github.com/xuxueli/xxl-job/raw/master/doc/db/tables_xxl_job.sql -O /app/xxljob-cluster/initdb/tables_xxl_job.sql docker exec -i mysql mysql -uroot -p$MYSQL_ROOT_PASSWORD xxl_job < /app/xxljob-cluster/initdb/tables_xxl_job.sql

3.3 Docker Compose配置

以下是完整的docker-compose.yml文件:

version: "3.8" services: xxl-job-admin1: image: xuxueli/xxl-job-admin:2.4.0 container_name: xxl-job-admin1 restart: unless-stopped volumes: - /app/xxljob-cluster/logs1:/data/applogs ports: - "8981:8080" environment: PARAMS: >- --spring.datasource.url=jdbc:mysql://mysql:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false --spring.datasource.username=xxljob --spring.datasource.password=xxljob123 --xxl.job.accessToken=cluster_token_2023 --xxl.job.i18n=zh_CN --xxl.job.triggerpool.fast.max=200 --xxl.job.triggerpool.slow.max=100 depends_on: - mysql networks: - xxl-job-net xxl-job-admin2: image: xuxueli/xxl-job-admin:2.4.0 container_name: xxl-job-admin2 restart: unless-stopped volumes: - /app/xxljob-cluster/logs2:/data/applogs ports: - "8982:8080" environment: PARAMS: >- --spring.datasource.url=jdbc:mysql://mysql:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false --spring.datasource.username=xxljob --spring.datasource.password=xxljob123 --xxl.job.accessToken=cluster_token_2023 --xxl.job.i18n=zh_CN depends_on: - mysql networks: - xxl-job-net nginx: image: nginx:1.23-alpine container_name: xxl-job-nginx ports: - "8989:8989" volumes: - /app/xxljob-cluster/nginx/nginx.conf:/etc/nginx/nginx.conf depends_on: - xxl-job-admin1 - xxl-job-admin2 networks: - xxl-job-net mysql: image: mysql:8.0 container_name: xxl-job-mysql environment: MYSQL_ROOT_PASSWORD: root123 MYSQL_DATABASE: xxl_job MYSQL_USER: xxljob MYSQL_PASSWORD: xxljob123 volumes: - /data/mysql:/var/lib/mysql command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci ports: - "3306:3306" networks: - xxl-job-net networks: xxl-job-net: driver: bridge

3.4 Nginx负载均衡配置

nginx.conf配置文件关键内容:

worker_processes auto; events { worker_connections 1024; } http { upstream xxl-job-cluster { server xxl-job-admin1:8080; server xxl-job-admin2:8080; # 健康检查配置 check interval=3000 rise=2 fall=3 timeout=1000 type=http; check_http_send "HEAD /xxl-job-admin/actuator/health HTTP/1.0\r\n\r\n"; check_http_expect_alive http_2xx http_3xx; } server { listen 8989; location / { proxy_pass http://xxl-job-cluster; 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_http_version 1.1; proxy_set_header Connection ""; # 故障转移配置 proxy_next_upstream error timeout http_500 http_502 http_503 http_504; proxy_next_upstream_tries 2; } # 状态监控页面 location /nginx_status { stub_status; access_log off; allow 127.0.0.1; deny all; } } }

4. 集群启动与验证

4.1 启动集群服务

cd /app/xxljob-cluster docker-compose up -d

4.2 访问验证

访问方式URL用途
节点1http://<服务器IP>:8981/xxl-job-admin直接访问节点1
节点2http://<服务器IP>:8982/xxl-job-admin直接访问节点2
负载均衡http://<服务器IP>:8989/xxl-job-admin生产环境访问入口

默认登录凭证:admin/123456

4.3 集群健康检查

# 检查容器状态 docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" # 查看Nginx upstream状态 docker exec xxl-job-nginx curl http://127.0.0.1:8989/nginx_status # 数据库连接验证 docker exec -it xxl-job-mysql mysql -uxxljob -pxxljob123 -e "SHOW STATUS LIKE 'Threads_connected';"

5. 执行器配置指南

执行器需要配置调度中心地址为Nginx入口:

# 执行器配置示例(application.properties) xxl.job.admin.addresses=http://<nginx_host>:8989/xxl-job-admin xxl.job.accessToken=cluster_token_2023 xxl.job.executor.appname=xxl-job-executor-sample xxl.job.executor.port=9999

对于Spring Boot执行器,配置类示例如下:

@Configuration public class XxlJobConfig { @Value("${xxl.job.admin.addresses}") private String adminAddresses; @Bean public XxlJobSpringExecutor xxlJobExecutor() { XxlJobSpringExecutor executor = new XxlJobSpringExecutor(); executor.setAdminAddresses(adminAddresses); executor.setAppname("your-app-name"); executor.setPort(9999); return executor; } }

6. 生产环境优化建议

  1. 数据库优化

    • 建议配置MySQL连接池监控
    • 定期清理xxl_job_log表(默认保留30天)
    • trigger_timehandle_time字段建立索引
  2. 性能调优

    # 调整线程池大小(根据CPU核心数调整) xxl.job.triggerpool.fast.max=CPU核心数*2 xxl.job.triggerpool.slow.max=CPU核心数
  3. 安全加固

    • 修改默认管理员密码
    • 配置HTTPS访问
    • 限制Nginx访问IP(生产环境)
  4. 监控方案

    • Prometheus + Grafana监控调度次数
    • ELK收集调度日志
    • 配置邮件/短信告警

7. 故障排查与常见问题

问题1:节点间状态不一致

解决方案

  1. 检查数据库连接是否都指向主库
  2. 验证各节点accessToken配置是否一致
  3. 检查系统时钟是否同步(差异应<1s)

问题2:Nginx负载不均衡

排查命令

# 查看请求分发情况 docker exec xxl-job-nginx tail -f /var/log/nginx/access.log # 检查upstream配置 docker exec xxl-job-nginx nginx -T | grep upstream

问题3:任务重复执行

可能原因

  • 网络延迟导致心跳检测失败
  • 调度中心节点时钟不同步
  • 阻塞策略配置为"覆盖之前调度"

解决方案

-- 检查任务锁状态 SELECT * FROM xxl_job_lock;

通过这套高可用部署方案,XXL-Job调度中心可以实现99.9%的可用性,满足企业级生产环境的需求。实际使用中建议结合业务特点调整线程池和数据库连接参数,并建立完善的监控告警体系。