在代码中对select操做分发到从库;其它操做由主库执行;这类方法也是目前生产环境应用最普遍,知名的如DISCUZ X2。优势是性能较好,由于在程序代码中实现,不须要增长额外的设备做为硬件开支。缺点是须要开发人员来实现,运维人员无从下手。前端
代理通常是位于客户端和服务器之间,代理服务器接到客户端请求后经过判断而后转发到后端数据库。在这有两个表明性程序java
mysql-proxy:mysql-proxy为mysql开源项目,经过其自带的lua脚本进行sql判断,虽然是mysql官方产品,可是mysql官方并不建议将mysql-proxy用到生产环境。
amoeba:由陈思儒开发,做者曾就任于阿里巴巴,现就任于盛大。该程序由java语言进行开发,目前只据说阿里巴巴将其用于生产环境。另外,此项目严重缺乏维护和推广(做者有个官方博客,不少用户反馈的问题发现做者不理睬)
通过上述简单的比较,经过程序代码实现mysql读写分离天然是一个不错的选择。可是并非全部的应用都适合在程序代码中实现读写分离,像大型SNS、 B2C这类应用能够在代码中实现,由于这样对程序代码自己改动较小;像一些大型复杂的java应用,这种类型的应用在代码中实现对代码改动就较大了。所 以,像这种应用通常就会考虑使用代理层来实现。mysql
实战: mysql 读写分离 ,mysql_proxy实现linux
cd /usr/srcsql
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负载均衡
一、利用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
二、链接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的写服务器上)