结构图如下:

Mysql读写分离_第1张图片


思路:

1 让mysql-proxy服务监听3306端口

2 在后端的数据库服务器1.1与1.2上做用户授权

3 为保证用户能够看到写入的数据,把负责读写操作的数据库服务器做成主从同步的结构

 

1、数据库服务器读写分离配置

1)开启数据库服务

  service mysqld start                                                 

2)所有数据库创建库、表结构一致,设置表记录初始值不一样(验证代理是否实现读写分离)

  进入IP 1.1与1.2数据库服务器创建库、表结构一致,表记录不一样。

[root@data ~]mysql -uroot -p

mysql> create database test300;      //在IP 1.1与1.2上创建相同库

mysql> create table test300.a (id int); //同上创建相同表结构

 

mysql>insert into test300.a values(1);  //IP 1.1插入记录是1

mysql>insert into test300.a values(2);  //IP 1.2插入记录是2


3)在两台数据库服务器上分别授权允许代理服务器连接自己

 在IP 1.1与1.2上做相同的授权给同一个用户,@地址是匹配所有

  mysql>grant all on *.* to proxyuser@’%’identifiedby‘123’;   

            

4)测试授权用户能否从mysql代理服务器访问后端的2台数据库服务器

  在代理服务器192.168.1.254上登陆

[root@data ~]mysql -h192.168.1.1 -uproxyuser -p123

[root@file ~]mysql -h192.168.1.2 -uproxyuser -p123


2、安装mysql-proxy并配置

1)mysql-proxy(代理软件)

客户端将请求发给代理,由代理区分读写操作,将读操作发送给从数据库服务器,写操作发送给主数据库服务器

mysql –hmysql-proxy的ip –u用户名 –p密码  //客户端直接访问IP 1.254                             

2)停止代理服务器的mysql服务,释放3306端口,给mysql-proxy代理软件用

  #service mysql stop                                                #chkconfig  --level  35  mysql off                                                  

安装需要软件包

**linux6中lua,lua-devel已包含在mysql-proxy中

lua-5.0.2-1.el5.rf.i386.rpm 

lua-devel-5.0.2-1.el5.rf.i386.rpm

mysql-proxy-0.8.3-linux-rhel5-x86-64bit.tar.gz

mysql-proxy 默认监听3306端口


3)安装提供代理服务的软件mysql-proxy

mysql-proxy软件是用lua语言编写,所以系统上必须安装lua包

[root@dai ~]# rpm -qa | grep lua

lua-devel-5.0.2-1.el5.rf

lua-5.0.2-1.el5.rf

解压mysql-proxy包到指定位置下    

[root@seven~]# tar -zxvf mysql-proxy-0.8.3...64bit.tar.gz -C /usr/local/      

[root@seven~]# cd /usr/local                                          

[root@sevenlocal]# mv  mysql-proxy...  mysql-proxy  //将文件夹改名,方便访问


/usr/local/mysql-proxy下的文件夹的作用                            

bin       启动服务脚本

include    头文件

share     功能脚本

lib       库文件

libexec    可执行命令


#ls mysql-proxy/share/doc/mysql-proxy/  

 rw-splitting.lua   //实现读写分离功能的脚本

#ll /usr/local/proxy/share/doc/mysql-proxy/rw-splitting.lua     //查看权限限        

#chmod +x /usr/local/proxy/share/doc/mysql-proxy/rw-splitting.lua  //添加执行权限                   

4)启动代理服务

格式:./mysql-proxy –P 代理服务器ip:指定端口 -r 读服务器ip:指定端口 -b 写服务器ip:端口 -s(调用执行脚本) /usr/local/mysql-proxy/share/doc/mysql-proxy/ rw-splitting.lua &       

说明:&表示后台运行

                                           

[root@sevenbin]# /usr/local/mysql-proxy/bin/mysql-proxy \

-P 192.168.1.254:3306 -r 192.168.1.2:3306 -b 192.168.1.1:3306 \

-s /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua &


2014-02-18 14:26:51: (critical) plugin proxy 0.8.3started     //出这句代表成功

 

停止:只能杀进程  #pkill -9 mysql-proxy

      杀进程号  #kill 9 %1


5)查看mysql代理服务是否处于运行状态

[root@dai~]# jobs   //查看后台是否运行

[1]+  Running                 /usr/local/mysql-proxy/bin/mysql-proxy-P 192.168.1.254:3306 -r 192.168.1.23:3306 -b 192.168.1.100:3306 -s/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua &


6)测试mysql代理服务器的读写分离功能

**proxy服务器也需创建与1.1、1.2数据库服务器库、表结构一致的库表。

 

客户端用授权账号连接代理服务器,代理服务器自动连接数据库服务器测试读写分离

# mysql -h192.168.1.254 -uproxyuser  -p123

mysql>insert into test300.a  vales(100);//因没有到并发数,此时客户端和1.1上都能看到100这条记录。

 

在客户机上开5或6个终端分别如下操作:

# mysql -h192.168.1.3 -uproxyuser -p123

mysql> select * from test300.a;


当第5或第6个终端的时候,因为达到了并发数,再执行select * from test300.a;语句,只能看到:1.2中的记录,再插入记录后,记录会写入负责写的服务器1.1,客户端将看不到这条记录。

 

7)若想客户端立马看到,还需将写读的服务器,做成主从服务器

写服务器192.168.1.1:→主服务器

读服务器192.168.1.2:→从服务器

在主服务器上授权从服务器:

# mysql -uroot -p123456

mysql> grant all on *.* to [email protected] identified  by ‘123’;

从服务器上登录:

# mysql -h192.168.1.1 -uroot -p123

mysql> select * from test300.a;  


此时,客户机上插入记录,1.2上就能立马看到了

 

8)修改主配置文件—并发数

** 并发数不能设置为0**

#vim /usr/local/mysqlproxy/share/doc/mysql-proxy/rw-splitting.lua

min_idle_connections = 4

max_idle_connections = 8


问答:

1 mysql代理服务器的并发连接达到(4或4+1)个时(区分用户的读写操作)

2 当用户的并发连接数没有超过指定的最小并发连接阀值时,mysql代理服务器如何分发用户的读写请求(主)

3 当用户的并发连接数超过最小并发连接阀值时,是否能否按照启动mysql代理服务时指定的设置分发用  户的读写请求(能)

4 当用户的并发连接数大于4时,区分用户的读写操作,当用户的并发连接数恢复小于最小并发连接数  后,mysql代理服务如何分发用户的读写请求(一旦区分开来,就会一直保持区分)