代码改变世界

MySQL组复制的通信栈Communication Stack

2026-03-06 15:33  潇湘隐者  阅读(3)  评论(0)    收藏  举报

有人询问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