4、mysql-proxy完成负载均衡与读写分离
1、基于程序代码内部实现
在代码中对select操作分发到从库;其它操作由主库执行;这类方法也是目前生产环境应用最广泛,知名的如DISCUZ X2。优点是性能较好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支。缺点是需要开发人员来实现,运维人员无从下手。
2、基于中间代理层实现
代理一般是位于客户端和服务器之间,代理服务器接到客户端请求后通过判断然后转发到后端数据库。在这有两个代表性程序
mysql-proxy:mysql-proxy为mysql开源项目,通过其自带的lua脚本进行sql判断,虽然是mysql官方产品,但是mysql官方并不建议将mysql-proxy用到生产环境。
amoeba:由陈思儒开发,作者曾就职于阿里巴巴,现就职于盛大。该程序由java语言进行开发,目前只听说阿里巴巴将其用于生产环境。另外,此项目严重缺少维护和推广(作者有个官方博客,很多用户反馈的问题发现作者不理睬)
经过上述简单的比较,通过程序代码实现mysql读写分离自然是一个不错的选择。但是并不是所有的应用都适合在程序代码中实现读写分离,像大型SNS、 B2C这类应用可以在代码中实现,因为这样对程序代码本身改动较小;像一些大型复杂的java应用,这种类型的应用在代码中实现对代码改动就较大了。所 以,像这种应用一般就会考虑使用代理层来实现。
实战: mysql 读写分离 ,mysql_proxy实现
负载均衡
cd /usr/src
wget http://downloads.mysql.com/archives/get/file/mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
tar zxvf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
解压后,该目录包含已经编译好的二进制文件。
mv mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz /usr/local/mysql-proxy
1、利用mysql_proxy实现负载均衡
执行mysql_proxy
cd /usr/local/mysql-proxy
./bin/mysql-proxy -P 192.168.1.67:4040 --proxy-backend-addresses=192.168.1.67:3306 --proxy-backend-addresses=192.168.1.83:3306 --daemon
2、连接mysql_proxy,用mysql客户就可以,因为proxy是mysql的前端代理
注意proxy的端口是4040
mysql -h “proxy的IP” -P 4040 -u username -p password
cd /usr/local/mysql-proxy
./bin/mysql-proxy --proxy-backend-addresses=192.168.1.67:3306 --proxy-read-only-backend-addresses=192.168.1.83:3306 --proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua --daemon
简写:
./bin/mysql-proxy -b 192.168.1.67:3306 -r 192.168.1.83:3306 -s /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua --daemon
测试
因为67和83互为主从,想测试读写分离,先把67服务器上的stop slave;
再在83服务器db_name(数据库),test(表)insert into test (name) values('a');
再执行select * from test;,在67上没有,83上有;
先把rw-splitting.lua里面的
min_idle_connections = 1;#默认4
max_idle_connections = 2;#默认8
效果预览,最右侧连接到的就是67服务器
再在最右侧的83读服务器写入insert into test (name) values('e');
再在67和83服务器上select * from test;
同时存在id为17的数据,说明是从67写服务器写入的数据,在同步到83读服务器上(因为id为16的数据是从读服务器写入的,没同步到67的写服务器上)
来源:oschina
链接:https://my.oschina.net/u/1422143/blog/684218