Docker Swarm中Percona XtraDB Cluster重启后节点连接超时求助
解决Docker Swarm中Percona XtraDB Cluster重启后无法形成集群的问题
1. 验证ETCD元数据持久化与配置正确性
集成ETCD的核心是让Galera通过ETCD保存集群节点信息,重启后ETCD必须能提供这些数据:
- 检查ETCD服务是否配置了持久化卷,否则重启后节点元数据丢失,Galera无法发现同伴。添加卷配置:
services: etcd: image: quay.io/coreos/etcd:v3.5.5 volumes: - etcd-data:/var/lib/etcd # 其他配置... volumes: etcd-data: - 确认Percona服务的
WSREP_CLUSTER_ADDRESS环境变量正确指向ETCD端点,格式应为:
确保ETCD服务名和端口在Swarm网络中可访问。WSREP_CLUSTER_ADDRESS=gcomm://?etcd_endpoints=http://etcd:2379&etcd_key=/pxc/cluster
2. 修复集群引导逻辑
Swarm重启时所有节点可能同时启动,导致无节点主动引导集群:
- 给ETCD添加健康检查,让Percona节点等待ETCD就绪后再启动:
etcd: healthcheck: test: ["CMD", "etcdctl", "endpoint", "health"] interval: 5s timeout: 3s retries: 3 pxc: depends_on: etcd: condition: service_healthy - 配置单节点引导机制:避免多个节点同时尝试初始化集群。可以在
docker-compose.yml中为其中一个节点设置BOOTSTRAP_XTRADB_CLUSTER=1,其他节点不设置。或者在重启后手动进入一个Percona容器执行:
启动后其他节点会自动通过ETCD发现并加入集群。mysqld_safe --wsrep-new-cluster
3. 确保Swarm网络与端口连通性
Overlay网络异常或端口受限会导致Galera节点无法通信:
- 检查Swarm Overlay网络状态,执行
docker network inspect <your-overlay-network>,确认所有Percona节点都已加入网络,IP地址正常。 - 确保Percona服务开放Galera必需端口:3306(MySQL)、4567/TCP/UDP(集群通信)、4568(IST/SST)、4444(SST备份),配置如下:
pxc: ports: - "3306:3306" - "4567:4567" - "4567:4567/udp" - "4568:4568" - "4444:4444" - 禁用容器内防火墙(如iptables),或允许上述端口的入站/出站规则。
4. 持久化Percona节点数据
未持久化的节点数据会导致重启后节点状态丢失,无法加入集群:
- 为每个Percona节点挂载本地卷或共享存储(如NFS),确保
/var/lib/mysql目录数据保留:
用节点约束确保每个实例调度到对应节点,避免数据错乱。pxc: volumes: - pxc-data-node1:/var/lib/mysql deploy: placement: constraints: - node.hostname == node1 volumes: pxc-data-node1:
5. 诊断与验证
- 查看Percona容器日志:
docker logs <pxc-container-id>,定位具体错误(如ETCD连接失败、IP冲突等)。 - 进入容器执行MySQL命令,检查集群状态:
确认SHOW STATUS LIKE 'wsrep%';wsrep_cluster_size等于节点数,wsrep_connected和wsrep_ready为ON。
内容的提问来源于stack exchange,提问作者Mimiko
相关产品推荐
相关产品推荐

