loose-group_replication_local_address必须配置为本机真实、可路由且其他节点能直连的ip和端口,不可用127.0.0.1或localhost;需确保端口未被占用、防火墙放行、selinux允许绑定,并与group_seeds及dns解析结果一致。

loose-group_replication_local_address 配置必须精确匹配本机可路由地址
很多节点卡在 UNREACHABLE 或启动时直接报 ERROR 3092 (HY000): the server is not configured properly to be an active member of the group,根本原因常是 loose-group_replication_local_address 写错了。它不是数据库监听地址(bind-address),而是 MGR 内部通信专用端口,且必须满足:
- 地址能被其他节点用 ping 和 telnet 连通(比如不能写 127.0.0.1 或 localhost)
- 端口未被占用,且不在防火墙黑名单里(默认常用 33081,但你得自己确认)
- 若机器有多个网卡(如 eth0 + docker0),必须指定业务网络对应的真实 IP,不能依赖 DNS 解析结果
检查方式:
- 在目标节点执行 ss -tlnp | grep :33081,确认 mysqld 正在监听该端口
- 从另一节点执行 nc -zv 192.168.150.22 33081(替换成实际 IP 和端口),失败就说明网络层不通
- 检查 /etc/hosts 中该节点的 hostname 是否解析到正确 IP(MGR 启动时会反向解析 hostname,再拿 A 记录去连)
firewalld 必须放行 MGR 通信端口,不止 3306
MGR 不是只靠 3306 端口干活。从 MySQL 8.0.27 开始,默认通信栈是 MYSQL,但仍需独立端口用于组内握手和 Paxos 协议消息;若用老的 XCOM 栈,则更依赖额外端口(如 33061、33062)。常见漏放端口导致日志刷 communication stack is not connected 或反复重试 donor 连接。
必须放行的端口(按实际配置调整):
- loose-group_replication_local_address 指定的端口(如 33081)
- 若启用 XCOM 栈,还需 33061 和 33062
- 33060(MySQL X Plugin,InnoDB Cluster AdminAPI 依赖)
在 RHEL/CentOS 上执行:
firewall-cmd --permanent --add-port=33060-33081/tcpfirewall-cmd --reload
别只开 3306 —— 那只是客户端端口,跟集群心跳无关。
SELinux 可能静默拦截 bind 或 connect,尤其非标准端口
CentOS/RHEL 默认开启 SELinux,而 MySQL 官方 RPM 包的策略只允许绑定 3306、33060 等白名单端口。loose-group_replication_local_address = '192.168.150.22:33081' 这种自定义端口会被拒绝,错误不报在 MySQL 日志里,而是在 dmesg 或 journalctl -u mysqld 里看到类似:
avc: denied { name_bind } for pid=12345 comm="mysqld" port=33081
临时验证是否 SELinux 导致:
setenforce 0
再试一次 START GROUP_REPLICATION。如果成功,就坐实问题。
永久修复(推荐最小权限):
semanage port -a -t mysqld_port_t -p tcp 33081
注意:不要用 semanage permissive -a mysqld_t 全局降级,风险太大。
network namespace 或容器环境里,loose-group_replication_local_address 要指向 host 网络
如果你在 Docker 或 Podman 里跑 MGR,且用了 --network=host,那 loose-group_replication_local_address 应写宿主机真实 IP + 端口;如果用了自定义 bridge 网络,就必须确保:
- 容器内能通过该地址被其他节点直连(通常要 publish 端口)
- loose-group_replication_group_seeds 列表里的地址,也必须是其他节点能访问到的“外部可达地址”,不能写容器内部 IP(如 172.17.0.2)
最容易忽略的一点:MySQL Server 进程本身运行在容器里,但它发起的 outbound 连接(比如连 seeds)走的是容器网络栈,而其他节点 inbound 连接必须能落到这个容器暴露的端口上。错配就会出现单向通(A 能连 B,B 连不上 A),集群视图始终不全。
复杂点在于,MGR 的通信地址、SQL 客户端地址、DNS 解析结果、防火墙规则、SELinux 策略这五者必须全部对齐,缺一不可。少查一个环节,就可能卡在 “看起来配置都对,就是加不进集群”。











