Mysql 读写分离

    MySQL Replication

以将master的数据复制分布到多个slave上,然后可以利用slave来分担master的读压力。那么对于前台应用来说,就要考虑如何将读的压力
分布到多个slave上。如果每个应用都需要来实现读写分离的算法,一则成本太高,二来如果slave增加更多的机器,应用就要随之修改。明显的,如果在
应用和数据库间加一个专门用于实现读写分离的中间层,则整个系统的架构拥有更好的扩展性。MySQL
Proxy就是这么一个中间层代理,简单的说,MySQL Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用
lua脚本

可以实现复杂的连接控制和过滤,从而实现读写分离和负载平衡。对于应用来说,MySQL Proxy是完全透明的,应用则只需要连接到MySQL
Proxy的监听端口即可。当然,这样proxy机器可能成为单点失效,但完全可以使用多个proxy机器做为冗余,在应用服务器的连接池配置中配置到多
个proxy的连接参数即可。
安装过程如下:
1. 安装
下载已经编译好的安装包,或者预编译安装包均可,在这里,使用预编译版本。
tar zxf mysql-proxy-0.6.0-linux-rhas4-x86.tar.gz
cd mysql-proxy-0.6.0-linux-rhas4-x86
#将lua脚本放到/usr/local/share下
mv sbin/mysql-proxy /usr/local/sbin/
mv share/mysql-proxy /usr/local/share/
#删除符号连接等垃圾代码
strip /usr/local/sbin/mysql-proxy
编译启动管理脚本:
#!/bin/bash
export LUA_PATH=/usr/local/share/mysql-proxy/?.lua
mode=$1
if [ -z "$mode" ] ; then
  mode="start"
fi
case $mode in
  'start')
    mysql-proxy --daemon /
--admin-address=:4401 /
--proxy-address=:3307 /
--proxy-backend-addresses=192.168.1.225:3306 /
--proxy-read-only-backend-addresses=192.168.1.226:3306 /
--proxy-lua-script=/usr/local/share/mysql-proxy/rw-splitting.lua
    ;;
  'stop')
    killall mysql-proxy
    ;;
  'restart')
    if $0 stop ; then
      $0 start
    else
      echo  "retart failed!!!"
      exit 1
    fi
    ;;
esac
exit 0
启动脚本解释如下:
--daemon 采用daemon方式启动
--admin-address=:4401 指定mysql proxy的管理端口,在这里,表示本机的4401端口
--proxy-address=:3307 指定mysql proxy的监听端口,也可以用 127.0.0.1:3307表示
--proxy-backend-addresses=192.168.1.225:3306 指定写操作mysql主机的端口
--proxy-read-only-backend-addresses=192.168.1.226:3306 指定只读的mysql主机端口
--proxy-lua-script=/usr/local/share/mysql-proxy/rw-splitting.lua 指定lua脚本,在这里,使用的是rw-splitting脚本,用于读写分离.
完整的参数可以运行以下命令查看:
mysql-proxy --help-all
启动于关闭该脚本:
/etc/init.d/mysql-proxy start
/etc/init.d/mysql-proxy stop
blug修正:
找到/usr/local/share/mysql-proxy/rw-splitting.lua文件的下面这几行,修改成如下:
        if cmd.type ~= proxy.COM_INIT_DB and
           c.default_db and c.default_db ~= s.default_db then
                print("    server default db: " .. s.default_db .. "'")
                print("    client default db: " .. c.default_db .. "'")
                print("    syncronizing")
                proxy.queries:prepend(2, string.char(proxy.COM_INIT_DB) .. c.default_db)
        end
这个就解决了ERROR 1105 (07000): can't change DB  to on slave xxx.xxx.xxx.xxx:3306的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值