mysql集群(二)

吃可爱长大的小学妹 提交于 2019-12-01 17:36:47

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的写服务器上)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!