读写分离其实就是将数据库分为了主从库,一个主库用于写数据,多个从库完成读数据的操作,主从库之间通过某种机制进行数据的同步,是一种常见的数据库架构。使用读写分离可以大大降低数据库服务器的负载。
1.在server1和server2两台主机做好gtid的主从复制
如何做gtid主从复制点击这里
2.在server3上安装mysql-proxy
[root@server3 ~]# tar zxf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz -C /usr/local
[root@server3 ~]# cd /usr/local/
[root@server3 local]# ls
bin include libexec share
etc lib mysql-proxy-0.8.5-linux-el6-x86-64bit src
games lib64 sbin
[root@server3 local]# ln -s mysql-proxy-0.8.5-linux-el6-x86-64bit/ mysql-proxy ##制作软链接
3.创建conf目录,新建配置文件
server3:
[root@server3 local]# cd mysql-proxy
[root@server3 mysql-proxy]# mkdir conf
[root@server3 mysql-proxy]# cd conf/
[root@server3 conf]# vim mysql-proxy.conf
1 [mysql-proxy]
2 proxy-address=0.0.0.0:3306
3 proxy-read-only-backend-addresses=172.25.80.2:3306 ##指定slave只读数据
4 proxy-backend-addresses=172.25.80.1:3306 #指定后端主master写入数据
5 proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua #指定读写分离配置文件的位置
6 pid-file=/usr/local/mysql-proxy/log/mysql-proxy.pid
7 log-file=/usr/local/mysql-proxy/log/mysql-proxy.log
8 plugins=proxy
9 log-level=debug #定义log日志级别,由高到低分别有(error|warning|info|message|debug)
10 keepalive=true #mysql-proxy崩溃时,尝试重启
11 daemon=true #以守护进程方式运行
[root@server3 conf]# chmod 660 /usr/local/mysql-proxy/conf/mysql-proxy.conf
4.设置最大最小连接数
[root@server3 conf]# vim /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
39 proxy.global.config.rwsplit = {
40 min_idle_connections = 1,
41 max_idle_connections = 2, #设置大于两个请求时启动读写分离
42
5.启动服务
[root@server3 conf]# /usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf
[root@server3 conf]# cat /usr/local/mysql-proxy/log/mysql-proxy.log
从日志中可以看到server3、server1和server2的数据库连接成功,这样数据库的读写分离就设置成功了
6.测试
登陆到server3的mysql,使连接数大于2
[root@foundation80 ~]# mysql -h 172.25.80.3 -urepl -pRedhat1.
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.24-log MySQL Community Server (GPL)
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]>
登陆成功,当连接后需要操作时,SQL语句并不直接进入到master数据库或者slave数据库,而是进入到 作为proxy的server3,然后proxy判断这条语句是有关写的语句(包括insert、update、delete)还 是读语句(select),写的操作会对master发出请求,数据会存入master的server1中,读数据时只是读取作为slave的server2,而master和slave是同步的,这样可以大大降低数据库的访问负载。
在server3上可以查看连接数:
[root@server3 conf]# lsof -i:3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysql-pro 1219 root 10u IPv4 24121 0t0 TCP *:mysql (LISTEN)
mysql-pro 1219 root 11u IPv4 24150 0t0 TCP server3:mysql->foundation.ilt.example.com:53528 (ESTABLISHED)
mysql-pro 1219 root 12u IPv4 24151 0t0 TCP server3:38840->server1:mysql (ESTABLISHED)
此时如果将server2的主从复制关掉,在远程连接的客户端写入数据,再进行查询时,会发现查询不到,这是因为master和slave无法同步,数据写入了master,读取只能在slave,slave上没有数据,当然读不到了。