Windows本地Docker Compose部署MariaDB 10.2.14 Galera集群第二节点启动失败
看你遇到的报错failed to reach primary view: 110 (Connection timed out),这通常是节点间网络不通或者集群配置有误导致的,结合Windows本地Docker Compose的场景,给你几个排查和解决的方向:
1. 检查Docker网络配置,确保节点间端口互通
Galera集群需要以下端口才能正常通信:
- 3306:MySQL客户端连接端口
- 4567:Galera集群节点间的通信端口(UDP/TCP)
- 4568:IST(增量状态传输)端口
- 4444:SST(全量状态传输)端口
在Windows的Docker环境中,默认bridge网络理论上能让Compose服务间互通,但如果遇到问题,建议显式定义自定义网络,避免默认网络的潜在限制:
version: '3' networks: galera-net: driver: bridge services: node1: image: mariadb:10.2.14 networks: - galera-net # 其他配置... node2: image: mariadb:10.2.14 networks: - galera-net # 其他配置...
你还可以在容器内互相ping对方的服务名,验证网络连通性:
# 进入第一个节点容器,ping第二个节点服务名 docker exec -it node1 ping node2 # 进入第二个节点容器,ping第一个节点服务名 docker exec -it node2 ping node1
如果ping不通,说明网络存在隔离问题,需要检查Docker的网络设置(比如WSL2/Hyper-V的网络权限)。
2. 确认第二个节点的集群地址配置正确
第二个节点的wsrep_cluster_address必须指向已成功引导的第一个节点,不要用localhost或宿主机IP(容器内的localhost是自身,Windows Docker的宿主机IP在WSL2/Hyper-V环境下无法直接被容器访问),直接用Compose服务名即可:
# node2的my.cnf配置片段 wsrep_cluster_address="gcomm://node1"
同时要注意:第一个节点启动时必须用wsrep_cluster_address="gcomm://"来初始化集群,第二个节点绝对不能用这个配置,必须指向已有节点。
3. 验证第一个节点是否真正完成集群初始化
第一个节点启动后,要确认它已经成为集群主节点,进入容器执行以下命令检查状态:
docker exec -it node1 mysql -u root -p -e "SHOW STATUS LIKE 'wsrep%';"
重点看这几个状态值:
wsrep_ready:必须为ONwsrep_cluster_size:应该是1wsrep_cluster_status:应该是Primary
如果这些值不符合,说明第一个节点的集群初始化未完成,需要重启第一个节点,并在启动命令中加入引导参数:
# node1的Compose配置片段 command: --wsrep-new-cluster
注意:这个参数仅在集群第一次初始化时使用,后续重启节点不需要添加。
4. 调整SST(全量状态传输)配置
MariaDB 10.2默认用mysqldump作为SST传输方法,这种方法容易因网络或权限问题失败,建议改成rsync试试:
# 所有节点的my.cnf配置片段 wsrep_sst_method=rsync
另外要确保所有节点的root密码一致,因为SST传输需要用root用户进行数据同步。
5. 查看完整容器日志定位细节
你提供的日志是截断的,建议查看第二个节点的完整日志,获取更详细的错误提示:
docker logs node2
比如是否有DNS解析失败、SST连接被拒绝等具体信息,能帮你更快定位问题。
内容的提问来源于stack exchange,提问作者Amos Yuen

