zoukankan      html  css  js  c++  java
  • mysql-proxy实现读写分离


    一、安装配置mysql-proxy:


    1.1下载所需要的版本,这里的系统平台为centos6.5 64位系统,因此就以mysql-proxy-0.8.3-linux-glibc2.3-x86-64bit.tar.gz为例


    # tar xf mysql-proxy-0.8.3-linux-glibc2.3-x86-64bit.tar.gz -C /usr/local
    # cd /usr/local
    # ln -sv mysql-proxy-0.8.3-linux-glibc2.3-x86-64bit mysql-proxy
    # cd mysql-proxy

    添加代理用户

    # useradd mysql-proxy

    1.2 为mysql-proxy提供SysV服务脚本,内容如下所示


    #!/bin/bash
    #
    # mysql-proxy This script starts and stops the mysql-proxy daemon
    #
    # chkconfig: - 78 30
    # processname: mysql-proxy
    # description: mysql-proxy is a proxy daemon for mysql


    # Source function library.
    . /etc/rc.d/init.d/functions


    prog="/usr/local/mysql-proxy/bin/mysql-proxy"


    # Source networking configuration.
    if [ -f /etc/sysconfig/network ]; then
        . /etc/sysconfig/network
    fi


    # Check that networking is up.
    [ ${NETWORKING} = "no" ] && exit 0


    # Set default mysql-proxy configuration.
    ADMIN_USER="admin"
    ADMIN_PASSWD="admin"
    ADMIN_LUA_SCRIPT="/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua"
    PROXY_OPTIONS="--daemon"
    PROXY_PID=/var/run/mysql-proxy.pid
    PROXY_USER="mysql-proxy"


    # Source mysql-proxy configuration.
    if [ -f /etc/sysconfig/mysql-proxy ]; then
        . /etc/sysconfig/mysql-proxy
    fi


    RETVAL=0


    start() {
        echo -n $"Starting $prog: "
        daemon $prog $PROXY_OPTIONS --pid-file=$PROXY_PID --proxy-address="$PROXY_ADDRESS" --user=$PROXY_USER --admin-username="$ADMIN_USER" --admin-lua-script="$ADMIN_LUA_SCRIPT" --admin-password="$ADMIN_PASSWORD"
        RETVAL=$?
        echo
        if [ $RETVAL -eq 0 ]; then
            touch /var/lock/subsys/mysql-proxy
        fi
    }


    stop() {
        echo -n $"Stopping $prog: "
        killproc -p $PROXY_PID -d 3 $prog
        RETVAL=$?
        echo
        if [ $RETVAL -eq 0 ]; then
            rm -f /var/lock/subsys/mysql-proxy
            rm -f $PROXY_PID
        fi
    }
    # See how we were called.
    case "$1" in
        start)
            start
            ;;
        stop)
            stop
            ;;
        restart)
            stop
            start
            ;;
        condrestart|try-restart)
            if status -p $PROXY_PIDFILE $prog >&/dev/null; then
                stop
                start
            fi
            ;;
        status)
            status -p $PROXY_PID $prog
            ;;
        *)
            echo "Usage: $0 {start|stop|restart|reload|status|condrestart|try-restart}"
            RETVAL=1
            ;;
    esac


    exit $RETVAL


    将上述内容保存为/etc/rc.d/init.d/mysql-proxy,给予执行权限,而后加入到服务列表。
    # chmod +x /etc/rc.d/init.d/mysql-proxy
    # chkconfig --add mysql-proxy

    1.3 为服务脚本提供配置文件/etc/sysconfig/mysql-proxy,内容如下所示:


    # Options for mysql-proxy 
    ADMIN_USER="admin"
    ADMIN_PASSWORD="admin"
    ADMIN_ADDRESS=""
    ADMIN_LUA_SCRIPT="/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua"
    PROXY_ADDRESS=""
    PROXY_USER="mysql-proxy"
    PROXY_OPTIONS="--daemon --log-level=info --log-use-syslog"




    其中最后一行,需要按实际场景进行修改,例如:


    PROXY_OPTIONS="--daemon --log-level=info --log-use-syslog --plugins=proxy --plugins=admin --proxy-backend-addresses=192.168.8.40:3306 --proxy-read-only-backend-addresses=192.168.8.43:3306 --proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua"


    其中的proxy-backend-addresses选项和proxy-read-only-backend-addresses选项均可重复使用多次,以实现指定多个读写服务器或只读服务器。

    1.4 mysql-proxy的配置选项



    mysql-proxy的配置选项大致可分为帮助选项、管理选项、代理选项及应用程序选项几类,下面一起去介绍它们。


    --help
    --help-admin
    --help-proxy
    --help-all ———— 以上四个选项均用于获取帮助信息;


    --proxy-address=host:port ———— 代理服务监听的地址和端口;
    --admin-address=host:port ———— 管理模块监听的地址和端口;
    --proxy-backend-addresses=host:port ———— 后端mysql服务器的地址和端口;
    --proxy-read-only-backend-addresses=host:port ———— 后端只读mysql服务器的地址和端口;
    --proxy-lua-script=file_name ———— 完成mysql代理功能的Lua脚本;
    --daemon ———— 以守护进程模式启动mysql-proxy;
    --keepalive ———— 在mysql-proxy崩溃时尝试重启之;
    --log-file=/path/to/log_file_name ———— 日志文件名称;
    --log-level=level ———— 日志级别;
    --log-use-syslog ———— 基于syslog记录日志;
    --plugins=plugin,.. ———— 在mysql-proxy启动时加载的插件;
    --user=user_name ———— 运行mysql-proxy进程的用户;
    --defaults-file=/path/to/conf_file_name ———— 默认使用的配置文件路径;其配置段使用[mysql-proxy]标识;
    --proxy-skip-profiling ———— 禁用profile;
    --pid-file=/path/to/pid_file_name ———— 进程文件名;



    1.5、复制如下内容建立admin.lua文件,将其保存至/usr/local/mysql-proxy/share/doc/mysql-proxy/目录中

    直接编辑lua脚本 # vim share/doc/mysql-proxy/admin.lua 格式无法控制
    通过将代码拷贝到vim /root/admin.txt拷贝进目标文件中
    # cat /root/admin.txt > share/doc/mysql-proxy/admin.lua


    --[[ $%BEGINLICENSE%$
     Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved.


     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
     published by the Free Software Foundation; version 2 of the
     License.


     This program is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
     GNU General Public License for more details.


     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
     02110-1301  USA


     $%ENDLICENSE%$ --]]


    function set_error(errmsg) 
    proxy.response = {
    type = proxy.MYSQLD_PACKET_ERR,
    errmsg = errmsg or "error"
    }
    end


    function read_query(packet)
    if packet:byte() ~= proxy.COM_QUERY then
    set_error("[admin] we only handle text-based queries (COM_QUERY)")
    return proxy.PROXY_SEND_RESULT
    end


    local query = packet:sub(2)


    local rows = { }
    local fields = { }


    if query:lower() == "select * from backends" then
    fields = { 
    { name = "backend_ndx", 
     type = proxy.MYSQL_TYPE_LONG },


    { name = "address",
     type = proxy.MYSQL_TYPE_STRING },
    { name = "state",
     type = proxy.MYSQL_TYPE_STRING },
    { name = "type",
     type = proxy.MYSQL_TYPE_STRING },
    { name = "uuid",
     type = proxy.MYSQL_TYPE_STRING },
    { name = "connected_clients", 
     type = proxy.MYSQL_TYPE_LONG },
    }


    for i = 1, #proxy.global.backends do
    local states = {
    "unknown",
    "up",
    "down"
    }
    local types = {
    "unknown",
    "rw",
    "ro"
    }
    local b = proxy.global.backends[i]


    rows[#rows + 1] = {
    i,
    b.dst.name,          -- configured backend address
    states[b.state + 1], -- the C-id is pushed down starting at 0
    types[b.type + 1],   -- the C-id is pushed down starting at 0
    b.uuid,              -- the MySQL Server's UUID if it is managed
    b.connected_clients  -- currently connected clients
    }
    end
    elseif query:lower() == "select * from help" then
    fields = { 
    { name = "command", 
     type = proxy.MYSQL_TYPE_STRING },
    { name = "description", 
     type = proxy.MYSQL_TYPE_STRING },
    }
    rows[#rows + 1] = { "SELECT * FROM help", "shows this help" }
    rows[#rows + 1] = { "SELECT * FROM backends", "lists the backends and their state" }
    else
    set_error("use 'SELECT * FROM help' to see the supported commands")
    return proxy.PROXY_SEND_RESULT
    end


    proxy.response = {
    type = proxy.MYSQLD_PACKET_OK,
    resultset = {
    fields = fields,
    rows = rows
    }
    }
    return proxy.PROXY_SEND_RESULT
    end



    6、测试

    # service mysql-proxy start


    报错:
    ERROR 1045 (28000): Access denied for user 'admin'@'localhost' (using password: YES)


    通过查看错误日志:
    # cd /var/log
    # tail message
    -------------------------------
    2015-12-25 23:17:39: (critical) network-socket.c:451: bind(0.0.0.0:3306) failed: Address already in use (98)
    Dec 25 23:17:39 centossz008 mysql-proxy: 2015-12-25 23:17:39: (critical) chassis-mainloop.c:267: applying config of plugin proxy failed
    Dec 25 23:17:39 centossz008 mysql-proxy: 2015-12-25 23:17:39: (critical) mysql-proxy-cli.c:597: Failure from chassis_mainloop. Shutting down.
    -------------------------------


    发现是本机启动了mysql服务,停用再重新启动mysql-proxy即可

    6.1 管理功能测试



    # mysql -uadmin -padmin -h192.168.8.44 --port=4041


    MySQL [(none)]> select * from help;
    ERROR 1105 (07000): MySQL Proxy Lua script failed to load. Check the error log.


    再次查看日志:
    Dec 25 23:51:33 centossz008 mysql-proxy: 2015-12-25 23:51:33: (critical) last message repeated 2 times
    Dec 25 23:51:33 centossz008 mysql-proxy: 2015-12-25 23:51:33: (critical) network-mysqld-lua.c:234: lua_load_file(/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua) failed: [string "/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua"]:1: '=' expected near '%'


    发现/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua 文件少了前面的--[[ 
    添加即可


    MySQL [(none)]> select * from help;
    +------------------------+------------------------------------+
    | command                | description                        |
    +------------------------+------------------------------------+
    | SELECT * FROM help     | shows this help                    |
    | SELECT * FROM backends | lists the backends and their state |
    +------------------------+------------------------------------+
    2 rows in set (0.00 sec)


    MySQL [(none)]> select * from backends;
    +-------------+-------------------+---------+------+------+-------------------+
    | backend_ndx | address           | state   | type | uuid | connected_clients |
    +-------------+-------------------+---------+------+------+-------------------+
    |           1 | 192.168.8.40:3306 | unknown | rw   | NULL |                 0 |
    |           2 | 192.168.8.43:3306 | unknown | ro   | NULL |                 0 |
    +-------------+-------------------+---------+------+------+-------------------+
    2 rows in set (0.00 sec)

  • 相关阅读:
    11 MySQL视图
    10 MySQL索引选择与使用
    08 MySQL存储引擎
    09 MySQL字符集
    06 MySQL运算符
    07 MySQL常用内置函数
    05 MySQL数据类型的选择与使用
    04 MySQL数据类型
    js 当前日期后7天
    md5加密
  • 原文地址:https://www.cnblogs.com/reblue520/p/6239860.html
Copyright © 2011-2022 走看看