mysql集群(二)

四、mysql-proxy完成负载均衡与读写分离

        一、基于程序代码内部实现

            在代码中对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的写服务器上)

相关文章
相关标签/搜索