您好,欢迎访问一九零五行业门户网

RHEL6.5下MySQL读写分离的实现

使用4台rhel6.5虚拟机,如图下所示。其中192.168.4.10、192.168.4.20分别作为mysql主、从服务器,是整个服务的后端;另一台192.1
一、要求
1、配置两台mysql服务器和一台代理服务器,实现mysql代理的读写分离。
2、用户只需要访问mysql代理服务器,实际的sql查询、写入操作交给后台的2台mysql服务器来完成。
3、其中master服务器允许sql查询、写入,slave服务器只允许sql查询。
二、方案
使用4台rhel6.5虚拟机,如图下所示。其中192.168.4.10、192.168.4.20分别作为mysql主、从服务器,是整个服务的后端;另一台192.168.4.30作为mysql代理服务器,是直接面向客户的服务前端;客户机192.168.4.100用作访问测试。
对比两种方式的读写分离效果——
mysql主从复制:客户机访问master服务器来写数据库,客户机访问slave服务 器来读数据库。这种情况下,需要客户端自行区分向何处写、从何处读。mysql主从复制+代理:客户机访问proxy服务器,读、写请求交给proxy识别,如果是写数据库操作则交给master,如果是读数据库操作则交给slave处理,具体由分配策略控制。这种情况下,无需客户端区分读、写目标,而是由proxy服务器代劳了,从而降低了客户端程序的复杂度。以下是在mysql主从复制的基础上实现的,mysql主从复制部分请参见另一篇文章《mysql主从复制》
三、实现
1、部署mysql-proxy代理服务器
1)安装mysql官方提供的mysql-proxy软件包
mysql官方提供了mysql-proxy的免安装版本,解压后即可使用。由于msyql-proxy使用了lua脚本语言,因此需要提前安装好lua软件包(rhel6镜像内已含)以确保其正常使用:
[root@proxy ~]# yum -y install lua
然后部署mysql-proxy软件包:
[root@proxy 桌面]# tar zxf mysql-proxy-0.8.3-linux-rhel5-x86-64bit.tar.gz -c /usr/local/
[root@proxy 桌面]# cd /usr/local/     
[root@proxy local]# mv mysql-proxy-0.8.3-linux-rhel5-x86-64bit/ mysql-proxy  //将文件改短一点,方便访问
切换到部署后的目录,确认相关目录、可执行程序、脚本。一般情况下,使用bin目录下的mysql-proxy脚本来启动代理服务:
[root@proxy local]# cd mysql-proxy/
[root@proxy mysql-proxy]# ls
bin  include  lib  libexec  licenses  share
[root@proxy mysql-proxy]# ls bin/ libexec/
bin/:                                      //服务脚本目录
mysql-binlog-dump  mysql-myisam-dump  mysql-proxy
libexec/:                                    //可执行程序目录
mysql-binlog-dump  mysql-myisam-dump  mysql-proxy
2)准备读写分离的lua策略脚本
直接复制mysql-proxy提供的样例策略即可:
[root@proxy mysql-proxy]# cp share/doc/mysql-proxy/rw-splitting.lua ./
3)启动mysql-proxy代理服务
主要命令选项:
    -p(大写):指定代理监听的ip地址、端口
    -r:指定读服务器的ip地址、端口
    -b:指定写服务器的ip地址、端口
    -s:指定lua脚本文件
    --keepalive:如果服务进程崩溃,尝试重启此进程
[root@proxy mysql-proxy]# pwd
/usr/local/mysql-proxy
[root@proxy mysql-proxy]# bin/mysql-proxy -p 192.168.4.30:3306 \
> -b 192.168.4.10:3306 \
> -r 192.168.4.20:3306 \
> -s rw-splitting.lua &
[root@proxy mysql-proxy]# netstat -anpt | grep mysql  //确认监听状态
tcp  0  0  192.168.4.30:3306 0.0.0.0:*  listen      16119/mysql-proxy 
对于客户端来说,这台代理主机192.168.4.30就相当于一台可读可写的mysql数据库服务器了。
为了每次开机启动mysql-proxy代理服务可以将上面的命令写到/etc/rc.local配置文件内:
 [root@proxy ~]# vim /etc/rc.local
 .. ..
 /usr/local/mysql-proxy/bin/mysql-proxy -p 192.168.4.30:3306 \
 -b 192.168.4.10:3306 \
 -r 192.168.4.20:3306 \
 -s rw-splitting.lua &
2、测试通过mysql-proxy的读写分离
1)在master服务器上授权用户,允许其从192.168.4.0/24的客户机远程访问。
mysql>  grant all on *.* to user02@'192.168.4.%' identified by 'pwd123';
query ok, 0 rows affected (0.07 sec)
因为此前已配置mysql库的主从同步,slave上的用户授权会自动更新
2)从客户机上192.168.4.100访问mysql数据库
[root@client ~]# mysql -h192.168.4.30 -uuser02 -ppwd123
error 2003 (hy000): can't connect to mysql server on '192.168.4.30' (113)
出现上面这种情况,可以关闭代理的防火墙,或者添加一条允许访问3306端口的防火墙规则
[root@proxy ~]# iptables -i input -s 192.168.4.0/24 -p tcp --dport 3306 -j accept
再次登录:
[root@client ~]# mysql -h192.168.4.30 -uuser02 -ppwd123
... ...
mysql>                    //表示登录成功
mysql> create database student;          //新建库
query ok, 1 row affected (0.10 sec)
mysql> use student;//切换到新建的库
database changed
mysql> create table info( id int(4),name varchar(48));    //新建表
query ok, 0 rows affected (1.23 sec)
mysql> insert into info values(1,hanmeimei),(2,lilei);  //插入2条表记录
query ok, 2 rows affected (0.18 sec)
records: 2  duplicates: 0  warnings: 0
mysql> select * from info;
+------+-----------+
| id  | name        |
+------+-----------+
|    1 | hanmeimei |
|    2 | lilei            |
+------+-----------+
2 rows in set (0.01 sec)
mysql> quit
bye
3)在master和slave上确认客户端新建的表
[root@client ~]# mysql -h192.168.4.10 -uuser02 -ppwd123
mysql> use student;
mysql> show tables;
+-------------------+
| tables_in_student |
+-------------------+
| info                    |
+-------------------+
1 row in set (0.00 sec)
mysql> select * from info;
+------+-----------+
| id    | name      |
+------+-----------+
|    1  | hanmeimei |
|    2  | lilei            |
+------+-----------+
2 rows in set (0.00 sec)
[root@client ~]# mysql -h192.168.4.20 -uuser02 -ppwd123
mysql> select * from student.info;
+------+-----------+
| id  | name        |
+------+-----------+
|    1 | hanmeimei |
|    2 | lilei            |
+------+-----------+
2 rows in set (0.00 sec)
4)观察mysql代理访问的网络连接
在proxy代理商可看到与mysql读、写服务器的网络连接:
[root@proxy mysql-proxy]# netstat -anpt | grep mysql
其它类似信息

推荐信息