千家信息网

mysql-proxy实现读写分离脚本

发表于:2025-01-22 作者:千家信息网编辑
千家信息网最后更新 2025年01月22日,将以下脚本保存为/etc/init.d/mysql-proxy ,赋予权限chmod 755 /etc/init.d/mysql-proxy#!/bin/bash## mysql-proxy This
千家信息网最后更新 2025年01月22日mysql-proxy实现读写分离脚本
  1. 将以下脚本保存为/etc/init.d/mysql-proxy ,赋予权限

    chmod 755 /etc/init.d/mysql-proxy

#!/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/functionsprog="/usr/local/mysql-proxy/bin/mysql-proxy"# Source networking configuration.if [ -f /etc/sysconfig/network ]; then    . /etc/sysconfig/networkfi# 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.pidPROXY_USER="mysql-proxy"# Source mysql-proxy configuration.if [ -f /etc/sysconfig/mysql-proxy ]; then    . /etc/sysconfig/mysql-proxyfiRETVAL=0start() {    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        ;;esacexit $RETVAL



2.为服务脚本提供配置文件/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-file=/var/log/mysql-proxy.log --plugins=proxy

--plugins=admin --proxy-backend-addresses=192.168.141.101:3306 --proxy-read-only-backend-ad

dresses=192.168.141.102:3306 --proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy

/rw-splitting.lua"


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

--[[ $%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"        }endfunction 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_RESULTend




0