设为首页 收藏本站
查看: 467|回复: 0

[经验分享] Centos5.6下MySQL Proxy0.8.2的安装及测试

[复制链接]

尚未签到

发表于 2016-10-17 04:50:51 | 显示全部楼层 |阅读模式
Centos5.6下MySQL Proxy0.8.2的安装及测试
2012-03-21 09:04 抚琴煮酒 51CTO 字号:T | T

MySQL Proxy是一个处于MySQL Client端和MySQL Server端之间的简单程序,它可以监测、分析或改变它们的通信。它使用灵活,没有限制,常见的用途包括:负载平衡,故障、查询分析,查询过滤和修改等等。
AD:WOT2014:用户标签系统与用户数据化运营培训专场



 
不要相信你所看到的,我测试是通过的。
MySQL Proxy就是这么一个中间层代理,简单的说,MySQL Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和负载平衡。对于应用来说,MySQL Proxy是完全透明的,应用则只需要连接到MySQL Proxy的监听端口即可。当然,这样proxy机器可能成为单点失效,但完全可以使用多个proxy机器做为冗余,在应用服务器的连接池配置中配置到多个proxy的连接参数即可。MySQL Proxy更强大的一项功能是实现“ 读写分离”,基本原理是让主数据库处理事务性查询,让从库处理SELECT查询。数据库复制被用来把事务性查询导致的变更同步到集群中的从库。在生成Mysql的M-S结构后,为了实现读写分离,需要使用Mysql Proxy。目前Mysql Proxy的版本为0.8.2 。
MySQl Proxy目前应用的生产环境:
一、现实中很多应用环境是这样:在程序开发初期就没有规划好,程序读写数据都只提供一个IP接口,后期由于压力顶不住,公司要求后来的系统架构师/DBA将公司的数据库架构更改,这样在程序上实现比较困难,所以加进此中间层来实现。
二、建议大家还是将其应用中小型网站,特别是读比较频繁的网站。如果是大型网站或门户型的网站,建议读写分离还是从开发层面实现。
三、建议大家采用MySQL Proxy 0.8.0以上的版本,它修正了以前不少BUG,而且稳定性也不错。
一、MySQL Proxy0.8.2的安装步骤如下:
先从mysql.com官方地址http://dev.mysql.com/downloads/mysql-proxy/下载源码包到/usr/local/src/目录下,建议大家采用最新的MySQL Proxy0.8.2版本,Mysql Proxy0.8.2安装之前有先决条件,如下:
libevent 1.x 或更高
glib2 2.6.0 或更高
lua 5.1.x 或更高
pkg-config
libtool 1.5 或更高
MySQL 5.0.x 或更高的开发库
服务器操作系统:Centos5.6 x86_64
1.为了加速安装进度,我们可以先yum安装必须的库,同时解决pkg-config、libtool和Mysql开发库,由于mysql-proxy实际并不需要在本机上运行mysql实例,所以我们在这里用yum安装,命令如下所示:

  • yum -y install gcc gcc-c++ autoconf mysql-devel libtool pkgconfig ncurses ncurses-devel 
2.libevent安装libevent-2.0.13版本,从此处可以下载:
http://monkey.org/~provos/libevent-2.0.13-stable.tar.gz
运行如下命令进行安装:

  • tar xvf libevent-2.0.13-stable.tar.gz  
  • cd libevent-2.0.13-stable  
  • ./configure  
  • make && make install 
3.glib2安装glib-2.18.4版,从此处可以下载:
http://ftp.gnome.org/pub/gnome/sources/glib/2.18/glib-2.18.4.tar.gz
运行如下命令进行安装:

  • tar xvf glib-2.18.4.tar.gz  
  • cd glib-2.18.4  
  • ./configure  
  • make && make install 
4.lua安装5.1.4版本,安装之前需要先安装readline 6.1,不然会报错缺少头文件:
readline 6.1下载:
ftp://ftp.cwru.edu/pub/bash/readline-6.1.tar.gz
运行如下命令进行安装:

  • tar xvf readline-6.1.tar.gz     
  • cd readline-6.1  
  • ./configure  
  • make && make install 
为了让动态链接库为系统所共享,我们这里用ldconfig

  • ldconfig -v 
用此选项时,ldconfig将显示正在扫描的目录及搜索到的动态链接库,还有它所创建的连接的名字。
5.安装lua 5.1.4,其下载地址为http://www.lua.org/ftp/lua-5.1.4.tar.gz。

  • cd /usr/local/src  
  • tar xvf lua-5.1.4.tar.gz  
  • cd lua-5.1.4 
# 64位系统,需在CFLAGS里加上-fPIC ,我们用vim编辑下src/Makefile文件,修改代码如下所示:

  • CFLAGS= -O2 -Wall -fPIC $(MYCFLAGS) 
我们继续用如下命令进行安装:

  • make linux  
  • make install 
6.配置pkg-config 环境变量,命令如下所示:

  • cp etc/lua.pc /usr/local/lib/pkgconfig/   
  • export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig 
7.以上操作就完成了基础文件的安装,接下来是MySQL Proxy0.8.2安装,下载完后运行如下命令:

  • tar xvf mysql-proxy-0.8.2.tar.gz  
  • cd mysql-proxy-0.8.2  
  • ./configure –prefix=/usr/local/mysql-proxy  
  • make && make install  
  • cp lib/rw-splitting.lua /usr/local/lib/  
  • cp lib/admin.lua /usr/local/lib/ 
二、到这里MySQL-proxy已基本安装完成,接下来就是MySQL Proxy0.8.2的测试和配置了。
MySQL Proxy环境设置说明
Master  MySQL服务器:192.168.2.117
Slave MySQL服务器:192.168.192.168.2.115
MySQL Proxy服务器:192.168.2.112
1.mysql-proxy选项说明,大家也可以用mysql-proxy –help-all查看它的帮助选项,命令如下所示:

  • mysql-proxy --help-all 
管理功能选项:

  • --admin-address=host:port 指定一个mysqo-proxy的管理端口,缺省是4041;  
  • --admin-username=<string> username to allow to log in  
  • --admin-password=<string> password to allow to log in  
  • --admin-lua-script=<filename> script to execute by the admin plugin 
代理功能选项:
-P,--proxy-address=<host:port> 是mysql-proxy 服务器端的监听端口,缺省是4040,建议改为3306,方便开发人员写代码。
-r,--proxy-read-only-backend-addresses=<host:port> 只读Slave的地址和端口,缺省为不设置;
-b,--proxy-backend-addresses=<host:port> 远程Master地址和端口,可设置多个做failover和load balance,缺省是127.0.0.1:3306;
--proxy-skip-profiling 关闭查询分析功能, 缺省是打开的;
--proxy-fix-bug-25371 修正 mysql的libmysql版本大于5.1.12的一个#25371号bug;
-s,--proxy-lua-script=<file> 指定一个Lua脚本来控制mysql-proxy的运行和设置,这个脚本在每次新建连接和脚本发生修改的的时候将重新调用;
其他选项:
--defaults-file=<file>配置文件,可以把mysql-proxy的参数信息置入一个配置文件里,建议大家用这种配置MySQL Proxy0.8.2,比较方便;
--daemon mysql-proxy以守护进程方式运行;
--pid-file=file 设置mysql-proxy的存储PID文件的路径;
--keepalive try to restart the proxy if it crashed,保持连接启动进程会有2个, 一号进程用来监 视二号进程, 如果二号进程死掉自动重启proxy,这是新版MySQL Proxy的增加的Keepalived功能,它修正了以前MySQL Proxy容易死掉的bug,建议大家开启此功能。
完整的mysql-proxy配置文件如下:
 

  • [mysql-proxy]  
  • admin-username=root  
  • admin-password=123456  
  • admin-lua-script=/usr/local/lib/admin.lua  
  • proxy-read-only-backend-addresses=192.168.2.115  
  • proxy-backend-addresses=192.168.2.117  
  • proxy-lua-script=/usr/local/lib/rw-splitting.lua  
  • log-file=/var/log/mysql-proxy.log  
  • log-level=debug  
  • daemon=true 
  • keepalive=true 
2.给用户授权
在Master/Slave建立一个测试用户,因为以后客户端发送的SQL都是通过mysql-proxy服务器来转发,所以要确保可以从mysql-proxy服务器上登录MySQL主从库,分别在主和从MySQL机器上执行如下所示:

  • mysql> grant all privileges on *.* to 'test'@'192.168.2.117' identified by 'test' with  grant option;  
  • mysql> grant all privileges on *.* to 'test'@'192.168.2.115' identified by 'test' with  grant option; 
3.做完此步我们就可以在MySQL Proxy0.8.2上进行测试了,命令如下所示:

  • /usr/local/mysql-proxy/bin/mysql-proxy -P 192.168.2.112:3306 --defaults-file=/etc/mysql-proxy.cnf  
我们监测下MySQL Proxy的日志,有如下字样表示MySQL Proxy已成功启动了(注意之前要成功启动117和115上的mysql程序),如下所示:
2012-03-13 14:05:38: (message) added read-only backend: 192.168.2.115
2012-03-13 16:14:56: (message) proxy-plugin.c.1508: connect(192.168.2.115:3306) failed: Connection refused. Retrying with different backend.
2012-03-14 13:58:23: (message) chassis-unix-daemon.c:136: [angel] we try to keep PID=2399 alive
2012-03-14 13:58:23: (debug) chassis-unix-daemon.c:157: waiting for 2399
2012-03-14 13:58:23: (debug) chassis-unix-daemon.c:121: we are the child: 2399
2012-03-14 13:58:23: (message) mysql-proxy 0.8.2 started
2012-03-14 13:58:23: (debug) max open file-descriptors = 1024
2012-03-14 13:58:23: (message) proxy listening on port 192.168.2.112:3306
2012-03-14 13:58:23: (message) added read/write backend: 192.168.2.117
2012-03-14 13:58:23: (message) added read-only backend: 192.168.2.115
我们多开些MySQL客户端,会发现MySQL Proxy0.8.2很容易的利用Lua脚本实现读写分离功能了,在进行测试前我比较担心的一个问题是:如果主Master因故障停止服务了,MySQL Proxy会不会在从机上面写数据呢?这样会导致主从数据不一,事实上,我在停掉192.168.2.117上的MySQL时发现,MySQL Proxy0.8.2直接不允许写数据了。
三、MySQL Proxy0.8.2测试中遇到的问题。
1.我们可以修改读写分离Lua脚本,让测试更容易,Lua脚本默认最小4个最大8个以上的客户端连接才会实现读写分离(这是因为mysql-proxy会检测客户端连接, 当连接没有超过min_idle_connections预设值时,不会进行读写分离,即查询操作会发生到Master上),现改为最小1个最大2个,我们用vim修改/usr/local/lib/rw-splitting.lua脚本,改动内容如下所示:

  • if not proxy.global.config.rwsplit then  
  •         proxy.global.config.rwsplit = {  
  •                 min_idle_connections = 1,  
  •                 max_idle_connections = 2,  
  •  
  •                 is_debug = false 
  •         }  
  • end 
2.MySQL Proxy0.8.2启动后,我们看的网站页面全是乱码,所以我们要将主从数据库的配置文件my.cnf加进如下代码以避免这个问题:

  • [mysqld]  
  • skip-character-set-client-handshake  
  • init-connect='SET NAMES utf8' 
  • default-character-set=utf8 
3.配置文件的权限问题
建议使用配置文件的形式启动,注意配置文件必须是660权限,否则无法启动。如果有多个Slave的话,proxy-read-only-backend-addresses参数可以配置多个以逗号分隔的IP:Port从库列表。
注意的是,虽然以前的MySQL Proxy的版本存在着这样或那样的问题,但新版的MySQL Proxy0.8.2基本都修正这些Bug了,而且它毕竟是MySQL官方推出的产品,而且相对于Amoeba而言,MySQL Proxy支持事务,我们在生产环境下可以尝试将其用之于代码已固定而且不能更改、的中小型网站。
【编辑推荐】

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-287040-1-1.html 上篇帖子: 导入2万多条数据时报 MySQL server has gone away 下篇帖子: 客户端机器TCP端口被占满导致mysql报Can't connect to MySQL server on 'computername' (10048)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表