MYSQL 读写分离
基于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