http://blog.csdn.net/aspnet_lyc/article/details/50359529
MySQL的主从架构模型可以用来进行备份、故障迁移、或者读写分离来分担负载。
采用读写分离时,在程序中通过封装数据库访问层可以实现写操作连接主库,读操作连接从库。但是当从库较多时,程序中对多个从库做切换比较麻烦。
mysql官方为我们提供了mysql-proxy这个代理组件,对于读写的sql操作,选择连接主库还是从库由mysql-proxy帮助我们完成,对于开发人员是透明的,与连接一个mysql没有差异。但是mysql-proxy也会成为单点,可以通过lvs+keepalive的高可用方案解决。mysql-proxy的配置比较简单:
mysql主从两台机器已同步:
- 主:192.168.142.143
- 从:192.168.142.144
- mysql-proxy:192.168.142.137
- client:192.168.142.150
安装mysql-proxy
- wget http://downloads.mysql.com/archives/get/file/mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz
- 解压
新建/etc/mysql-proxy.cnf配置文件
- [mysql-proxy]
- admin-username = root #mysql-proxy 用户名
- admin-password = toor #mysql-proxy 密码
- daemon = true #以守护进程方式执行
- keepalive = true #保持连接(启动进程会有2个,一号进程用来监视二号进行,如果二号进程死掉自动重建
- proxy-backend-addresses = 192.168.142.143:3306 #mysql主服务器ip端口
- proxy-read-only-backend-addresses = 192.168.142.144:3306 #mysql从服务器ip端口
- proxy-lua-script = /root/mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit/share/doc/mysql-proxy/rw-splitting.lua #读写分离脚本(mysql-proxy自带)
- admin-lua-script = /root/mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit/share/doc/mysql-proxy/admin-sql.lua #admin脚本(mysql-proxy自带)
- log-file = /var/log/mysql-proxy.log
- log-level = debug
为达到测试效果,修改admin-sql.lua脚本以下两行:
- if not proxy.global.config.rwsplit then
- proxy.global.config.rwsplit = {
- min_idle_connections = 1, #默认为4,修改为1,用于指定最小连接为1时即执行读写分离
- max_idle_connections = 1, #默认为8,修改为1
- is_debug = false
- }
- end
启动mysql-proxy
- mysql-proxy --defaults-file=/etc/mysql-proxy.cnf
测试
在客户机*问mysql-proxy, 启动2个终端连接,
mysql -uroot -ptoor -h192.168.142.137 -P4040 (注意mysq-proxy默认端口为4040)
此时有两个连接到mysql-proxy的连接
当连接数大于min_idle_connections时会执行读写分离。
执行读、写操作,根据主从mysql的日志发现写时只会mysql-proxy只会连接mysql主库,读时连接mysql从库。