MySQL读写分离是指让master处理写操作,让slave处理读操作,非常适用于读操作量比较大的场景,可减轻master的压力。
使用mysql-proxy实现mysql的读写分离,mysql-proxy实际上是作为后端mysql主从服务器的代理,它直接接受客户端的请求,对SQL语句进行分析,判断出是读操作还是写操作,然后分发至对应的mysql服务器上。
实验环境:
server1:主mysql
server2:从mysql
server3:mysql-proxy
首先我们需要配置一下主从复制,请查看之前的博客 mysql主从复制,配置完主从复制之后继续:
[root@server1 ~]# mysql -p
Enter password:
mysql> show master status;
mysql> mysql> grant select,insert,update on westos.* to www@'%' identified by 'Redhat-1'; ##给www用户对wests库远程登陆、读写、更新权限(一定不给删除)
[root@server2 ~]# mysql -p
Enter password:
mysql> show slave status\G
mysql> set global read_only=1; ##不写在文件中原因:怕主挂,它从变主
注:想实现读写分离,若后端服务器节点只有几个,可以不用proxy中间层调度,直接在后端服务器直接把谁读谁写配置好
1)下载安装包
https://downloads.mysql.com/archives/get/file/mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
2)配置
[root@server3 ~]# tar zxf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
[root@server3 ~]# mv mysql-proxy-0.8.5-linux-el6-x86-64bit /usr/local/
[root@server3 ~]# cd /usr/local/
[root@server3 local]# ln -s mysql-proxy-0.8.5-linux-el6-x86-64bit/ mysql-proxy ##为了方便建立连接,也可更名
[root@server3 local]# cd mysql-proxy
[root@server3 mysql-proxy]# mkdir conf ##主配置文件存放目录
[root@server3 mysql-proxy]# mkdir logs ##日志存放目录
[root@server3 mysql-proxy]# vim /usr/local/mysql-proxy/share/doc/mysql-proxyrw-splitting.lua ##读写分离策略脚本
[root@server3 mysql-proxy]# cd conf
[root@server3 mysql-proxy]# /usr/local/mysql-proxy/bin/mysql-proxy --help --all
[root@server3 conf]# vim mysql-proxy.conf ##配置proxy启动文件
[mysql-proxy] ##定义
user=root ##以root用户运行软件
daemon=true ##在后台运行
proxy-address=172.25.19.3:3306 ##proxy地址(可有可无)
proxy-backend-addresses=172.25.19.1:3306 ##可写后端
proxy-read-only-backend-addresses=172.25.19.2:3306 ##只读后端
proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua ##读写分离脚本
log-file=/usr/local/mysql-proxy/logs/mysql-proxy.log ##日志存放
log-level=debug ##日志级别
keepalive=true ##持续连接
[root@server3 conf]# chmod 660 /usr/local/mysql-proxy/conf/mysql-proxy.conf ##权限过大则mysql-proxy开启失败
[root@server3 conf]# /usr/local/mysql-proxy/bin/mysql-proxy --plugins=proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf ##开启。调用哪个插件;主配置文件位置
[root@server3 conf]# yum install net-tools -y
[root@server3 conf]# netstat -antlp ##mysql-proxy:3306
[root@server3 ~]# yum install mysql
物理机:
[root@foundation19 ~]# mysql -h 172.25.19.3 -u www -p ##远程登陆
Enter password:
[root@server1 ~]# yum install lsof -y
[root@server1 ~]# lsof -i :3306 ##查看3306端口的连接情况(server3有连接)
[root@server2 ~]# yum install lsof -y
[root@server2 ~]# lsof -i :3306
刚开始1、2次都是连接到了主server1
从第三次开始负载均衡
测 试 写
Server1 上创建数据库表格:
mysql> create database test;
mysql> use test;
mysql> create table userlist(
-> username varchar(6) not null,
-> password varchar(6) not null);
物理机测试:
[root@foundation12 kiosk]# mysql -h 172.25.254.3 -urepl -pRedhat-1
MySQL [(none)]> use test;
MySQL [test]> insert into userlist values('hello','123');
server1,server2 上查看数据
mysql> select * from test.userlist;
+----------+----------+
| username | password |
+----------+----------+
| hello | 123 |
+----------+----------+
测 试 读
关闭 server2 的 slave:
mysql> stop slave;
物理机:
MySQL [test]> insert into userlist values('haha','234');
MySQL [test]> select * from userlist;
+----------+----------+
| username | password |
+----------+----------+
| hello | 123|
| haha | 234|
+----------+----------+
server1.server2 分别查看:
//此时只有 server1 更新到数据
//打开 slave,server2 更新到数据。
[root@server3 ~]# ps ax
PID TTY STAT TIME COMMAND
2056 ? S 0:00 /usr/local/mysql-proxy/libexec/mysql-proxy --plugins=proxy --defau
2057 ? S 0:00 /usr/local/mysql-proxy/libexec/mysql-proxy --plugins
[root@server3 ~]# kill -9 2056 2057