MySQL MGR + MySQL Router 高可用集群完整笔记(含手动配置 + Shell 接管双路线)

集群规划

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,不需要知道后端节点
  • 读负载均衡:多个从库自动轮询,分摊查询压力

二、前置条件

  1. MGR 3 节点已搭建,全部 ONLINE
  2. 所有节点防火墙放行端口:
    • 3306(MySQL)
    • 33061(MGR 内部通信)
    • 6446/6447(Router 读写分离)
  3. 所有节点互相互通、能 ping、能 SSH
  4. 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 步:故障自动切换原理

  1. 主库 140 宕机
  2. MGR 自动选举新主(如 141)
  3. Router 每隔 0.5 秒检测集群状态
  4. Router 自动更新路由表
  5. 业务再次连接 6446 → 自动到新主
  6. IP 不变、配置不改、业务无感

十、最重要端口总结

端口 作用
3306 MySQL 服务端口
33061 MGR 集群内部通信
6446 读写端口 → 自动路由主库
6447 只读端口 → 从库负载均衡

十一、双路线对比与选择建议

路线 优点 缺点 适用场景
手动配置 Router 简单、快速、无依赖 主从切换需手动改配置 测试、学习、临时环境
Shell 接管 + 自动引导 官方标准、自动感知主从、故障转移稳定 需安装 Shell、步骤稍多 生产环境首选
相关推荐
凉、介1 小时前
Armv8-A virtualization 笔记 (一)
c语言·笔记·学习·嵌入式·虚拟化·hypervisor
楼田莉子1 小时前
仿Muduo的高并发服务器:LoopThread模块及其ThreadPool模块
linux·服务器·c++·后端·学习
逸Y 仙X2 小时前
文章二十四:Elasticsearch查询排序应用实战e
java·大数据·数据库·elasticsearch·搜索引擎·全文检索
2401_871492852 小时前
C#怎么使用泛型 C#泛型类泛型方法和泛型约束的定义和使用方法【语法】
jvm·数据库·python
菜鸟的日志2 小时前
【嵌入系统】嵌入式学习笔记(一)
windows·笔记·嵌入式硬件·学习·ubuntu·操作系统
战南诚2 小时前
深分页问题
数据库·mysql
2301_787312432 小时前
Vue.js中Patch过程处理Teleport组件挂载位置的特殊逻辑
jvm·数据库·python
dfdfadffa2 小时前
Golang Gin怎么做JWT登录认证_Golang Gin JWT教程【实用】
jvm·数据库·python
m0_736439302 小时前
C#怎么实现MVVM模式 C#如何在WPF中使用MVVM设计模式分离视图和逻辑【架构】
jvm·数据库·python