集群规划
shell接管路线注意:这里我尝试了很多遍,升级版本和降版本都不行,这里目前认为是强制mgr集群要用shell去搭建,自己手动搭建的mgr集群无法去直接引导。
| 角色 | 主机名 | IP 地址 | MySQL 端口 | MGR 角色 | 组件 |
|---|---|---|---|---|---|
| 主节点 | mgr1 | 192.168.24.140 | 3306 | PRIMARY | MySQL 8.4 + MGR |
| 从节点 1 | mgr2 | 192.168.24.141 | 3306 | SECONDARY | MySQL 8.4 + MGR |
| 从节点 2 | mgr3 | 192.168.24.142 | 3306 | SECONDARY | MySQL 8.4 + MGR |
| 路由节点 | router | 192.168.24.143 | 6446/6447 | --- | MySQL Router |
一、MySQL Router 到底是什么?
MySQL Router 是 MySQL 官方专为 MGR / InnoDB Cluster 设计的轻量级流量中间件。
核心作用
- 自动读写分离:写 → 路由到 PRIMARY;读 → 路由到 SECONDARY(负载均衡)
- 自动故障转移:主库宕机 → MGR 自动选主 → Router 自动切换,业务无感
- 对应用透明:程序只连 Router IP,不需要知道后端节点
- 读负载均衡:多个从库自动轮询,分摊查询压力
二、前置条件
- MGR 3 节点已搭建,全部 ONLINE
- 所有节点防火墙放行端口:
- 3306(MySQL)
- 33061(MGR 内部通信)
- 6446/6447(Router 读写分离)
- 所有节点互相互通、能 ping、能 SSH
- MySQL 通信协议说明:
- 经典协议(SQL):端口 3306,用于 mysql 命令行、JDBC、MyBatis 等
- X 协议(NoSQL):端口 33060,用于文档存储、CRUD API 等
Router 端口说明
- 6446 = 经典协议读写(SQL 写操作)
- 6447 = 经典协议只读(SQL 查询)
- 6448 = X 协议读写(NoSQL 写)
- 6449 = X 协议只读(NoSQL 读)
三、第 1 步:在 MGR 主节点创建 Router 专用账号
作用:让 Router 读取 MGR 集群拓扑(谁主、谁从)
注意:这里账号赋予的权限是用--bootstrap去引导的标准权限,也就是后面的shell引导线路
写死主库从库ip的话最小权限
GRANT SELECT ON performance_schema.replication_group_members TO 'router_admin'@'192.168.24.%';
GRANT SELECT ON performance_schema.replication_group_member_stats TO 'router_admin'@'192.168.24.%';
GRANT SELECT ON performance_schema.replication_connection_status TO 'router_admin'@'192.168.24.%';
GRANT SELECT ON performance_schema.replication_applier_status TO 'router_admin'@'192.168.24.%';
如果使用 --bootstrap 自动配置(官方要求权限)
-- 创建账号,允许内网所有机器登录
CREATE USER 'router_admin'@'192.168.24.%' IDENTIFIED BY 'Router@123';
-- 读取集群状态、节点角色权限
GRANT SELECT ON performance_schema.* TO 'router_admin'@'192.168.24.%';
GRANT SELECT ON mysql.user TO 'router_admin'@'192.168.24.%';
-- 复制、连接管理权限(Router 维持连接必须)
FLUSH PRIVILEGES;GRANT BACKUP_ADMIN, CONNECTION_ADMIN, REPLICATION_SLAVE_ADMIN ON *.* TO 'router_admin'@'192.168.24.%';
connection_admin权限解释:
1.能杀掉别人的连接 / 线程(KILL)
普通用户只能杀自己的连接;
有这个权限,可以 KILL 任何用户的连接。
2.能绕过 max_connections 限制
MySQL 连接满了(Too many connections),普通用户连不进去;
有 CONNECTION_ADMIN 的账号 依然能登录。
→ 这是运维救命权限!
3.能开启 / 关闭 offline_mode 离线模式
SET GLOBAL offline_mode = ON;
开启后普通用户被拒绝,只有管理员能操作。
4.能在 read_only 模式下执行授权
从库默认 read_only=1,普通账号不能 grant;
有 CONNECTION_ADMIN 可以授权。
Router 每 1 秒查询:performance_schema.replication_group_members 判断主从角色
四、第 2 步:在 router 节点(143)安装 MySQL Router
未解决:因为低版本的shell无法去管理高版本的mysql,所以shell一定要高版本
rhel9.3版本太老,openssl版本不适配mysql8.4以上,80源的mysqlshell也不能管理8.4的mysql
rhel9.7版本可以正常安装
# 安装 MySQL 官方 YUM 源
dnf install https://dev.mysql.com/get/mysql84-community-release-el10-2.noarch.rpm -y
9版本的
dnf install -y https://dev.mysql.com/get/mysql84-community-release-el9-4.noarch.rpm
# 安装 MySQL Router
dnf install mysql-router-community -y
注意:
如果遇到一些版本问题可以用下面的参数,比如不用的话rhel9.3有时候连8.0的版本都装不了
dnf install -y mysql-router-community --nobest --nogpgcheck
dnf install -y mysql-shell --nobest --nogpgcheck
openssl 版本太低 → 必须加 --nobest 装旧版
MySQL 官方密钥不匹配 → 加 --nogpgcheck 跳过验证
不然的话自己在官方找相对应的链接去下载
五、路线一:手动配置 MySQL Router(快速测试版)
第 3 步:手动编写 Router 配置文件
文件路径:/etc/mysqlrouter/mysqlrouter.conf
注意:access_mode = read_write和access_mode = read_only这两个参数在主库从库被指定ip写死的时候是不能配置的,不然就会启动不了。
# [DEFAULT] 全局默认配置
[DEFAULT]
user = mysqlrouter # 以普通用户运行,安全
logging_folder = /var/log/mysqlrouter # 日志目录
runtime_folder = /var/run/mysqlrouter # PID 目录
config_folder = /etc/mysqlrouter # 配置目录
# 读写路由:6446 端口 → 只指向主库
[routing:primary]
bind_address = 0.0.0.0 # 监听所有网卡(一般生产写vip,就是router集群高可用,这里也可以写router的ip)
bind_port = 6446 # 写入口
destinations = 192.168.24.140:3306 # 手动指定主库 IP
routing_strategy = first-available # 只选第一个可用节点
protocol = classic # 经典 SQL 协议
#access_mode = read_write # 读写模式
# 只读路由:6447 端口 → 轮询从库
[routing:bootstrap_ro]
bind_address = 0.0.0.0 # 监听所有网卡(这里和上面一样)
bind_port = 6447 # 读入口
destinations = 192.168.24.141:3306,192.168.24.142:3306 # 手动指定从库列表
routing_strategy = round-robin # 轮询负载均衡
protocol = classic # 经典 SQL 协议
#access_mode = read_only # 只读模式
# 日志配置
[logger]
level = INFO
第 4 步:启动 Router
systemctl daemon-reload
systemctl enable --now mysqlrouter
systemctl status mysqlrouter
# 查看端口是否监听
netstat -lntp | grep mysqlrouter
# 必须看到:6446、6447
六、路线二:MySQL Shell 接管 MGR + Router 全自动引导(生产标准方案)
6.1 所有节点:安装 MySQL 8.4 + MySQL Shell
所有节点(mgr1、mgr2、mgr3、router)都执行
# 安装 mysql-shell(已配置 mysql 官方 yum 源)
dnf install -y mysql-community-server mysql-shell
启动 MySQL(数据库节点):
systemctl enable --now mysqld
6.2 主节点(mgr1):创建 标准可用 的管理员账号
登录主库 MySQL,直接复制执行(这是最终成功的权限):
权限按需分配:
-- 创建管理员账号(仅 192.168.24.0/24 段能登录)
CREATE USER 'dba_admin'@'192.168.24.%' IDENTIFIED BY 'Dba@123456';
-- ------------------------------
-- 官方必需:管理 InnoDB Cluster
-- ------------------------------
GRANT CLONE_ADMIN, CONNECTION_ADMIN, BACKUP_ADMIN ON *.* TO 'dba_admin'@'192.168.24.%';
GRANT CREATE USER, SYSTEM_VARIABLES_ADMIN ON *.* TO 'dba_admin'@'192.168.24.%';
GRANT REPLICATION SLAVE, REPLICATION_APPLIER, PERSIST_RO_VARIABLES_ADMIN ON *.* TO 'dba_admin'@'192.168.24.%';
-- ------------------------------
-- 必需:全局权限(监控、会话、集群状态)
-- ------------------------------
GRANT SELECT, PROCESS, SUPER, RELOAD ON *.* TO 'dba_admin'@'192.168.24.%';
-- ------------------------------
-- 必需:元数据库权限(集群核心库)
-- ------------------------------
GRANT ALL ON mysql_innodb_cluster_metadata.* TO 'dba_admin'@'192.168.24.%';
GRANT ALL ON mysql.* TO 'dba_admin'@'192.168.24.%';
-- 生效
FLUSH PRIVILEGES;
如果后续不行,测试可用:
赋予全部权限看是否是权限的问题,仅测试可用。
-- 创建集群管理员账号
CREATE USER 'dba_admin'@'192.168.24.%' IDENTIFIED BY 'Dba@123456';
-- 给足 InnoDB Cluster 全部权限(最终成功版)
GRANT ALL PRIVILEGES ON *.* TO 'dba_admin'@'192.168.24.%' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON mysql.* TO 'dba_admin'@'192.168.24.%' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON mysql_innodb_cluster_metadata.* TO 'dba_admin'@'192.168.24.%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
6.3 Router 节点:MySQL Shell 登录主节点
mysqlsh --user=dba_admin --host=192.168.24.140 --port=3306 --password
输入密码:
Dba@123456
6.4 MySQL Shell 搭建 / 接管 MGR(真实成功命令)
进入 JS 模式:
\js
1)配置实例
注意:这里我尝试了很多遍,升级版本和降版本都不行,这里目前认为是强制mgr集群要用shell去创建一个集群,自己手动搭建的mgr集群无法去直接收编。不过以下的方法可以通过你这个登录的ip去检测现有mgr集群也差不多。
原本我想直接创建集群收编
MySQL 192.168.24.140:3306 ssl JS > var cluster = dba.createCluster('mgr_cluster', { adoptFromGR: true, force: true });
A new InnoDB Cluster will be created based on the existing replication group on instance 'mgr1:3306'.
Creating InnoDB Cluster 'mgr_cluster' on 'mgr1:3306'...
Adding Seed Instance...
Segmentation fault (core dumped)
目前得到结论:只要用 adoptFromGR: true 接管手工 MGR → 触发 Segmentation fault (core dumped)
从这一步开始:
注意:这里直接用主机名是因为做了主机映射
dba.configureInstance('dba_admin@mgr1:3306')
核心作用:一键把普通 MySQL → 改成能加入 MGR 集群的模式
1)检查当前 MySQL 是否满足 MGR 要求
检查:
server_id 是否设置
gtid_mode 是否开启
enforce_gtid_consistency 是否开启
log_bin / log_slave_updates 是否开启
lower_case_table_names 是否合规
...... 等等 20+ 项系统参数
不满足 → 直接报错告诉你缺什么
满足 → 继续下一步
2)自动修复 / 设置缺失的 MGR 必需参数
你不用手动改 my.cnf!
它会自动执行:
SET PERSIST server_id = 1;
SET PERSIST gtid_mode = ON;
SET PERSIST enforce_gtid_consistency = ON;
SET PERSIST log_bin = ON;
SET PERSIST log_slave_updates = ON;
3)检查并启用并行复制(applierWorkerThreads)
Successfully enabled parallel appliers.
你看到这句 = 这一步完成了
4)确认当前节点可以安全加入 InnoDB Cluster
The instance 'mgr1:3306' is valid for InnoDB Cluster usage.
= 可以安全创建集群了!
2)创建 / 接管集群(自动识别现有 MGR,不崩溃)
var cluster = dba.createCluster('mgr_cluster')
1. 创建集群名字
把集群命名为 mgr_cluster(后面 Router 靠这个名字识别集群)
2. 初始化 MGR 组复制
自动创建:
组复制内部账号
恢复通道
启动组复制
你不用写任何 SQL
3. 自动检测你已经手工搭建好的 MGR
它发现你已经有组复制了,会提示你:
You are connected to an instance that belongs to an unmanaged replication group.
Do you want to setup an InnoDB Cluster based on this replication group? [Y/n]: y
输入 y = 安全接管,不崩溃、不报错
4. 生成集群元数据
自动创建库:
mysql_innodb_cluster_metadata
Router 靠它实现自动读写分离、故障感知
5. 把当前节点(mgr1)设为 PRIMARY 主库
"primary": "mgr1:3306"
没有手动搭建的集群:
将节点加入进来
#加入前也要体检一下
dba.configureInstance('dba_admin@mgr2:3306')
cluster.addInstance('dba_admin@mgr2:3306')
cluster是前面用var去定义的变量
提示:
Do you want to setup an InnoDB Cluster based on this replication group? [Y/n]: y
如果已经在别的shell上已经创建成功,那么获取该集群就行了
MySQL 192.168.24.140:3306 ssl JS > var cluster = dba.createCluster('mgr_cluster')
Dba.createCluster: Dba.createCluster: Unable to create cluster. The instance 'mgr1:3306' already belongs to an InnoDB cluster. Use dba.getCluster() to access it. (RuntimeError)
使用以下代码
MySQL 192.168.24.140:3306 ssl JS > var cluster = dba.getCluster('mgr_cluster')
3)查看集群状态(验证成功)
cluster.status()
✅ 成功状态:
MySQL 192.168.24.140:3306 ssl JS > cluster.status()
{
"clusterName": "mgr_cluster",
"defaultReplicaSet": {
"name": "default",
"primary": "mgr1:3306",
"ssl": "DISABLED",
"status": "OK",
"statusText": "Cluster is ONLINE and can tolerate up to ONE failure.",
"topology": {
"mgr1:3306": {
"address": "mgr1:3306",
"memberRole": "PRIMARY",
"mode": "R/W",
"readReplicas": {},
"replicationLag": "applier_queue_applied",
"role": "HA",
"status": "ONLINE",
"version": "8.4.8"
},
"mgr2:3306": {
"address": "mgr2:3306",
"memberRole": "SECONDARY",
"mode": "R/O",
"readReplicas": {},
"replicationLag": "applier_queue_applied",
"role": "HA",
"status": "ONLINE",
"version": "8.4.8"
},
"mgr3:3306": {
"address": "mgr3:3306",
"memberRole": "SECONDARY",
"mode": "R/O",
"readReplicas": {},
"replicationLag": "applier_queue_applied",
"role": "HA",
"status": "ONLINE",
"version": "8.4.8"
}
},
"topologyMode": "Single-Primary"
},
"groupInformationSourceMember": "mgr1:3306"
}
6.5 Router 节点:全自动引导配置
mysqlrouter --bootstrap dba_admin@192.168.24.140:3306 --user=mysqlrouter
1)连接 MGR 集群,获取拓扑结构
它去连接 192.168.24.140:3306(主库)
自动读出:
谁是主库(PRIMARY)
谁是从库(SECONDARY)
集群名字叫什么
所有节点地址
2)自动创建 Router 专用账号
自动在集群里创建一个内部账号,专门给 Router 监控集群用
你不用管、不用建
3)自动生成 mysqlrouter.conf 配置文件
路径:/etc/mysqlrouter/mysqlrouter.conf
内容包括:
6446 写端口 → 指向主库
6447 读端口 → 指向从库
集群状态刷新频率
负载均衡策略
4)自动配置读写分离 + 负载均衡
6446 = 写(主库)
6447 = 读(从库轮询)
5)自动配置权限、目录、密钥
运行用户 mysqlrouter
权限安全
密钥保存
输入密码:
Dba@123456
启动 Router:
systemctl enable --now mysqlrouter
systemctl restart mysqlrouter
6.6 读写分离验证(真实可用命令)
127.0.0.1是因为自动生成的mysqlrouter.confbind_address为0.0.0.0
# 写端口 → 主库 mgr1
mysqlsh -h127.0.0.1 -P6446 -udba_admin -pDba@123456 --sql -e "select @@hostname"
# 读端口 → 从库 mgr2/mgr3
mysqlsh -h127.0.0.1 -P6447 -udba_admin -pDba@123456 --sql -e "select @@hostname"
也可以mysql验证:
[root@router ~]# systemctl restart mysqlrouter
[root@router ~]# mysql -h127.0.0.1 -P6446 -udba_admin -pDba@123456 -e "select @@hostname"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| mgr1 |
+------------+
[root@router ~]# mysql -h127.0.0.1 -P6447 -udba_admin -pDba@123456 -e "select @@hostname"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| mgr2 |
+------------+
[root@router ~]# mysql -h127.0.0.1 -P6447 -udba_admin -pDba@123456 -e "select @@hostname"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| mgr3 |
+------------+
[root@router ~]#
自动生成的mysqlrouter.conf文件
[root@localhost ~]# cat /etc/mysqlrouter/mysqlrouter.conf
# File automatically generated during MySQL Router bootstrap
[DEFAULT]
name=system
user=mysqlrouter
keyring_path=/var/lib/mysqlrouter/keyring
master_key_path=/etc/mysqlrouter/mysqlrouter.key
connect_timeout=5
read_timeout=30
dynamic_state=/var/lib/mysqlrouter/state.json
client_ssl_cert=/var/lib/mysqlrouter/router-cert.pem
client_ssl_key=/var/lib/mysqlrouter/router-key.pem
client_ssl_mode=PREFERRED
server_ssl_mode=PREFERRED
server_ssl_verify=DISABLED
unknown_config_option=error
max_idle_server_connections=64
router_require_enforce=1
[logger]
level=info
[metadata_cache:bootstrap]
cluster_type=gr
router_id=1
user=mysql_router1_78xo0ge
metadata_cluster=mgr_cluster
ttl=0.5
auth_cache_ttl=-1
auth_cache_refresh_interval=2
use_gr_notifications=0
[routing:bootstrap_rw]
bind_address=0.0.0.0
bind_port=6446
destinations=metadata-cache://mgr_cluster/?role=PRIMARY
routing_strategy=first-available
protocol=classic
[routing:bootstrap_ro]
bind_address=0.0.0.0
bind_port=6447
destinations=metadata-cache://mgr_cluster/?role=SECONDARY
routing_strategy=round-robin-with-fallback
protocol=classic
[routing:bootstrap_rw_split]
bind_address=0.0.0.0
bind_port=6450
destinations=metadata-cache://mgr_cluster/?role=PRIMARY_AND_SECONDARY
routing_strategy=round-robin
protocol=classic
connection_sharing=1
client_ssl_mode=PREFERRED
server_ssl_mode=PREFERRED
access_mode=auto
[routing:bootstrap_x_rw]
bind_address=0.0.0.0
bind_port=6448
destinations=metadata-cache://mgr_cluster/?role=PRIMARY
routing_strategy=first-available
protocol=x
router_require_enforce=0
client_ssl_ca=
server_ssl_key=
server_ssl_cert=
[routing:bootstrap_x_ro]
bind_address=0.0.0.0
bind_port=6449
destinations=metadata-cache://mgr_cluster/?role=SECONDARY
routing_strategy=round-robin-with-fallback
protocol=x
router_require_enforce=0
client_ssl_ca=
server_ssl_key=
server_ssl_cert=
[http_server]
port=8443
ssl=1
ssl_cert=/var/lib/mysqlrouter/router-cert.pem
ssl_key=/var/lib/mysqlrouter/router-key.pem
[http_auth_realm:default_auth_realm]
backend=default_auth_backend
method=basic
name=default_realm
[rest_router]
require_realm=default_auth_realm
[rest_api]
[http_auth_backend:default_auth_backend]
backend=metadata_cache
[rest_routing]
require_realm=default_auth_realm
[rest_metadata_cache]
require_realm=default_auth_realm
6.6 启动 Router(同路线一)
systemctl daemon-reload
systemctl enable --now mysqlrouter
systemctl status mysqlrouter
netstat -lntp | grep mysqlrouter
七、第 5 步:业务如何连接(读写分离,双路线通用)
# 写请求 → 6446 → 自动到主库
mysql -uroot -p'密码' -h 192.168.24.143 -P 6446
# 读请求 → 6447 → 自动到 141、142(轮询)
mysql -uroot -p'密码' -h 192.168.24.143 -P 6447
注意:一般root默认只允许本地登录,也就是root@localhost,自己创建一个验证用户就行,有查看对应表格或者状态的权限就行。
只是验证方便的话用这个就行
mysql> create user admins@'192.168.72.%' identified by 'Admins@123';
mysql> grant all on *.* to admins@'192.168.72.%';
八、第 6 步:验证读写分离
验证 6446 → 主库
select MEMBER_HOST, MEMBER_ROLE
from performance_schema.replication_group_members
where MEMBER_HOST=@@hostname;
-- 输出:PRIMARY
mysql> select MEMBER_ID,MEMBER_ROLE from
-> performance_schema.replication_group_members;
+--------------------------------------+-------------+
| MEMBER_ID | MEMBER_ROLE |
+--------------------------------------+-------------+
| a3acd2e3-3c8d-11f1-8937-000c2906b162 | SECONDARY |
| ab958bde-3c8d-11f1-a4fb-000c29ebd6a2 | PRIMARY |
| b479cd59-3c9c-11f1-8e3b-000c29a02a54 | SECONDARY |
+--------------------------------------+-------------+
3 rows in set (0.01 sec)
mysql> select MEMBER_HOST, MEMBER_ROLE
-> from performance_schema.replication_group_members
-> where MEMBER_HOST=@@hostname;
+-------------+-------------+
| MEMBER_HOST | MEMBER_ROLE |
+-------------+-------------+
| mgr1 | PRIMARY |
+-------------+-------------+
1 row in set (0.00 sec)
@@hostname = MySQL 所在机器的主机名
作用:判断你当前连接的是哪一个 MySQL 节点
你现在用它:测试 MySQL Router 路由是否正确
验证 6447 → 从库
select MEMBER_HOST, MEMBER_ROLE
from performance_schema.replication_group_members
where MEMBER_HOST=@@hostname;
-- 输出:SECONDARY
结果:
以下结果是正常的,保持一个连接不退出,当然不会轮询,只有新建连接才会轮询。
mysql> select MEMBER_HOST, MEMBER_ROLE from performance_schema.replication_group_members;
+-------------+-------------+
| MEMBER_HOST | MEMBER_ROLE |
+-------------+-------------+
| mgr2 | SECONDARY |
| mgr1 | PRIMARY |
| mgr3 | SECONDARY |
+-------------+-------------+
3 rows in set (0.00 sec)
mysql> select MEMBER_HOST, MEMBER_ROLE from performance_schema.replication_group_members where MEMBER_HOST=@@hostname;
+-------------+-------------+
| MEMBER_HOST | MEMBER_ROLE |
+-------------+-------------+
| mgr2 | SECONDARY |
+-------------+-------------+
1 row in set (0.00 sec)
mysql> select MEMBER_HOST, MEMBER_ROLE from performance_schema.replication_group_members where MEMBER_HOST=@@hostname;
+-------------+-------------+
| MEMBER_HOST | MEMBER_ROLE |
+-------------+-------------+
| mgr2 | SECONDARY |
+-------------+-------------+
1 row in set (0.00 sec)
验证读负载均衡
# 多次执行,结果依次出现 mgr2 → mgr3 → mgr2 → mgr3
mysql -h 192.168.24.143 -P 6447 -uroot -p'密码' -N -e "select @@hostname"
结果实现轮询
[root@router ~]# mysql -urouter_admin -p'Router@123' -h 192.168.24.143 -P 6447 -N -e "select @@hostname"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------+
| mgr3 |
+------+
[root@router ~]# mysql -urouter_admin -p'Router@123' -h 192.168.24.143 -P 6447 -N -e "select @@hostname"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------+
| mgr2 |
+------+
[root@router ~]# mysql -urouter_admin -p'Router@123' -h 192.168.24.143 -P 6447 -N -e "select @@hostname"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------+
| mgr3 |
+------+
九、第 7 步:故障自动切换原理
- 主库 140 宕机
- MGR 自动选举新主(如 141)
- Router 每隔 0.5 秒检测集群状态
- Router 自动更新路由表
- 业务再次连接 6446 → 自动到新主
- IP 不变、配置不改、业务无感
十、最重要端口总结
| 端口 | 作用 |
|---|---|
| 3306 | MySQL 服务端口 |
| 33061 | MGR 集群内部通信 |
| 6446 | 读写端口 → 自动路由主库 |
| 6447 | 只读端口 → 从库负载均衡 |
十一、双路线对比与选择建议
| 路线 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 手动配置 Router | 简单、快速、无依赖 | 主从切换需手动改配置 | 测试、学习、临时环境 |
| Shell 接管 + 自动引导 | 官方标准、自动感知主从、故障转移稳定 | 需安装 Shell、步骤稍多 | 生产环境首选 |