MySQL Proxy实现数据库读写分离

能够将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-on ly-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-on ly-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的问题。
相关文章
相关标签/搜索