1. XXL-Job高可用集群核心架构解析
第一次接触XXL-Job集群部署时,我被它的设计哲学惊艳到了——原来分布式调度可以如此优雅。这个轻量级调度平台的核心架构分为调度中心和执行器两大模块,就像交响乐团的指挥和乐手,各司其职又紧密配合。
调度中心集群采用无状态设计,所有节点共享同一个MySQL数据库。这里有个关键细节:调度中心通过竞争数据库锁(xxl_job_lock表的行锁)来保证集群中只有一个节点触发任务调度。我曾在测试环境故意关闭主调度节点,备用节点在3秒内就接管了调度工作,整个过程业务完全无感知。
执行器集群的设计更巧妙。当你在管理界面看到"故障转移"选项时,背后是执行器自动注册和心跳检测机制在支撑。有个真实案例:某电商公司大促期间,某个执行器节点CPU飙升至90%,调度中心立即将任务路由到其他节点,这就是路由策略中的"忙碌转移"在发挥作用。
2. 生产环境部署方案选型
面对Docker Compose和Kubernetes两种部署方式,我建议根据团队技术栈来选择。去年帮一家中型企业部署时,他们已有K8s基础,我们选择了下面这个经过验证的部署方案:
2.1 数据库高可用配置
# mysql主从配置示例(建议至少1主2从) spring.datasource.url=jdbc:mysql:replication://master:3306,slave1:3306,slave2:3306/xxl_job?useSSL=false这里有个血泪教训:一定要配置autoReconnect=true参数。有次机房网络抖动导致连接中断,没有这个参数的任务全部卡死。同时建议设置:
- 连接池大小:50-100(根据任务量调整)
- 连接超时:30秒
- 事务隔离级别:READ_COMMITTED
2.2 调度中心集群部署
Docker Compose方案:
version: '3' services: xxl-job-admin1: image: xuxueli/xxl-job-admin:2.4.0 environment: - PARAMS=--spring.datasource.url=jdbc:mysql://mysql-vip:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false - JAVA_OPTS=-Xmx2g -Xms2g -XX:+HeapDumpOnOutOfMemoryError ports: - "8080:8080" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/xxl-job-admin/actuator/health"] interval: 30s timeout: 10s retries: 3Kubernetes方案更推荐使用StatefulSet:
apiVersion: apps/v1 kind: StatefulSet metadata: name: xxl-job-admin spec: serviceName: xxl-job-admin replicas: 3 template: spec: containers: - name: admin image: xuxueli/xxl-job-admin:2.4.0 env: - name: PARAMS value: "--spring.datasource.url=jdbc:mysql://mysql-cluster:3306/xxl_job?useSSL=false" readinessProbe: httpGet: path: /xxl-job-admin/actuator/health port: 8080 initialDelaySeconds: 30 periodSeconds: 103. 关键配置与优化实战
3.1 Nginx负载均衡配置
这个配置经过双十一流量考验,特别加了健康检查:
upstream xxl-job-cluster { zone backend 64k; server 10.0.0.1:8080 max_fails=3 fail_timeout=30s; server 10.0.0.2:8080 max_fails=3 fail_timeout=30s; keepalive 32; } server { listen 80; location / { proxy_pass http://xxl-job-cluster; proxy_next_upstream error timeout http_500 http_503; proxy_connect_timeout 2s; proxy_http_version 1.1; proxy_set_header Connection ""; } }3.2 时钟同步方案
曾遇到个诡异问题:任务总是提前1小时执行。原因是Docker容器时区没配置。推荐方案:
FROM xuxueli/xxl-job-admin:2.4.0 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime在K8s中更简单:
env: - name: TZ value: Asia/Shanghai4. 执行器集群接入指南
执行器配置中最容易出错的是网络连通性。建议先在执行器机器上测试:
curl -X POST http://xxl-job-vip:80/xxl-job-admin/api/registrySpring Boot执行器推荐配置:
# 生产环境建议配置VIP地址 xxl.job.admin.addresses=http://xxl-job-vip/xxl-job-admin xxl.job.executor.appname=inventory-service xxl.job.executor.port=9999 xxl.job.executor.logpath=/data/logs/xxl-job xxl.job.accessToken=你的令牌5. 监控与故障排查
这几个指标必须监控:
- 调度中心线程池使用率
- 任务执行平均耗时
- 失败任务比例
- 数据库连接池活跃数
推荐Grafana监控看板配置:
SELECT avg(trigger_time) as avg_cost, max(trigger_time) as max_cost FROM xxl_job_log WHERE trigger_time > 0 GROUP BY job_id遇到任务堆积时,先检查:
- 调度中心日志:
grep "JobThreadPoolHelper" logs/xxl-job-admin.log - 执行器线程状态:
jstack <pid> | grep -A 10 "XxlJobExecutor"