MaxScale实现MySQL读写分离以及读负载均衡
一、环境准备
1.准备四台机器,IP分别是:
IP | 配置 |
---|---|
192.168.1.50 | 主服务器 |
192.168.1.51 | 从服务器 |
192.168.1.52 | 从服务器 |
192.168.1.57 | MaxScale代理服务器 |
其中50、51、52配置成MySQL一主多从结构,50为主,51和52为从,57配置成MaxScale代理服务器
二、配置一主多从
1.配置主服务器192.168.1.50
]# vim /etc/my.cnf
[mysqld]
server_id=50 //指定服务器ID号
log-bin=master50 //启用binlog日志,并指定文件名前缀
…
]# systemctl restart mysqld
2.主服务器添加授权用户,并查看bInlog日志信息
]# mysql -uroot -p123456
mysql> grant all on *.* to repluser@’%’ identified by ‘123456’;
mysql> show master status;
3.配置从服务器192.168.1.51
]# vim /etc/my.cnf
[mysqld]
server_id=51 //设置从服务器ID号
]# systemctl restart mysqld
4.配置从服务器192.168.1.51,指定主服务器信息,日志文件,偏移位置(参考Master上的状态输出),配置完后查看I/O线程和SQL线程是否是YES状态
]# mysql -uroot -p123456
mysql> change master to master_host=‘192.168.1.50’,master_user=‘repluser’,master_password=‘123456’,master_log_file=‘master50.000001’,master_log_pos=154;
mysql> start slave;
mysql> show slave status\G;
5.配置从服务器192.168.1.52
]# vim /etc/my.cnf
[mysqld]
server_id=52 //设置从服务器ID号
]# systemctl restart mysqld
6.配置从服务器192.168.1.51,指定主服务器信息,日志文件,偏移位置(参考Master上的状态输出),配置完后查看I/O线程和SQL线程是否是YES状态
]# mysql -uroot -p123456
mysql> change master to master_host=‘192.168.1.50’,master_user=‘repluser’,master_password=‘123456’,master_log_file=‘master50.000001’,master_log_pos=154;
mysql> start slave;
mysql> show slave status\G;
三、配置MaxScale代理服务器
maxscale下载地址:https://downloads.mariadb.com/MaxScale/
1.环境准备,关闭192.168.1.57的防火墙和SELinux,保证yum源可以正常使用,安装maxscale软件
]# rpm -ivh maxscale-2.1.2-1.rhel.7.x86_64.rpm
2.修改192.168.1.57 maxscale服务的主配置文件
]# vim /etc/maxscale.cnf
[maxscale]
threads=auto //运行的线程的数量
[server1] //定义数据库服务器
type=server
address=192.168.1.50 //主服务器IP
port=3306
protocol=MySQLBackend
[server2]
type=server
address=192.168.1.51 //从服务器IP
port=3306
protocol=MySQLBackend
[server3]
type=server
address=192.168.1.52 //从服务器IP
port=3306
protocol=MySQLBackend
[MySQL Monitor] //定义监控的数据库服务器
type=monitor
module=mysqlmon
servers=server1,server2,server3 //监控的数据库列表,切记不能写IP
user=maxscalemon //监控用户
passwd=123qqq…A //监控用户的密码
monitor_interval=10000
[Read-Only Service] //定义只读服务,用于读的负载均衡
type=service
router=readconnroute
servers=server1,server2,server3
user=maxscalerouter
passwd=123qqq…A
router_options=slave
[Read-Write Service] //定义读写分离服务
type=service
router=readwritesplit
servers=server1,server2,server3
user=maxscalerouter //路由用户
passwd=123qqq…A //路由用户密码
max_slave_connections=100%
[MaxAdmin Service] //定义管理服务
type=service
router=cli
[Read-Only Listener] //定义只读服务使用的端口号
type=listener
service=Read-Only Service
protocol=MySQLClient
port=4008
[Read-Write Listener] //定义读写服务使用的端口号
type=listener
service=Read-Write Service
protocol=MySQLClient
port=4006
[MaxAdmin Listener] //管理服务使用的端口号
type=listener
service=MaxAdmin Service
protocol=maxscaled
socket=default
port=4016 //手动添加,不指定时使用的是默认端口在启动服务以后可以知道默认端口是多少
3.在主服务器192.168.1.50上添加授权用户,根据maxscale.cnf文件配置,在主/从服务器上添加对应的授权用户,因为3台数据库服务器是一主多从同步结构,只在主数据库服务器添加用户即可,从服务器会自动同步
mysql> grant replication slave,replication client on . to maxscalemon@’%’ identified by ‘123qqq…A’; //授权监控用户
mysql> grant select on mysql.* to maxscalerouter@"%" identified by ‘123qqq…A’; //授权路由用户
4.查看授权用户,分别在50、51、52三台服务器上查看授权用户
mysql> select user,host from mysql.user where user like ‘maxscale%’;
5.在代理服务器57主机上测试授权用户
]# yum -y install mariadb //安装提供mysql命令的软件包
]# mysql -h 192.168.4.50 -umaxscalemon -p123qqq…A
]# mysql -h 192.168.4.51 -umaxscalemon -p123qqq…A
]# mysql -h 192.168.4.52 -umaxscalemon -p123qqq…A
]# mysql -h 192.168.4.50 -umaxscalerouter -p123qqq…A
]# mysql -h 192.168.4.51 -umaxscalerouter -p123qqq…A
]# mysql -h 192.168.4.52 -umaxscalerouter -p123qqq…A
6.在客户端上访问57主机测试read-only和read-write授权用户
]# mysql -umaxscalemon -p123qqq…A -P4006 -h192.168.1.57
]# mysql -umaxscalerouter -p123qqq…A -P4006 -h192.168.1.57
]# mysql -umaxscalemon -p123qqq…A -P4008 -h192.168.1.57
]# mysql -umaxscalerouter -p123qqq…A -P4008 -h192.168.1.57
7.启动maxscale代理服务器
]# maxscale -f /etc/maxscale.cnf
]# ps -C maxscale //查看进程
]# netstat -antup | grep :4006 //查看读写分离端口
]# netstat -antup | grep :4016 //查看管理服务端口
]# netstat -antup | grep :4008 //查看读服务负载均衡端口
四、测试从库读操作的负载均衡配置,也就是测试Maxscale的负载均衡功能
1.在50、51、52上分别访问测试,注意测试时需要访问read-only的4008端口,查看结果是否轮询,如果轮询,则完成负载均衡的配置
]# mysql -umaxscalerouter -h192.168.1.57 -p123qqq…A -P4008 -e “select @@hostname”
五、测试Maxscale的高可用功能
前面已经介绍了 MaxScale可以实现MySQL的读写分离和读负载均衡,那么当 slave 出现故障后,MaxScale 会如何处理呢?
例如有 3 台数据库服务器,一主二从的结构,数据库名称分别为 master, slave1, slave2。
现在我们实验以下两种情况:
(1)当一台从服务器( slave1 或者 slave2 )出现故障后,查看 MaxScale 如何应对,及故障服务器重新上线后的情况
(2)当两台从服务器( slave1 和 slave2 )都出现故障后,查看 MaxScale 如何应对,及故障服务器重新上线后的情况
1.单个slave故障后会发生什么情况?
停掉51上的slave服务
mysql> stop slave;
停掉51主机上的slave服务后,稍等一会再使用客户端链接57主机进行高可用测试,进行多次请求,可以看到, 在有 slave 故障后,MaxScale 会自动进行排除,不再向其转发请求,这个时候所有的请求全部转发至52主机,实现了高可用
]# mysql -umaxscalerouter -h192.168.1.57 -p123qqq…A -P4008 -e “select @@hostname”
2.再次启动51的slave进程,会发生什么情况?
再次启动51的slave进程后,再去用客户端链接测试时,可以看到,在部分 slave 发生故障时,MaxScale 可以自动识别出来,并移除路由列表,当故障恢复重新上线后,MaxScale 也能自动将其加入路由,过程透明,所以这个时候51和52之间再次实现了读请求的负载均衡功能
mysql> start slave;
]# mysql -umaxscalerouter -h192.168.1.57 -p123qqq…A -P4008 -e “select @@hostname”
3.当全部 slave 故障后的情况是怎样的呢?
当全部 slave 故障后,分别登陆 slave1 和 slave2 的MySQL,执行停止slave进程的命令
mysql> stop slave; //51上执行
mysql> stop slave; //52上执行
这个时候会导致slave和master所有主机都无法访问,怎么办呢?
我们需要将2个从的slave进程先起来,在maxscale主机的配置文件中添加一行新的配置
]# vim /etc/maxscale.cnf
[MySQL Monitor]
…
detect_stale_master=true
上面这行配置的意思是,当所有slave节点都故障后,自动将读请求转移至master主服务器,这个时候主服务器既做写操作也做读操作,配置完后,我们需要将服务重启
]# killall -9 maxscale
]# maxscale -f /etc/maxscale.cnf //重启服务,重载配置
服务重启完之后,这个时候再将51和52主机的slave进程全部停掉,再用客户端去链接访问,会发现依然能够访问,但所有的读操作都转移给了master主服务器,保证了数据库的高可用性
mysql> stop slave; //51上操作
mysql> stop slave; //52上操作
]# mysql -umaxscalerouter -h192.168.1.57 -p123qqq…A -P4008 -e “select @@hostname” //使用客户端链接测试
4.如果再将2台slave主机的进程再次启动后又是什么情况呢?
这个时候我们再将51和52主机的slave进程启动,maxscale会自动检测,检测完之后,再使用客户端进行链接测试,会发现读请求再次转移至51和52,并且是负载均衡,完成了自动恢复
mysql> start slave; //51上操作
mysql> start slave; //52上操作
]# mysql -umaxscalerouter -h192.168.1.57 -p123qqq…A -P4008 -e “select @@hostname” //使用客户端链接测试
总结
通过测试发现maxscale是拥有高可用和负载均衡的作用的,在部分 slave 故障情况下,对于客户端是完全透明的,当全部 slave 故障时,经过简单的配置,MaxScale 也可以很好地处理