简介

MySQL Router是处于应用client和dbserver之间的轻量级代理程序,它能检测,分析和转发查询到后端数据库实例,并把结果返回给client,是mysql-proxy的一个替代品
Router可以实现读写分离,程序不是直接连接数据库IP,而是固定连接到mysql router,MySQL Router对前端应用是透明的,应用程序把MySQL Router当作是普通的mysql实例,把查询发给MySQL Router,而MySQL Router会把查询结果返回给前端的应用程序
当从数据库服务器故障时,业务也可以正常运行,MySQL Router可实现自动下线不可用服务器,程序配置不需要任何修改
若主数据库发生故障,由MySQL Router来决定主从自动切换,业务同样可以正常访问,程序配置不需要做任何修改
读写分离(Read/Write Splitting)
让一部分数据库服务器处理事务性增、改、删操作(INSERT、UPDATE、DELETE),另一部分数据库服务器处理SELECT查询操作

前期准备

准备四台Centos7虚拟机,配置IP地址和hostname,关闭selinux和防火墙,同步系统时间,修改IP地址和hostname映射

ip hostname 部署服务
192.168.29.132 master mysql
192.168.29.138 bak1 mysql
192.168.29.131 bak2 mysql
192.168.29.133 mid mysql mysql-router

四台虚拟机部署mysql服务

[root@master ~]# yum install mysql-server mysql -y
[root@bak1~]# yum install mysql-server mysql -y
[root@bak2~]# yum install mysql-server mysql -y
[root@mid ~]# yum install mysql-server mysql -y

mid结点部署mysql-router
从官网下载rpm包

[root@mid ~]# yum localinstall mysql-router-community-8.0.21-1.el7.x86_64.rpm -y

master结点和两个bak结点配置主从复制
详细配置步骤可参考:https://blog.51cto.com/14832653/2500735
启动MySQL服务

[root@master ~]# systemctl start mysqld
[root@bak1~]# systemctl start mysqld
[root@bak2~]# systemctl start mysqld
[root@mid ~]# systemctl start mysqld

配置mysql-router

[root@mid ~]# vi /etc/mysqlrouter/mysqlrouter.conf
#添加高可用标签,配置master结点为写结点
[routing:failover]
bind_address = 0.0.0.0
bind_port = 7001
max_connections = 1024
mode = read-write
#实际MySQL地址
destinations = 192.168.29.132:3306

#轮询标签,从库进行负载均衡的轮询访问
[routing:balancing]
bind_address = 0.0.0.0
bind_port = 7002
max_connections = 1024
mode = read-only
#实际MySQL地址
destinations = 192.168.29.138:3306,192.168.29.131:3306

启动服务

[root@mid ~]# systemctl start mysqlrouter.service

测试验证

查看服务情况

[root@mid ~]# netstat -tnlp |grep mysql
tcp        0      0 0.0.0.0:7001            0.0.0.0:*               LISTEN      32715/mysqlrouter   
tcp        0      0 0.0.0.0:7002            0.0.0.0:*               LISTEN      32715/mysqlrouter   

测试连接主库

[root@mid ~]# mysql -u root -h 192.168.29.133 -p -P 7001
#master结点查看连接情况
mysql>select SUBSTRING_INDEX(host,':',1) as ip , count(*) from information_schema.processlist group by ip;
+-----------+----------+
| ip        | count(*) |
+-----------+----------+
| mid       |        1 |
+-----------+----------+

测试从库负载均衡

[root@mid ~]# mysql -u root -h 192.168.29.133 -p -P 7002
#bak1结点查看情况
mysql>select SUBSTRING_INDEX(host,':',1) as ip , count(*) from information_schema.processlist group by ip;
+-----------+----------+
| ip        | count(*) |
+-----------+----------+
| mid       |        1 |
+-----------+----------+

#再次连接
[root@mid ~]# mysql -u root -h 192.168.29.133 -p -P 7002
#bak2结点查看情况
mysql>select SUBSTRING_INDEX(host,':',1) as ip , count(*) from information_schema.processlist group by ip;
+-----------+----------+
| ip        | count(*) |
+-----------+----------+
| mid       |        1 |
+-----------+----------+