MySQL MGR 借助 Router 实现自动故障转移

MySQL Router 是 MySQL 官方提供的一个轻量级中间件,是 InnoDB Cluster 的一部分,可在应用程序和后端MySQL服务器之间提供透明路由。主要用以解决 MySQL 主从库集群的高可用、负载均衡、易扩展等问题。Router 作为一个流量转发层,位于应用与 MySQL 服务器之间,其功能类似于 LVS。

Router 解决了什么问题

  • MySQL MGR 只是数据同步集群,不是负载均衡 / 代理集群,MGR 本身不提供客户端自动故障转移!

注:当主库发生故障,集群会自动选举一个新的主库,新主库的IP地址和端口都可能发生变化。如果应用直连,需要复杂的逻辑来自行感知故障并重新建立连接,否则就会连接失败。实现效果:主库宕机 → 驱动自动发现 → 自动连接新主库 → 业务恢复

  • 而借助 Router 可以为 MGR 集群提供一个虚拟IP作为应用程序单一连接点,通过这个单一的连接点实现负载均衡、读写分离、故障转移等功能

注:MySQL Router自身存在单点故障隐患,官方推荐在每个应用程序所在机器上部署Router(性能损耗小于1%),程序连接本机 Router 以降低网络延迟、提升性能;也可以在Router的上层在搭建Keepalived作为高可用。

  • 当后端 MySQL 实例挂掉之后,无需人工干预,MySQL Router 会自动剔除挂了的 MySQL 实例,当挂了的MySQL实例恢复后会自动加入 MySQL Router 的后端服务器,也无需人工干预。

安装配置

  • 资源规划:
ip地址 主机名 OS版本 MySQL版本 sql port 权重 角色
192.168.31.101 mgr101 Centos 7.9 x64 8.0.32 3406 50 mgr节点、mysql-shell 8.0.46
192.168.31.102 mgr102 Centos 7.9 x64 8.0.32 3406 40 mgr节点
192.168.31.103 mgr103 Centos 7.9 x64 8.0.32 3406 30 mgr节点
192.168.31.104 - Ubuntu 24.04.3 - - - 应用服务器、mysql-router 8.0.46

注:务必注意版本兼容性,MySQL 8.0 推荐使用 MySQL Shell 8.0.46、MySQL Router 8.0.46。若 MySQL 8.0 使用 MySQL Router 8.4.6(这个针对MySQL 8.4)则可能会遇到莫名其妙的问题,比如服务正常但端口未监听

1.搭建 MGR 集群

  • 第1步,安装 MySQL 8.0 并搭建 MGR 集群(单主模式),过程省略...
$ mysql -udba_admin -pcf_rB1NKCzbaQuPH -S /tmp/mysql_3406.sock -e"select MEMBER_HOST,MEMBER_PORT,MEMBER_STATE,MEMBER_ROLE from performance_schema.replication_group_members;"
+----------------+-------------+--------------+-------------+
| MEMBER_HOST    | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE |
+----------------+-------------+--------------+-------------+
| 192.168.31.101 |        3406 | ONLINE       | PRIMARY     |
| 192.168.31.102 |        3406 | ONLINE       | SECONDARY   |
| 192.168.31.103 |        3406 | ONLINE       | SECONDARY   |
+----------------+-------------+--------------+-------------+
  • 第2步,所有节点:修改配置文件,启用 SSL/TLS

注1:MySQL 8.4 及以后版本,默认不再启用认证插件 mysql_native_password,而使用 caching_sha2_password 推荐使用SSL/TLS安全连接。

注2:同时也要为 MGR 启用 SSL参数,否则 MGR 集群重启之后从库节点状态变为 RECOVERING,报错 Authentication requires secure connection. Error_code: MY-002061

$ cat /data/mysql_3406/my_3406.cnf | grep ssl
ssl=on
ssl-ca=/data/mysql_3406/var/ca.pem
ssl-cert=/data/mysql_3406/var/server-cert.pem
ssl-key=/data/mysql_3406/var/server-key.pem
loose-group_replication_recovery_use_ssl=ON
loose_group_replication_ssl_mode=REQUIRED
loose_group_replication_ssl_ca=/data/mysql_3406/var/ca.pem
loose_group_replication_ssl_cert=/data/mysql_3406/var/server-cert.pem
loose_group_replication_ssl_key=/data/mysql_3406/var/server-key.pem
  • 第3步,所有节点:重启 MGR(注意顺序)
#.1.先停止从库2、3
mysql -udba_admin -pcf_rB1NKCzbaQuPH -S /tmp/mysql_3406.sock -e"stop group_replication;"
mysqladmin -udba_admin -pcf_rB1NKCzbaQuPH -S /tmp/mysql_3406.sock shutdown

#.2.再停止主库1
mysql -udba_admin -pcf_rB1NKCzbaQuPH -S /tmp/mysql_3406.sock -e"stop group_replication;"
mysqladmin -udba_admin -pcf_rB1NKCzbaQuPH -S /tmp/mysql_3406.sock shutdown

#.3.先启动主库1,引导组复制
/opt/mysql/bin/mysqld_safe --defaults-file=/data/mysql_3406/my_3406.cnf &
mysql -udba_admin -pcf_rB1NKCzbaQuPH -S /tmp/mysql_3406.sock
mysql> set @@global.group_replication_bootstrap_group=on;
mysql> start group_replication;
mysql> set @@global.group_replication_bootstrap_group=off;
mysql> exit

#.4.再启动从库2、3,加入组复制
/opt/mysql/bin/mysqld_safe --defaults-file=/data/mysql_3406/my_3406.cnf &
mysql -udba_admin -pcf_rB1NKCzbaQuPH -S /tmp/mysql_3406.sock -e"start group_replication;"

#.5.任意节点:确认节点信息
mysql -udba_admin -pcf_rB1NKCzbaQuPH -S /tmp/mysql_3406.sock -e"select MEMBER_HOST,MEMBER_PORT,MEMBER_STATE,MEMBER_ROLE from performance_schema.replication_group_members;"

2.将 MGR 集群升级为 InnoDB Cluster

  • 第4步,MGR任一节点:登录主库并创建 集群管理 专用账户,示例账号 dba_cluster 密码 Admin_147

注:该账号要有 WITH GRANT OPTION 权限,否则会报错 Access denied

#.1.确认主库节点
mysql -udba_admin -pcf_rB1NKCzbaQuPH -S /tmp/mysql_3406.sock -e"select MEMBER_HOST,MEMBER_ROLE from performance_schema.replication_group_members;"

#.2.定义主库信息
port="3406"
mysql_m="192.168.31.101"

#.3.在主库上创建专用账户,推荐使用 caching_sha2_password 插件
mysql -udba_admin -pcf_rB1NKCzbaQuPH -h $mysql_m -P $port -e"DROP USER IF EXISTS 'dba_cluster'@'192.168.31.%';"
mysql -udba_admin -pcf_rB1NKCzbaQuPH -h $mysql_m -P $port -e"CREATE USER IF NOT EXISTS 'dba_cluster'@'192.168.31.%' IDENTIFIED with caching_sha2_password BY 'Admin_147';"
mysql -udba_admin -pcf_rB1NKCzbaQuPH -h $mysql_m -P $port -e"GRANT ALL PRIVILEGES ON *.* TO 'dba_cluster'@'192.168.31.%' WITH GRANT OPTION;"
mysql -udba_admin -pcf_rB1NKCzbaQuPH -h $mysql_m -P $port -e"FLUSH PRIVILEGES;"
mysql -udba_admin -pcf_rB1NKCzbaQuPH -h $mysql_m -P $port -e"select user,host,plugin,account_locked from mysql.user;"
  • 第5步,MGR任一节点:安装 mysql-shell 8.0.46
#.针对 CentOS 7.9
cd /opt/
yum install -y libyaml
wget -c https://cdn.mysql.com//Downloads/MySQL-Shell/mysql-shell-8.0.46-1.el7.x86_64.rpm
rpm -ivh mysql-shell-8.0.46-1.el7.x86_64.rpm

#.查看版本
mysqlsh --version
  • 第6步,同一节点:利用 mysql-shell 创建一个名为 mgr_cluster 的集群
[root@mgr101 ~]# mysqlsh --uri dba_cluster@192.168.31.101:3406 --password=Admin_147 --js
 MySQL  JS > dba.configureInstance('dba_cluster@192.168.31.101:3406')
 MySQL  JS > shell.connect('dba_cluster@192.168.31.101:3406')
 MySQL  JS > var cluster = dba.createCluster('mgr_cluster')
 MySQL  JS > cluster.status()
  • 第7步,同一节点:确保所有节点都是 ONLINE 状态

注:执行 dba.configureInstance 是为了修复 NOTE: The required parallel-appliers settings are not enabled on the instance.

 MySQL  JS > dba.configureInstance('dba_cluster@192.168.31.102:3406')
 MySQL  JS > dba.configureInstance('dba_cluster@192.168.31.103:3406')
 MySQL  JS > cluster.status()
 MySQL  JS > \q

附:连接到 mgr_cluster 集群的方式

[root@mgr101 ~]# mysqlsh --uri dba_cluster@192.168.31.101:3406 --password=Admin_147 --js
 MySQL  JS > var cluster = dba.getCluster('mgr_cluster')
 MySQL  JS > cluster.status()
{
    "clusterName": "mgr_cluster", 
    "defaultReplicaSet": {
        "name": "default", 
        "primary": "192.168.31.101:3406", 
        "ssl": "DISABLED", 
        "status": "OK", 
        "statusText": "Cluster is ONLINE and can tolerate up to ONE failure.", 
        "topology": {
            "192.168.31.101:3406": {
                "address": "192.168.31.101:3406", 
                "memberRole": "PRIMARY", 
                "mode": "R/W", 
                "readReplicas": {}, 
                "replicationLag": "applier_queue_applied", 
                "role": "HA", 
                "status": "ONLINE", 
                "version": "8.0.32"
            }, 
            "192.168.31.102:3406": {
                "address": "192.168.31.102:3406", 
                "memberRole": "SECONDARY", 
                "mode": "R/O", 
                "readReplicas": {}, 
                "replicationLag": "applier_queue_applied", 
                "role": "HA", 
                "status": "ONLINE", 
                "version": "8.0.32"
            }, 
            "192.168.31.103:3406": {
                "address": "192.168.31.103:3406", 
                "memberRole": "SECONDARY", 
                "mode": "R/O", 
                "readReplicas": {}, 
                "replicationLag": "applier_queue_applied", 
                "role": "HA", 
                "status": "ONLINE", 
                "version": "8.0.32"
            }
        }, 
        "topologyMode": "Single-Primary"
    }, 
    "groupInformationSourceMember": "192.168.31.101:3406"
}
 MySQL  JS \q
Bye!

3.配置 MySQL Route

  • 第8步,MGR任一节点:登录主库并创建 Router 专用账号,示例账号 dba_router 密码 Admin_147

注1:该账号要有 WITH GRANT OPTION 权限,否则会报错 Access denied

注2:必须启用 SSL 且使用 caching_sha2_password 插件,否则执行 mysqlrouter --bootstrap 会报错 Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection. (2061)

#.1.确认主库节点
mysql -udba_admin -pcf_rB1NKCzbaQuPH -S /tmp/mysql_3406.sock -e"select MEMBER_HOST,MEMBER_ROLE from performance_schema.replication_group_members;"

#.2.定义主库信息
port="3406"
mysql_m="192.168.31.101"

#.3.在主库上创建专用账户,推荐使用 caching_sha2_password 插件
mysql -udba_admin -pcf_rB1NKCzbaQuPH -h $mysql_m -P $port -e"DROP USER IF EXISTS 'dba_router'@'192.168.31.%';"
mysql -udba_admin -pcf_rB1NKCzbaQuPH -h $mysql_m -P $port -e"CREATE USER IF NOT EXISTS 'dba_router'@'192.168.31.%' IDENTIFIED with caching_sha2_password BY 'Admin_147';"
mysql -udba_admin -pcf_rB1NKCzbaQuPH -h $mysql_m -P $port -e"GRANT ALL PRIVILEGES ON *.* TO 'dba_router'@'192.168.31.%' WITH GRANT OPTION;"
mysql -udba_admin -pcf_rB1NKCzbaQuPH -h $mysql_m -P $port -e"FLUSH PRIVILEGES;"
mysql -udba_admin -pcf_rB1NKCzbaQuPH -h $mysql_m -P $port -e"select user,host,plugin,account_locked from mysql.user;"
  • 第9步,应用节点:登录应用服务器(示例 192.168.31.104),下载安装 mysql-router 8.0.46

注:安装过程会创建 mysqlrouter 用户并注册 mysqlrouter 服务

#.下载解压
cd /opt/
wget -c https://cdn.mysql.com//Downloads/MySQL-Router/mysql-router-community_8.0.46-1ubuntu24.04_amd64.deb
apt install ./mysql-router-community_8.0.46-1ubuntu24.04_amd64.deb

#.查看版本
mysqlrouter --version
  • 第10步,应用节点:使用 mysqlrouter --bootstrap 初始化 MySQL Router
#.参数 --user=mysqlrouter 让进程以 mysqlrouter 身份运行
mysqlrouter --bootstrap dba_router@192.168.31.101:3406 --user=mysqlrouter --force
  • 第11步,应用节点:启动 MySQL Router
#.启动服务
systemctl restart mysqlrouter
systemctl status mysqlrouter

#.确认端口已监听
root@ubuntu:/opt# netstat -lnpt | grep mysqlrouter
tcp        0      0 0.0.0.0:8443        0.0.0.0:*       LISTEN      2201/mysqlrouter
tcp        0      0 0.0.0.0:6446        0.0.0.0:*       LISTEN      2201/mysqlrouter
tcp        0      0 0.0.0.0:6447        0.0.0.0:*       LISTEN      2201/mysqlrouter
tcp        0      0 0.0.0.0:6448        0.0.0.0:*       LISTEN      2201/mysqlrouter
tcp        0      0 0.0.0.0:6449        0.0.0.0:*       LISTEN      2201/mysqlrouter

#.查看日志
tail -100 /var/log/mysqlrouter/mysqlrouter.log
  • 第12步,应用节点:测试连接 MySQL Router,默认 6446 / 6447 分别作为 读写端口 / 只读端口
#.安装 mysql-client
apt -y update
apt -y install mysql-client-core-8.0

#.测试RW读写端口, 会访问到后端 InnoDB Cluster 的 PRIMARY
root@ubuntu:~# mysql -udba_router -pAdmin_147 -h192.168.31.104 -P6446 -e"select @@hostname"
+------------+
| @@hostname |
+------------+
| mgr101     |
+------------+

#.测试RW只读端口, 会访问到后端 InnoDB Cluster 的 SECONDARY
root@ubuntu:~# mysql -udba_router -pAdmin_147 -h192.168.31.104 -P6447 -e"select @@hostname"
+------------+
| @@hostname |
+------------+
| mgr102     |
+------------+

#.测试RW只读端口, 验证读负载均衡
root@ubuntu:~# for ((i=1;i<=6;i++));do mysql -h192.168.31.104 -udba_router -pAdmin_147 -P6447 -e"select @@hostname;" --skip-column-names 2>/dev/null; done
+--------+
| mgr103 |
+--------+
+--------+
| mgr102 |
+--------+
+--------+
| mgr103 |
+--------+
+--------+
| mgr102 |
+--------+
+--------+
| mgr103 |
+--------+
+--------+
| mgr102 |
+--------+

附:查看 mysqlrouter 的部分核心配置

root@ubuntu:~# cat /etc/mysqlrouter/mysqlrouter.conf
[metadata_cache:bootstrap]
cluster_type=gr
user=mysql_router1_x64z503
metadata_cluster=mgr_cluster

[routing:bootstrap_rw]
bind_port=6446
destinations=metadata-cache://mgr_cluster/?role=PRIMARY
routing_strategy=first-available

[routing:bootstrap_ro]
bind_port=6447
destinations=metadata-cache://mgr_cluster/?role=SECONDARY
routing_strategy=round-robin-with-fallback

[routing:bootstrap_x_rw]
bind_port=6448
destinations=metadata-cache://mgr_cluster/?role=PRIMARY
routing_strategy=first-available

[routing:bootstrap_x_ro]
bind_port=6449
destinations=metadata-cache://mgr_cluster/?role=SECONDARY
routing_strategy=round-robin-with-fallback

[http_server]
port=8443
ssl=1
ssl_cert=/var/lib/mysqlrouter/router-cert.pem
ssl_key=/var/lib/mysqlrouter/router-key.pem

#...其他省略...

附:查看此时 mysql 的账号清单

[root@mgr101 opt]# mysql -udba_admin -pcf_rB1NKCzbaQuPH -S /tmp/mysql_3406.sock -e"select user,host,plugin,account_locked from mysql.user;"
+--------------------------------+--------------+-----------------------+----------------+
| user                           | host         | plugin                | account_locked |
+--------------------------------+--------------+-----------------------+----------------+
| dba_admin                      | %            | mysql_native_password | N              |
| dba_repl                       | %            | mysql_native_password | N              |
| mysql_innodb_cluster_311013406 | %            | caching_sha2_password | N              |
| mysql_innodb_cluster_311023406 | %            | caching_sha2_password | N              |
| mysql_innodb_cluster_311033406 | %            | caching_sha2_password | N              |
| mysql_router1_x64z503          | %            | caching_sha2_password | N              |
| dba_cluster                    | 192.168.31.% | caching_sha2_password | N              |
| dba_router                     | 192.168.31.% | caching_sha2_password | N              |
| mysql.infoschema               | localhost    | caching_sha2_password | Y              |
| mysql.session                  | localhost    | caching_sha2_password | Y              |
| mysql.sys                      | localhost    | caching_sha2_password | Y              |
| root                           | localhost    | caching_sha2_password | N              |
+--------------------------------+--------------+-----------------------+----------------+

灾难演练

模拟主库宕机

  • 第1步,[节点3]:查集群状态,当前主节点为节点1
[root@mgr103 ~]# mysql -udba_admin -pcf_rB1NKCzbaQuPH -S /tmp/mysql_3406.sock
mysql> select MEMBER_HOST,MEMBER_PORT,MEMBER_STATE,MEMBER_ROLE from performance_schema.replication_group_members;
+----------------+-------------+--------------+-------------+
| MEMBER_HOST    | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE |
+----------------+-------------+--------------+-------------+
| 192.168.31.101 |        3406 | ONLINE       | PRIMARY     |
| 192.168.31.102 |        3406 | ONLINE       | SECONDARY   |
| 192.168.31.103 |        3406 | ONLINE       | SECONDARY   |
+----------------+-------------+--------------+-------------+
  • 第2步,[节点1]:停掉宕机主节点的mysql服务,模拟主节点宕机,此时会触发重新选举
[root@mgr101 ~]# mysqladmin -udba_admin -pcf_rB1NKCzbaQuPH -S /tmp/mysql_3406.sock shutdown
  • 第3步,[节点3]:查看集群状态,集群无宕机节点1、当前主库为节点2(节点1/2/3的权重依次为50/40/30)
[root@mgr103 ~]# mysql -udba_admin -pcf_rB1NKCzbaQuPH -S /tmp/mysql_3406.sock
mysql> select MEMBER_HOST,MEMBER_PORT,MEMBER_STATE,MEMBER_ROLE from performance_schema.replication_group_members;
+----------------+-------------+--------------+-------------+
| MEMBER_HOST    | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE |
+----------------+-------------+--------------+-------------+
| 192.168.31.102 |        3406 | ONLINE       | PRIMARY     |
| 192.168.31.103 |        3406 | ONLINE       | SECONDARY   |
+----------------+-------------+--------------+-------------+
  • 第4步,[mysqlsh节点]:查看 mgr_cluster 集群状态

注:由于节点 mgr101 已宕机,登录该节点会报错,需要改为新的主节点 mgr102

[root@mgr102 ~]# mysqlsh --uri dba_cluster@192.168.31.101:3406 --password=Admin_147 --js
MySQL Error 2003 (HY000): Can't connect to MySQL server on '192.168.31.101:3406' (111)

[root@mgr102 ~]# mysqlsh --uri dba_cluster@192.168.31.102:3406 --password=Admin_147 --js
 MySQL  JS > var cluster = dba.getCluster('mgr_cluster')
 MySQL  JS > cluster.status()
{
    "clusterName": "mgr_cluster", 
    "defaultReplicaSet": {
        "name": "default", 
        "primary": "192.168.31.102:3406", 
        "ssl": "REQUIRED", 
        "status": "OK_NO_TOLERANCE_PARTIAL", 
        "statusText": "Cluster is NOT tolerant to any failures. 1 member is not active.", 
        "topology": {
            "192.168.31.101:3406": {
                "address": "192.168.31.101:3406", 
                "memberRole": "SECONDARY", 
                "mode": "n/a", 
                "readReplicas": {}, 
                "role": "HA", 
                "shellConnectError": "MySQL Error 2003: Could not open connection to '192.168.31.101:3406': Can't connect to MySQL server on '192.168.31.101:3406' (111)", 
                "status": "(MISSING)"
            }, 
            "192.168.31.102:3406": {
                "address": "192.168.31.102:3406", 
                "memberRole": "PRIMARY", 
                "mode": "R/W", 
                "readReplicas": {}, 
                "replicationLag": "applier_queue_applied", 
                "role": "HA", 
                "status": "ONLINE", 
                "version": "8.0.32"
            }, 
            "192.168.31.103:3406": {
                "address": "192.168.31.103:3406", 
                "memberRole": "SECONDARY", 
                "mode": "R/O", 
                "readReplicas": {}, 
                "replicationLag": "applier_queue_applied", 
                "role": "HA", 
                "status": "ONLINE", 
                "version": "8.0.32"
            }
        }, 
        "topologyMode": "Single-Primary"
    }, 
    "groupInformationSourceMember": "192.168.31.102:3406"
}
 MySQL  JS > \q
Bye!
  • 第5步,应用节点:测试连接 MySQL Router,确认 RW 读写端口为 mgr102、RW 只读端口只有 mgr103
#.测试RW读写端口, 会自动去连接新的 PRIMARY
root@ubuntu:~# mysql -udba_router -pAdmin_147 -h192.168.31.104 -P6446 -e"select @@hostname"
+------------+
| @@hostname |
+------------+
| mgr102     |
+------------+

#.测试RW只读端口, 只会转发到正常的 SECONDARY 节点
root@ubuntu:~# for ((i=1;i<=6;i++));do mysql -h192.168.31.104 -udba_router -pAdmin_147 -P6447 -e"select @@hostname;" --skip-column-names 2>/dev/null; done
+--------+
| mgr103 |
+--------+
+--------+
| mgr103 |
+--------+
+--------+
| mgr103 |
+--------+
+--------+
| mgr103 |
+--------+
+--------+
| mgr103 |
+--------+
+--------+
| mgr103 |
+--------+
  • 第6步,[节点1]:启动该节点的 mysql 服务,由于配置了“不自动启用组复制”,所以此时主节点仍为节点1,集群状态同第3步一样(省略...)
[root@mgr101 ~]# /opt/mysql/bin/mysqld_safe --defaults-file=/data/mysql_3406/my_3406.cnf &

[root@mgr101 ~]# cat /data/mysql_3406/my_3406.cnf | egrep "(start_on_boot|bootstrap_group)"
loose-group_replication_start_on_boot=off
loose-group_replication_bootstrap_group=off
  • 第7步,[节点1]:执行 START GROUP_REPLICATION; 将宕机节点重新加入集群,不会触发选举
[root@mgr101 ~]# mysql -udba_admin -pcf_rB1NKCzbaQuPH -S /tmp/mysql_3406.sock -e"START GROUP_REPLICATION;"
  • 第8步,[节点3]:查看集群状态,所有节点online、当前主库仍为节点2
[root@mgr103 ~]# mysql -udba_admin -pcf_rB1NKCzbaQuPH -S /tmp/mysql_3406.sock
mysql> select MEMBER_HOST,MEMBER_PORT,MEMBER_STATE,MEMBER_ROLE from performance_schema.replication_group_members;
+----------------+-------------+--------------+-------------+
| MEMBER_HOST    | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE |
+----------------+-------------+--------------+-------------+
| 192.168.31.101 |        3406 | ONLINE       | SECONDARY   |
| 192.168.31.102 |        3406 | ONLINE       | PRIMARY     |
| 192.168.31.103 |        3406 | ONLINE       | SECONDARY   |
+----------------+-------------+--------------+-------------+
  • 第9步,应用节点:测试连接 MySQL Router,确认 RW 读写端口为 mgr102、RW 只读端口 mgr103、mgr101
#.测试RW读写端口, 查看连接的是否为 PRIMARY
root@ubuntu:~# mysql -udba_router -pAdmin_147 -h192.168.31.104 -P6446 -e"select @@hostname"
+------------+
| @@hostname |
+------------+
| mgr102     |
+------------+

#.测试RW只读端口, 验证读负载均衡
root@ubuntu:~# for ((i=1;i<=6;i++));do mysql -h192.168.31.104 -udba_router -pAdmin_147 -P6447 -e"select @@hostname;" --skip-column-names 2>/dev/null; done
+--------+
| mgr101 |
+--------+
+--------+
| mgr103 |
+--------+
+--------+
| mgr101 |
+--------+
+--------+
| mgr103 |
+--------+
+--------+
| mgr101 |
+--------+
+--------+
| mgr103 |
+--------+

附录

  • 1、如果要启用读写分离,应用程序通过 6446 / 6447 端口 进行连接
#.写请求 → 6446 → 自动到主库
mysql -udba_router -pAdmin_147 -h192.168.31.104 -P6446

#.读请求 → 6447 → 自动到2台从库(轮询)
mysql -udba_router -pAdmin_147 -h192.168.31.104 -P6447
  • 2、MySQL Router 8.0.46 疑似不支持 --directory 自定义配置,示例 /data 非挂载设备、亦非NFS共享,却一直报权限问题,未解决...
root@ubuntu:~# userdel -r mysqlrouter
root@ubuntu:~# useradd -r -s /sbin/nologin mysqlrouter
root@ubuntu:~# mkdir -p /data/mysqlrouter
root@ubuntu:~# chown -R mysqlrouter:mysqlrouter /data/mysqlrouter
root@ubuntu:~# chmod 777 /data/mysqlrouter
root@ubuntu:~# mysqlrouter --bootstrap dba_router@192.168.31.101:3406 --directory /data/mysqlrouter --user=mysqlrouter --force
Please enter MySQL password for dba_router: 
Error: Can't set ownership of file '/data/mysqlrouter' to the user 'mysqlrouter'. error: Permission denied. 
One possible reason can be that the root user does not have proper rights because of root_squash on the NFS share.
Copyright © www.sqlfans.cn 2021 - 2026 All Right Reserved更新时间: 2026-07-14 10:43:52

results matching ""

    No results matching ""