基于mysql社区版5.7,使用软件:maxScale代理软件。
读写分流的好处在于当公司业务量达到一定量的时候,单机数据库实例负荷变得很大,如果在主从结构同步的结构基础上使用读写分离。将写操作分流到master节点实例,slave节点通过主从同步的设置也可以进行数据同步,将大量的查询操作转到slave从节点实例上。这样大大降低了主节点的负载,这样也提升了数据性能。
读写分离一般都有两种情况,第一种情况是来自软件开发的时候软件自己设计了读写分离的模式。第二种就是依靠软件来实现读写分离。maxScale就是通过解析SQL语句,实现了读写分离,应用程序不需要二次软件开发,大大降低了成本。
环境准备:maxScale:192.168.4.50 master1 192.168.4.53 slave1:192.168.4.54 slave2:192.168.4.55
- 首先检查备份环境是否主从是否正常
for i in 54 55 ;do ssh root@192.168.4.$i 'mysql -uroot -p1234 -e "show slave status \G" | grep IO_Running && mysql -uroot -p1234 -e "show slave status \G" | grep SQL_Running | head -1';done
看看应答,是正常的IO线程和SQL线程都是YES,那么54和55都是OK的了。
mysql: [Warning] Using a password on the command line interface can be insecure. Slave_IO_Running: Yes mysql: [Warning] Using a password on the command line interface can be insecure. Slave_SQL_Running: Yes mysql: [Warning] Using a password on the command line interface can be insecure. Slave_IO_Running: Yes mysql: [Warning] Using a password on the command line interface can be insecure. Slave_SQL_Running: Yes
- 在maxScale:192.168.4.50安装maxScale软件。
yum install -y maxscale-2.1.2-1.rhel.7.x86_64.rpm
- /etc/maxscale.cnf主配置文件详解:
[maxscale] threads=1 #定义线程个数,通常与CPU核心数一致,也可以指定auto让其自动配置 #定义了数据库实例,这里应该我要配置我主实例的配置 [server1] #实例1名字 type=server address=127.0.0.1 #实例IP地址 port=3306 #实例端口号 protocol=MySQLBackend #后端是mysql服务器 #定义监控的数据库节点 [MySQL Monitor] type=monitor module=mysqlmon #监控配置监控mysql servers=server1 #定义数据库的主机名 user=myuser #监控使用的用户名 passwd=mypwd #监控使用的密码(可以指定加密的密码,也可以不指定加密的密码) monitor_interval=10000 #监控间隔时间1秒 [Read-Write Service] #定义读写分离配置 type=service router=readwritesplit servers=server1 #上面设定的主从节点的名字[server1]... user=myuser #路由用户名 passwd=mypwd #路由用户密码 max_slave_connections=100% #所有的slave提供select查询服务 [MaxAdmin Service] #定义管理服务 type=service router=cli [Read-Write Listener] #定义读写分离服务器端口号 type=listener service=Read-Write Service protocol=MySQLClient #mysql服务器端 port=4006 #读写分离端口号(安全建议修改) [MaxAdmin Listener] #定义管理服务 type=listener service=MaxAdmin Service protocol=maxscaled socket=4099
创建好监控账号,创建好路由账号。
我的配置好的主配置文件。
grant replication slave on *.* to lqhmonitor@"192.168.4.%" identified by "1234"; # 复制slave授权监控用户lqhmonitor grant select on mysql.* to lqhroute@"192.168.4.%" identified by "1234"; # 授予mysql数据库的查询权限给lqhroute用户 grant all on *.* to lqh@"%" identified by "1234"; # 测试账号
[maxscale] threads=auto [server1] #添加后端数据库实例 server1主 server2从 server3从 type=server address=192.168.4.53 port=3306 protocol=MySQLBackend [server2] type=server address=192.168.4.54 port=3306 protocol=MySQLBackend [server3] type=server address=192.168.4.55 port=3306 protocol=MySQLBackend [MySQL Monitor] #将实例加入监控范围 type=monitor module=mysqlmon servers=server1,server2,server3 user=lqhmonitor passwd=1234 monitor_interval=10000 [Read-Write Service] #将实例加入读写分离服务 type=service router=readwritesplit servers=server1,server2,server3 user=lqhroute passwd=1234 max_slave_connections=100% [MaxAdmin Service] type=service router=cli [Read-Write Listener] #定义读写分离客户端类型和端口 type=listener service=Read-Write Service protocol=MySQLClient port=34006 [MaxAdmin Listener] #定义管理信息 type=listener service=MaxAdmin Service protocol=maxscaled socket=default port=34016
- 指定配置文件启动maxscale。
maxscale -f /etc/maxscale.cnf
- 查看当前maxscale状态(配置文件中最后一行定义管理信息端口)使用-P指定端口,默认密码mariadb。
maxadmin -uadmin -pmariadb -P34016
- 查看当前maxscale状态。
maxadmin -uadmin -pmariadb -P34016 MaxScale> list servers Servers. -------------------+-----------------+-------+-------------+-------------------- Server | Address | Port | Connections | Status -------------------+-----------------+-------+-------------+-------------------- server1 | 192.168.4.53 | 3306 | 0 | Master, Running server2 | 192.168.4.54 | 3306 | 0 | Slave, Running server3 | 192.168.4.55 | 3306 | 0 | Slave, Running -------------------+-----------------+-------+-------------+-------------------- MaxScale>
- 使用mysql客户端测试连接,连接的时候使用参数-h 指定主机名,否则就会自动使用socket进行连接就会报错,使用-P指定端口。
mysql -ulqh -p1234 -h192.168.4.50 -P34006
- 开两个终端,测试slave1查询和slave2查询是否正常切换。
952 [root@mysql55 mysql]# for i in {1..1000};do mysql -ulqh -p1234 -h192.168.4.50 -P34006 -e "show slave status \G" | grep Relay_Log_File ; done | grep 54 | wc -l #测试统计54从查询次数。 54 [root@localhost ~]# for i in {1..1000};do mysql -ulqh -p1234 -h192.168.4.50 -P34006 -e "show slave status \G" | grep Relay_Log_File ; done | grep 55 | wc -l #测试统计55查询次数。
- 分析可能是因为配置文件中,sever1 54指定的时候在前面,当连接数不够的时候就一直查询server1 54,我现在给他加上权重设置。
[server2] type=server address=192.168.4.54 port=3306 protocol=MySQLBackend serversize=8 [server3] type=server address=192.168.4.55 port=3306 protocol=MySQLBackend serversize=10
- 先干掉服务,然后重启服务进行测试。
maxscale -f /etc/maxscale.cnf maxadmin -uadmin -pmariadb -P34016 MaxScale> list servers Servers. -------------------+-----------------+-------+-------------+-------------------- Server | Address | Port | Connections | Status -------------------+-----------------+-------+-------------+-------------------- server1 | 192.168.4.53 | 3306 | 0 | Master, Running server2 | 192.168.4.54 | 3306 | 0 | Slave, Running server3 | 192.168.4.55 | 3306 | 0 | Slave, Running -------------------+-----------------+-------+-------------+-------------------- MaxScale>
- 测试结果54查询次数还是46849 55查询次数还是3246,基数够大了可能是并发不够,下次进行测试。
3246 [root@localhost ~]# for i in {1..50000};do mysql -ulqh -p1234 -h192.168.4.50 -P34006 -e "show slave status \G" | grep Relay_Log_File ; done | grep 55 | wc -l 46849 [root@mysql55 mysql]# for i in {1..50000};do mysql -ulqh -p1234 -h192.168.4.50 -P34006 -e "show slave status \G" | grep Relay_Log_File ; done | grep 54 | wc -l