mysql-proxy实现mysql主从库读写分离

时间:2022-09-23 20:41:25

http://blog.csdn.net/aspnet_lyc/article/details/50359529


MySQL的主从架构模型可以用来进行备份、故障迁移、或者读写分离来分担负载。

 采用读写分离时,在程序中通过封装数据库访问层可以实现写操作连接主库,读操作连接从库。但是当从库较多时,程序中对多个从库做切换比较麻烦。

mysql官方为我们提供了mysql-proxy这个代理组件,对于读写的sql操作,选择连接主库还是从库由mysql-proxy帮助我们完成,对于开发人员是透明的,与连接一个mysql没有差异。但是mysql-proxy也会成为单点,可以通过lvs+keepalive的高可用方案解决。mysql-proxy的配置比较简单:


mysql主从两台机器已同步:

[html] view plain copy print?
  1. 主:192.168.142.143  
  2. 从:192.168.142.144  
  3. mysql-proxy:192.168.142.137  
  4. client:192.168.142.150  


安装mysql-proxy
[html] view plain copy print?
  1. wget http://downloads.mysql.com/archives/get/file/mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz  
  2. 解压  


新建/etc/mysql-proxy.cnf配置文件
[html] view plain copy print?
  1. [mysql-proxy]  
  2. admin-username = root              #mysql-proxy 用户名  
  3. admin-password = toor   #mysql-proxy 密码  
  4. daemon = true   #以守护进程方式执行  
  5. keepalive = true   #保持连接(启动进程会有2个,一号进程用来监视二号进行,如果二号进程死掉自动重建  
  6. proxy-backend-addresses = 192.168.142.143:3306             #mysql主服务器ip端口  
  7. proxy-read-only-backend-addresses = 192.168.142.144:3306   #mysql从服务器ip端口  
  8. proxy-lua-script = /root/mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit/share/doc/mysql-proxy/rw-splitting.lua  #读写分离脚本(mysql-proxy自带)  
  9. admin-lua-script = /root/mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit/share/doc/mysql-proxy/admin-sql.lua     #admin脚本(mysql-proxy自带)                           
  10. log-file = /var/log/mysql-proxy.log  
  11. log-level = debug  


为达到测试效果,修改admin-sql.lua脚本以下两行:
[html] view plain copy print?
  1. if not proxy.global.config.rwsplit then  
  2.         proxy.global.config.rwsplit = {  
  3.                 min_idle_connections = 1, #默认为4,修改为1,用于指定最小连接为1时即执行读写分离  
  4.                 max_idle_connections = 1, #默认为8,修改为1  
  5.   
  6.   
  7.                 is_debug = false  
  8.         }  
  9. end  


启动mysql-proxy
[html] view plain copy print?
  1. 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从库。