本文仅供参考,亦有参考其他作者的文档及官方文档,在此一并致谢。
一、环境及软件:VMware,CenOS7.3,mysql 8.0,mysql-router 8.0
测试组合:
mysql-router 8.0+MGR单主集群
-------------------------------------
写在前面的总结:
1、MGR单主模式,不太合适,因为MGR单主模式下主库failover之后,下一个主库是投票出来的,不知道漂去哪里,VIP+keepalived的方式没用;
2、mysql-router配置文件里写的read-write的主机,只要前一个能用,后一个就不会被用(“首个可用”算法);
3、MGR单主模式下,主以外其他的机器都是read-only,一旦主机发生failover,其他的库无法通过代理写入;
4、mysql-router需要分别给写端(read-write)和读端(read-only)绑定不同的端口(本文是7001和7002),这可能,可能需要应用端来做读写分离,相比之下Atlas代理则无需绑定端口;
所以,Mysql-router适合的模式应该是:普通的主从集群,多个主库互为主从且互相之间有VIP,或者传统的MHA集群等。
--------------------------------------
二、对mysql-router的一些说明:
读写分离:read-write模式:采用“首个可用”算法,优先使用第一个server,当第一个server不可达时,将会Failover到第二个server,依次进行。如果都不可达,那么请求将会被中断,且此时Router将不可用。
负载均衡:read-only模式
Mysql-router可以实现对不同的后端数据进行数据负载均衡,read-only模式将采用“轮询”算法,依次选择server新建连接,如果某个Server不可达,将会重试下一个Server,如果所有的Server都不可达,那么此端口上的请求将中断,即READ操作将不可用。同时Router将会持续与每个Server保持心跳探测,当恢复后重新加入Active列表,此后那些新建的连接请求可以分发给此Server。
三、配置与测试过程
各服务器的主机名、IP、角色分配:
mysql-router:192.168.1.99
mgr1:192.168.1.88:3308 Primary
mgr2:192.168.1.89:3308 Secondary
mgr3:192.168.1.90:3308 Secondary
1、下载安装:
cd /soft
wget https://dev.mysql.com/get/Downloads/MySQL-Router/mysql-router-8.0.11-linux-glibc2.12-x86-64bit.tar.gz
tar -zxvf mysql-router-8.0.11-linux-glibc2.12-x86-64bit.tar.gz
cp -rf mysql-router-2.1.4-linux-glibc2.12-x86-64bit /usr/local/mysql-router
mkdir /usr/local/mysql-router/conf/
2、编辑配置文件:
vim /usr/local/mysql-router/conf/mysqlrouter.ini
---------
[DEFAULT]
logging_folder=/usr/local/mysql-router/log
runtime_folder=/usr/local/mysql-router/run
data_folder=/usr/local/mysql-router/data
connect_timeout=30
read_timeout=30
[logger]
level = INFO
[routing:failover]
bind_address = 0.0.0.0
bind_port = 7001 #端口7001
max_connections = 1024
mode = read-write
destinations = 192.168.1.88:3308,192.168.1.89:3308 #可用的支持写操作的主库,或者主库共用的VIP
[routing:balancing]
bind_address = 0.0.0.0
bind_port = 7002 #端口7002
max_connections = 1024
mode = read-only
destinations = 192.168.1.89:3308,192.168.1.90:3308 #参与读负载均衡的从库们
---------
改一下环境变量:
echo "export PATH=$PATH:/usr/local/mysql-router/bin/" >> /etc/profile
source /etc/profile
验证安装配置是否成功:
mysqlrouter -V
MySQL Router v8.0.11 on Linux (64-bit) (GPL community edition)
chown -R mysql: /usr/local/mysql-router
3、启动
systemctl start mysqlrouter.service或者直接使用下面语句:
/usr/local/mysql-router/bin/mysqlrouter -c /usr/local/mysql-router/conf/mysqlrouter.ini &
netstat -ntpl|grep mysqlrouter可以看到7001和7002端口已经被使用;
4、登录测试及负载均衡测试:
数据库里创建账号并授权允许远程登录,此处使用aaa用户
先测试写端口7001:
mysql -uaaa -paaa-h 192.168.1.99 -P 7001 -e "select @@hostname"
mgr1,因为写的话read-write里面的两个主机,首先访问第一个,只有第一个故障才会访问第二个;
再测试读:
mysql -umonitor -pmonitor -h 192.168.1.99 -P 7002 -e "select @@hostname"
轮询显示mgr1和mgr2。
5、fail-over测试,
(1)、从库failover:重新拉起后可以自动加入轮询;
mgr2上执行pkill mysql
mysql -umonitor -pmonitor -h 192.168.1.99 -P 7002 -e "select @@hostname"
只得到mgr3
重启mgr2上的mysql再次执行
mysql -umonitor -pmonitor -h 192.168.1.99 -P 7002 -e "select @@hostname"
可轮询。
(2)、主库failover
mgr1上pkill mysql
mysql -umonitor -pmonitor -h 192.168.1.99 -P 7001 -e "select @@hostname"
得到mgr2,但是如果执行:
mysql -umonitor -pmonitor -h 192.168.1.99 -P 7001 -e "create database xxxx"
就会报错:The MySQL server is running with the --super-read-only option so it cannot execute this statement
说明备份主库不能是read-only,否则主库切换之后会报错,MGR单主模式不行。
四、官方配置文件如下供参考
# File automatically generated during MySQL Router bootstrap
[DEFAULT]
logging_folder=/opt/routers/myrouter/log
runtime_folder=/opt/routers/myrouter/run
data_folder=/opt/routers/myrouter/data
keyring_path=/opt/routers/router/data/keyring
master_key_path=/opt/routers/myrouter/mysqlrouter.key
connect_timeout=30
read_timeout=30
[logger]
level = INFO
[metadata_cache:mycluster]
router_id=5
bootstrap_server_addresses=mysql://localhost:3310,mysql://localhost:3320,mysql://localhost:3330
user=mysql_router5_6owf3spq1c6n
metadata_cluster=mycluster
ttl=5
[routing:mycluster_default_rw]
bind_address=0.0.0.0
bind_port=6446
destinations=metadata-cache://mycluster/default?role=PRIMARY
routing_strategy=round-robin
protocol=classic
[routing:mycluster_default_ro]
bind_address=0.0.0.0
bind_port=6447
destinations=metadata-cache://mycluster/default?role=SECONDARY
routing_strategy=round-robin
protocol=classic
[routing:mycluster_default_x_rw]
bind_address=0.0.0.0
bind_port=64460
destinations=metadata-cache://mycluster/default?role=PRIMARY
routing_strategy=round-robin
protocol=x
[routing:mycluster_default_x_ro]
bind_address=0.0.0.0
bind_port=64470
destinations=metadata-cache://mycluster/default?role=SECONDARY
routing_strategy=round-robin
protocol=x