Linux运维——用mysql-proxy实现读写分离

MySQL读写分离是指让master处理写操作,让slave处理读操作,非常适用于读操作量比较大的场景,可减轻master的压力。
使用mysql-proxy实现mysql的读写分离,mysql-proxy实际上是作为后端mysql主从服务器的代理,它直接接受客户端的请求,对SQL语句进行分析,判断出是读操作还是写操作,然后分发至对应的mysql服务器上。

                                   Linux运维——用mysql-proxy实现读写分离_第1张图片

实验环境:

server1:主mysql
server2:从mysql
server3:mysql-proxy

首先我们需要配置一下主从复制,请查看之前的博客 mysql主从复制,配置完主从复制之后继续:

1.检查sercer1、server2的主从复制;建用户、下放权力

[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中间层调度,直接在后端服务器直接把谁读谁写配置好

2.mysql-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    ##读写分离策略脚本

Linux运维——用mysql-proxy实现读写分离_第2张图片
[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启动文件

Linux运维——用mysql-proxy实现读写分离_第3张图片
[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

测试1:

[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
从第三次开始负载均衡

测试2:

测 试  写

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 更新到数据。

取消proxy:

[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

你可能感兴趣的:(Linux运维——用mysql-proxy实现读写分离)