全部博文(389)
分类: Mysql/postgreSQL
2013-12-22 10:08:19
MySQL-PROXY实现读写分离
MYSQL-PROXY是由MySQL官方出的一个代理软件,用来代理从应用程序到mysql服务器之间的流量
mysql-proxy的功能十分强大,主要的功能有:在后端多台服务器之间做load balance,把读和写分别
转不同服务器,根据表不同而转到不同服务器等等(详情请见mysql官文说明).而这一切的一切对应用程
序是透明的,对于应用程序来说只是连接到mysql-proxy的端口(我用的是3306),从应用程序的服务器的
度来说都不知道后面是连接是哪台服务器.
例子中我主要的部署结构为前端一台mysql-proxy服务器,后端一台master服务器,一台slave服务器.
通过mysql-proxy把写请求转到master上,读转发到slave服务器上,从而实现读写分离.
mysql-proxy服务器ip:192.168.233.82
master服务器:192.168.233.110
slave服务器:192.168.233.61
OS版本:RHEL5.5
mysql_proxy:0.8.3
mysql:5.6.14
先搭建好mysql的主从配置,并且保证功能正常.
解压mysql-proxy到/usr/local/mysql-proxy
[root@g2 local]# tar -xzvf mysql-proxy-0.8.3-linux-rhel5-x86-64bit.tar.gz
[root@g2 local]# mv mysql-proxy-0.8.3-linux-rhel5-x86-64bit /usr/local/mysql-proxy
[root@g2 local]# groupadd mysql
[root@g2 local]# useradd -g mysql mysql
[root@g2 local]# passwd mysql
[root@g2 local]# chown -R mysql:mysql /usr/local/mysql-proxy
最好把/usr/local/mysql-proxy/bin加到mysql用户PATH中去
软件安装完成,现在就可以测试一下启动mysql-proxy服务器了
[mysql@g2 bin]$ mysql-proxy --proxy-address=192.168.233.82:3306
2013-12-13 06:07:18: (critical) plugin proxy 0.8.3 started
[root@g2 local]# netstat -nltp | grep 3306
tcp 0 0 192.168.233.82:3306 0.0.0.0:* LISTEN 6807/mysql-proxy
杀掉进程。然后再启动mysql-proxy,并且把请求转发到master上去
[root@g2 local]# kill -9 6807
[mysql@g2 bin]$ mysql-proxy --proxy-backend-addresses=192.168.233.110:3306 --proxy-address=192.168.233.82:3306
2013-12-13 06:14:35: (critical) plugin proxy 0.8.3 started
在一台客户机执行一下查询,看看结果
[root@d2 mysql]# mysql -h 192.168.233.82 --port=3306 -e "select count(*) from frank.t1;" -u root -p
Enter password:
+----------+
| count(*) |
+----------+
| 14 |
+----------+
一个简单的代理已经搭建成功了,过程非常简单.再来看看实现复杂的功能,在master和salve之前实现透明的读写分离
mysql-proxy有自己的脚本语言叫作LUA,通过LUA可以定义mysql-proxy的各种行为
[mysql@g2 mysql-proxy]$ mysql-proxy --proxy-backend-addresses=192.168.233.110:3306 \
--proxy-backend-addresses=192.168.233.61 --daemon --log-level=debug --log-file=/usr/local/mysql-proxy/proxy.log \
--proxy-address=192.168.233.82:3306 --proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
实验中我故意构造主库和备库的frank.t1表行数不一致,这样查询的时候就知道是从哪台主机上返回的了
[root@d2 mysql]# mysql -h 192.168.233.82 --port=3306 -e "select count(a) from frank.t1;" -u root -proot
Warning: Using a password on the command line interface can be insecure.
+----------+
| count(a) |
+----------+
| 15 |
+----------+ --主库上是14行