Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2795523
  • 博文数量: 389
  • 博客积分: 4177
  • 博客等级: 上校
  • 技术积分: 4773
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-16 23:29
文章分类

全部博文(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行

阅读(3044) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~