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 -- F2. 环境准备与配置约束2.1 基础环境要求Docker 20.10.0Docker Compose 1.29.0MySQL 5.7建议8.0至少4GB可用内存系统时钟同步建议配置NTP服务2.2 关键约束条件数据库约束所有Admin节点必须连接同一个MySQL实例如果使用MySQL主从必须强制走主库写入建议配置连接池参数autoReconnecttruefailOverReadOnlyfalse时钟同步# 所有节点执行NTP同步 timedatectl set-ntp true systemctl restart systemd-timesyncdToken一致性集群所有节点必须配置相同的xxl.job.accessToken执行器配置的Token必须与调度中心匹配3. 集群部署实战3.1 目录结构规划建议采用以下目录结构管理部署文件/app/xxljob-cluster/ ├── docker-compose.yml ├── nginx/ │ └── nginx.conf ├── logs1/ ├── logs2/ └── initdb/ └── tables_xxl_job.sql3.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.sql3.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.urljdbc:mysql://mysql:3306/xxl_job?useUnicodetruecharacterEncodingUTF-8autoReconnecttruefailOverReadOnlyfalse --spring.datasource.usernamexxljob --spring.datasource.passwordxxljob123 --xxl.job.accessTokencluster_token_2023 --xxl.job.i18nzh_CN --xxl.job.triggerpool.fast.max200 --xxl.job.triggerpool.slow.max100 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.urljdbc:mysql://mysql:3306/xxl_job?useUnicodetruecharacterEncodingUTF-8autoReconnecttruefailOverReadOnlyfalse --spring.datasource.usernamexxljob --spring.datasource.passwordxxljob123 --xxl.job.accessTokencluster_token_2023 --xxl.job.i18nzh_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-pluginmysql_native_password --character-set-serverutf8mb4 --collation-serverutf8mb4_unicode_ci ports: - 3306:3306 networks: - xxl-job-net networks: xxl-job-net: driver: bridge3.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 interval3000 rise2 fall3 timeout1000 typehttp; 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 -d4.2 访问验证访问方式URL用途节点1http://服务器IP:8981/xxl-job-admin直接访问节点1节点2http://服务器IP:8982/xxl-job-admin直接访问节点2负载均衡http://服务器IP:8989/xxl-job-admin生产环境访问入口默认登录凭证admin/1234564.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.addresseshttp://nginx_host:8989/xxl-job-admin xxl.job.accessTokencluster_token_2023 xxl.job.executor.appnamexxl-job-executor-sample xxl.job.executor.port9999对于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. 生产环境优化建议数据库优化建议配置MySQL连接池监控定期清理xxl_job_log表默认保留30天对trigger_time和handle_time字段建立索引性能调优# 调整线程池大小根据CPU核心数调整 xxl.job.triggerpool.fast.maxCPU核心数*2 xxl.job.triggerpool.slow.maxCPU核心数安全加固修改默认管理员密码配置HTTPS访问限制Nginx访问IP生产环境监控方案Prometheus Grafana监控调度次数ELK收集调度日志配置邮件/短信告警7. 故障排查与常见问题问题1节点间状态不一致解决方案检查数据库连接是否都指向主库验证各节点accessToken配置是否一致检查系统时钟是否同步差异应1s问题2Nginx负载不均衡排查命令# 查看请求分发情况 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%的可用性满足企业级生产环境的需求。实际使用中建议结合业务特点调整线程池和数据库连接参数并建立完善的监控告警体系。