后仲舒 发表于 2026-3-6 20:20:03

MySQL组复制的通信栈Communication Stack

有人询问MySQL InnoDB Cluster中,group_replication_local_address参数设置的端口跟MySQL监听端口一致, 这样会冲突吗? 为什么他将节点加入InnoDB Cluster报错?
简单展示如下:
mysql> show variables like 'port';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port          | 3306|
+---------------+-------+
1 row in set (0.01 sec)

mysql>
mysql> show variables like 'group_replication_local_address';
+---------------------------------+---------------+
| Variable_name                   | Value         |
+---------------------------------+---------------+
| group_replication_local_address | mysqlu01:3306 |
+---------------------------------+---------------+
1 row in set (0.01 sec)

mysql> 其实MySQL变量group_replication_local_address中的端口跟MySQL监听端口3306一致,不一定会引起冲突. 因为MySQL组复制的通信栈协议有两种,具体取决于你的MySQL版本与你使用的通信栈(Communication Stack).
通信栈类型

MySQL组复制支持以下通信堆栈:
MYSQL通信堆栈

MySQL通信栈是MySQL 8.0.27版本开始引入的,MySQL通过使用MySQL Server 的连接安全性代替Group Replication的实现。使用MySQL协议意味着可以使用标准的用户身份验证方法来授予(或撤销)对组的访问权限,

[*]通过使用 MySQL 服务器的连接安全性代替组复制实现来简化MySQL InnoDB 集群的创建。
[*]消除了对内部组复制通信的额外网络地址或端口的需要。
[*]使用 MYSQL 协议意味着可以使用标准的用户身份验证方法来授予或撤销对组的访问权限,而不是允许列表。
[*]支持组复制的网络命名空间。
Oracle 建议使用MySQL通信堆栈而不是XCOM.
XCOM通信堆栈

XCOM: (MySQL Server 8.0.26 或更早版本的默认值)。您可以将 XCOM 通信堆栈与 MySQL 8.0.27 或更高版本一起使用,但必须在创建或重启命令中明确定义。
XCOM使用安全协议的组复制实现来保护成员之间的组通信连接和分布式恢复连接,包括 TLS/SSL 和对传入组通信系统 (GCS) 连接使用允许列表。
如果您正在使用 XCOM通信堆栈,除了默认port的 3306(用于通过经典 MySQL 协议进行客户端连接)和 mysqlx_port默认为 33060(用于 X 协议客户端连接)之外,
还有一个内部端口集群中不用于客户端连接的实例之间的连接。该端口由localAddress选项配置,该选项配置 group_replication_local_address 系统变量,这个
端口必须打开,这样集群中的实例才能相互通信。例如,如果您的防火墙阻止了此端口,则实例无法相互通信,集群也无法运行。同样,如果您的实例正在使用SELinux,
您需要确保 InnoDB Cluster 使用的所有必需端口都已打开,以便实例可以相互通信。
查看使用的通信栈类型

如下所示,字段MEMBER_COMMUNICATION_STACK表示MGR使用的通信栈类型.
mysql> SELECT MEMBER_HOST
    ->       ,MEMBER_PORT
    ->       ,MEMBER_COMMUNICATION_STACK
    -> FROM performance_schema.replication_group_members
    -> ORDER BY MEMBER_HOST;
+-------------+-------------+----------------------------+
| MEMBER_HOST | MEMBER_PORT | MEMBER_COMMUNICATION_STACK |
+-------------+-------------+----------------------------+
| mysqlu01    |      7306 | MySQL                      |
| mysqlu02    |      7306 | MySQL                      |
| mysqlu03    |      7306 | MySQL                      |
+-------------+-------------+----------------------------+
3 rows in set (0.00 sec)MGR通信栈为Xcom场景
mysql> SELECT MEMBER_HOST
    ->       ,MEMBER_PORT
    ->       ,MEMBER_COMMUNICATION_STACK
    -> FROM performance_schema.replication_group_members
    -> ORDER BY MEMBER_HOST;
+-------------+-------------+----------------------------+
| MEMBER_HOST | MEMBER_PORT | MEMBER_COMMUNICATION_STACK |
+-------------+-------------+----------------------------+
| mysqlu01    |      7306 | XCom                     |
| mysqlu02    |      7306 | XCom                     |
| mysqlu03    |      7306 | XCom                     |
+-------------+-------------+----------------------------+
3 rows in set (0.01 sec)

mysql> 通信栈选择

MySQL官方推荐使用MySQL通信栈而非XCOM通信栈.原文如下:
Oracle recommends using the MYSQL communication stack instead of XCOM.当然也有人认为目前而言,MySQL通信栈Bug多一些,使用XCOM通信栈更稳定一些.
参考资料

1.https://dev.mysql.com/doc/mysql-shell/8.4/en/shell-admin-api-communication-stack.html
2.https://dev.mysqlserver.cn/doc/mysql-shell/8.4/en/shell-admin-api-communication-stack.html
3.How To Use group_replication_communication_stack in InnoDB Cluster FAQ4202
扫描上面二维码关注我如果你真心觉得文章写得不错,而且对你有所帮助,那就不妨帮忙“推荐"一下,您的“推荐”和”打赏“将是我最大的写作动力!本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

辉伫 发表于 2026-3-9 23:31:57

感谢分享

笙芝 发表于 2026-3-9 23:50:49

很好很强大我过来先占个楼 待编辑

蜴间囝 发表于 2026-3-10 20:37:22

谢谢分享,辛苦了
页: [1]
查看完整版本: MySQL组复制的通信栈Communication Stack