免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8703 | 回复: 13
打印 上一主题 下一主题

使用mysql-proxy实现mysql读写分离【原创】 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-05-12 08:40 |只看该作者 |倒序浏览
本帖最后由 luwenju 于 2011-05-12 08:42 编辑

使用mysql-proxy实现mysql读写分离.pdf (315.33 KB, 下载次数: 219)




  文档名称    使用mysql-proxy实现mysql读写分离  
  作者/日期    陆文举
2010-11-14  
  博客    http://blog.luwenju.com  
  微博    http://weibo.com/luwenju  


由于公司数据库负载较大,所以便打算使用读写分离来减轻mysql的负载。目前较为常见的mysql读写分离分为两种:

1、基于程序代码内部实现:在代码中根据selectinsert进行路由分类;这类方法也是目前生产环境应用最广泛的。优点是性能较好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支。缺点是需要开发人员来实现,运维人员无从下手。

2、基于中间代理层实现:我们都知道代理一般是位于客户端和服务器之间,代理服务器接到客户端请求后通过判断然后转发到后端数据库。在这有两个代表性程序

mysql-proxymysql-proxymysql开源项目,通过其自带的lua脚本进行sql判断,虽然是mysql官方产品,但是mysql官方并不建议将mysql-proxy用到生产环境。

amoeba陈思儒开发,作者曾就职于阿里巴巴,现就职于盛大。该程序由java语言进行开发,目前只听说阿里巴巴将其用于生产环境。另外,此项目严重缺少维护和推广(作者有个官方博客,很多用户反馈的问题发现作者不理睬)

经过上述简单的比较,通过程序代码实现mysql读写分离自然是一个不错的选择。但是并不是所有的应用都适合在程序代码中实现读写分离,像大型SNSB2C这类应用可以在代码中实现,因为这样对程序代码本身改动较小;像一些大型复杂的java应用,这种类型的应用在代码中实现对代码改动就较大了。所以,像这种应用一般就会考虑使用代理层来实现。

下面我们看一下如何搭建mysql-proxy来实现mysql读写分离


环境拓扑如下:



关于mysqlmysql主从的搭建,在此不再演示,如下的操作均在mysql-proxy192.168.1.200)服务器进行

一、安装mysql-proxy

1、安装lua
(mysql-proxy
需要使用lua脚本进行数据转发)

#tar zxvflua-5.1.4.tar.gz

#cd lua-5.1.4

#vi Makefile,修改INSTALL_TOP= /usr/local/lua

#make posix

#make install


2、安装libevent

#tar zxvflibevent-2.0.8-rc.tar.gz

#cdlibevent-2.0.8-rc

#./configure--prefix=/usr/local/libevent

#make &&make install


3、安装check

#tar zxvfcheck-0.9.8.tar.gz

#cd check-0.9.8

#./configure&& make && make install


4、安装mysql客户端

#tar zxvfmysql-5.0.92.tar.gz

#cd mysql-5.0.92

#./configure--without-server && make && make install


5、设置环境变量
(安装mysql-proxy所需变量)

#vi /etc/profile

exportLUA_CFLAGS="-I/usr/local/lua/include" LUA_LIBS="-L/usr/local/lua/lib-llua -ldl" LDFLAGS="-L/usr/local/libevent/lib -lm"

exportCPPFLAGS="-I/usr/local/libevent/include"

exportCFLAGS="-I/usr/local/libevent/include"

# source/etc/profile


6、安装mysql-proxy

#tar zxvfmysql-proxy-0.6.0.tar.gz

#cd mysql-proxy-0.6.0

# ./configure--prefix=/usr/local/mysql-proxy --with-mysql --with-lua

#make &&make install


7、启动mysql-proxy

本次对两台数据库实现了读写分离;mysql-master为可读可写,mysql-slave为只读

#/usr/local/mysql-proxy/sbin/mysql-proxy--proxy-backend-addresses=192.168.1.201:3306--proxy-read-only-backend-addresses=192.168.1.202:3306--proxy-lua-script=/usr/local/mysql-proxy/share/mysql-proxy/rw-splitting.lua&


注:如果正常情况下启动后终端不会有任何提示信息,mysql-proxy启动后会启动两个端口404040414040用于SQL转发,4041用于管理mysql-proxy。如有多个mysql-slave可以依次在后面添加



二、测试

1、连接测试

因为默认情况下mysql数据库不允许用户在远程连接

mysql>grant allprivileges on *.* to 'root'@'%' identified by '123456';

mysql>flushprivileges;


客户端连接

#mysql -uroot-p123456 -h192.168.1.200 -P4040



2、读写分离测试

为了测试出mysql读写分离的真实性,在测试之前,需要开启两台mysqllog功能,然后在mysql-slave服务器停止复制

、在两台mysql配置文件my.cnf中加入log=query.log,然后重启

、在mysql-slave上执行SQL语句stop slave

、在两台mysql上执行#tail -f /usr/local/mysql/var/query.log

、在客户端上连接mysql(三个连接以上),然后执行createselectSQL语句,观察两台mysql的日志有何变化

注:生产环境中除了进行程序调试外,其它不要开启mysql查询日志,因为查询日志记录了客户端的所有语句,频繁的IO操作将会导致mysql整体性能下降


总结:在上述环境中,mysql-proxymysql-mastermysql-slave三台服务器均存在单点故障。如果在可用性要求较高的场合,单点隐患是绝对不允许的。为了避免mysql-proxy单点隐患有两种方法,一种方法是mysql-proxy配合keepalived做双机,另一种方法是将mysql-proxy和应用服务安装到同一台服务器上;为了避免mysql-master单点故障可以使用DRBD+heartbear做双机;避免mysql-slave单点故障增加多台mysql-slave即可,因为mysql-proxy会自动屏蔽后端发生故障的mysql-slave

在搭建mysql-proxy时遇到不少麻烦,在此再次感谢刘兄师父的帮助!













论坛徽章:
0
2 [报告]
发表于 2011-05-12 10:01 |只看该作者
回复 1# luwenju


    楼主请问一下,这个我们已经实现过了,可是在hibernate下不好使,对于preparestatment不支持,恰巧我们又全都是这种,请问有没有生产环境用的解决这个问题的lua,或者有其他的解决办法,感谢~~~

论坛徽章:
1
白银圣斗士
日期:2015-11-23 08:33:04
3 [报告]
发表于 2011-05-12 10:42 |只看该作者
这种方案本身有其特定的适应范围。
其次一般来说,这个方案的重点难点在于:/usr/local/mysql-proxy/share/mysql-proxy/rw-splitting.lua 这个脚本的扩展和定制。

论坛徽章:
0
4 [报告]
发表于 2011-05-12 15:14 |只看该作者
回复 3# 枫影谁用了

嗯    我也质一直在寻找生产环境中使用比较稳定的lua脚本,这也是写本文目的的原因之一吧

论坛徽章:
0
5 [报告]
发表于 2011-05-12 15:14 |只看该作者
回复 2# horizonhyg


    目前没有,这个环境最终没上线。我只是自己拿一些网站做过测试

论坛徽章:
0
6 [报告]
发表于 2011-05-12 17:19 |只看该作者
回复 5# luwenju


    恩,谢谢~~

论坛徽章:
8
综合交流区版块每周发帖之星
日期:2015-12-02 15:03:53数据库技术版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每日发帖之星
日期:2015-09-14 06:20:00金牛座
日期:2014-10-10 11:23:34CU十二周年纪念徽章
日期:2013-10-24 15:41:34酉鸡
日期:2013-10-19 10:17:1315-16赛季CBA联赛之北京
日期:2017-03-06 15:12:44
7 [报告]
发表于 2011-05-12 23:52 |只看该作者
我也在为hibernate的事情头痛

论坛徽章:
0
8 [报告]
发表于 2011-05-16 10:18 |只看该作者
感谢楼主分享!!!

论坛徽章:
0
9 [报告]
发表于 2011-05-16 10:49 |只看该作者
回复 7# ruochen


    其实amoeba是可以解决这个问题的,但是没有测试过性能如何,不敢用在生产环境,hibernate头疼死了,分表分区都难办,没有很好的开源项目使用.

论坛徽章:
0
10 [报告]
发表于 2011-05-17 18:24 |只看该作者
举子兄,是否测试过mysql proxy的性能呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP