MySQL官方唯一推荐的高可用方案是InnoDB Cluster,需用MySQL Shell基于Group Replication搭建单主多从集群,前提包括启用GTID、ROW格式二进制日志、唯一server_id、log_slave_updates=ON、关闭MyISAM引擎、网络互通,并通过dba.createCluster()和addInstance()创建与扩容,最后用cluster.status()验证状态。

能,但“快速”不等于跳过关键校验——三节点 InnoDB Cluster 的核心约束(GTID、组通信端口、主机名解析、防火墙、server_id 唯一性)缺一不可,跳过任意一项都会卡在 cluster.addInstance() 或 group_replication 启动阶段。
确认 MySQL Shell 和 MySQL Server 版本兼容性
MySQL Shell 不是可选工具,而是集群生命周期管理的唯一入口。8.0.35 服务端必须配 8.0.35 或 8.0.34 的 Shell;混用 8.0.30 Shell + 8.0.35 Server 会触发 MySQL Error 2027(X 协议握手失败)或静默拒绝添加实例。
- 检查 Shell 版本:
mysqlsh --version - 检查 Server X 协议端口:
mysql -uroot -p -e "SELECT @@mysqlx_port;"(默认 33060,不是 3306) - Shell 连接必须显式指定 X 协议端口:
mysqlsh -h node1 -P 33060 -u root -p - 若提示
Plugin mysqlx reported: 'Failed to bind port 33060',说明端口被占用或 SELinux 拦截,需先解决再继续
配置文件里必须写死的 MGR 关键参数
仅靠 dba.configureLocalInstance() 自动补全不够。它不会写入 loose-group_replication_group_seeds 或修正 bind_address,这些必须手动加到 /etc/my.cnf 的 [mysqld] 段下:
-
bind_address=0.0.0.0(不能是127.0.0.1,否则其他节点连不上) -
server_id必须全局唯一(建议用 IP 最后一段+端口,如192.168.30.128:3306→1283306) -
loose-group_replication_local_address="node1:33061"(注意:这是组内通信端口,非 MySQL 端口,且必须和/etc/hosts中的 hostname 完全一致) -
loose-group_replication_group_seeds="node1:33061,node2:33061,node3:33061"(所有节点都写全,顺序无关) -
loose-group_replication_ip_whitelist="192.168.30.0/24"(推荐用 CIDR,比列 hostname 更可靠;若用 hostname,三台/etc/hosts必须完全一致)
添加节点时最常卡住的三个现象
执行 cluster.addInstance("root@node2:3306") 后长时间无响应或报错,大概率是以下其一:
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 节点间
telnet node2 33061不通 → 检查防火墙是否放行 33061(不是 3306),CentOS 7 用firewall-cmd --add-port=33061/tcp --permanent && firewall-cmd --reload -
SELECT * FROM performance_schema.replication_group_members;在 node1 上返回空 → 说明 GR 插件根本没启动,确认是否执行了INSTALL PLUGIN group_replication SONAME 'group_replication.so';,且未被skip-grant-tables干扰 - 报错
ERROR: Group Replication requires GTID to be enabled→ 检查gtid_mode=ON是否生效:mysql -e "SHOW VARIABLES LIKE 'gtid_mode';",若为OFF,重启 mysqld 后仍无效,说明配置未加载(常见于 my.cnf 被多个 conf.d 文件覆盖)
cluster.status() 显示 ONLINE 但写入不复制?检查事务引擎
InnoDB Cluster 强制要求所有表用 ENGINE=InnoDB。哪怕只有一张 MyISAM 表,INSERT 也会成功但不复制,且不报错。
- 查非 InnoDB 表:
SELECT table_schema,table_name,engine FROM information_schema.tables WHERE engine != 'InnoDB' AND table_schema NOT IN ('mysql','information_schema','performance_schema','sys'); - 建表时务必显式声明:
CREATE TABLE t1 (id INT) ENGINE=InnoDB;(不要依赖default_storage_engine) - 已存在的 MyISAM 表必须转换:
ALTER TABLE db1.t1 ENGINE=InnoDB;,否则该表永远游离于集群之外
真正耗时的不是命令执行,而是验证每台机器的 /etc/hosts 解析、33061 端口连通性、以及 performance_schema.replication_group_members 的实时状态——这些没法跳,也不该跳。漏掉任何一个,后续排错时间远超前期多花的两分钟检查。










