mysql讀寫分離

MYSQL讀寫分離的原理其實就是讓Master數據庫處理事務性增、刪除、修改、更新操做(CREATE、INSERT、UPDATE、DELETE),而讓Slave數據庫處理SELECT操做,MYSQL讀寫分離前提是基於MYSQL主從複製,這樣能夠保證在Master上修改數據,Slave同步以後,WEB應用能夠讀取到Slave端的數據。mysql

實現MYSQL讀寫分離能夠基於第三方插件,也能夠經過開發修改代碼實現,具體實現的讀寫分離的常見方式有以下四種:linux

1  MySQL-Proxy讀寫分離sql

2  Amoeba讀寫分離數據庫

3  Mycat讀寫分離後端

4  基於程序讀寫分離(效率很高,實施難度大,開發改代碼服務器

Mysql-Proxy是MySQL官方提供的mysql中間件服務,支持無數客戶端鏈接,同時後端可鏈接若干臺Mysql-Server服務器,MYSQL-Proxy自身基於MySQL協議,鏈接MYSQL-Proxy的客戶端無需修改任何設置,跟正常鏈接MYSQL Server沒有區別,無需修改程序代碼。負載均衡

MySQL Proxy是App應用(客戶端)與MYSQL Server之間的一個鏈接代理,MySQL Proxy負責將APP應用的SQL請求根據轉發規則,轉發至相應的後端數據庫,基於lua腳本,能夠實現複雜的鏈接控制和過濾,從而實現數據讀寫分離和負載均衡的需求。測試

Mysql-Proxy容許用戶指定Lua腳本對SQL請求進行攔截,對請求進行分析與修改,還容許用戶指定Lua腳本對服務器的返回結果進行修改,加入一些結果集或者去除一些結果集,對SQL的請求一般爲讀請求、寫請求,基於Lua腳本,能夠實現將SQL讀請求轉發至後端Slave服務器,將SQL寫請求轉發至後端Master服務器。lua

配置過程步驟spa

1)下載MYSQL-Proxy軟件版本,解壓並重命名至/usr/local/mysql-proxy

wget http://ftp.ntu.edu.tw/pub/MySQL/Downloads/MySQL-Proxy/mysql-proxy-0.8.4-linux-el6-x86-64bit.tar.gz
useradd  -r  mysql-proxy
tar  zxvf  mysql-proxy-0.8.4-linux-el6-x86-64bit.tar.gz  -C  /usr/local
mv  /usr/local/mysql-proxy-0.8.4-linux-el6-x86-64bit  /usr/local/mysql-proxy

2)環境變量配置文件/etc/profile中加入以下代碼保存退出,而後執行source /etc/profile使環境變量配置生效便可

export  PATH=$PATH:/usr/local/mysql-proxy/bin/

3)啓動MYSQL-Proxy中間件,命令以下

mysql-proxy --daemon --log-level=debug --user=mysql-proxy --keepalive --log-file=/var/log/mysql-proxy.log --plugins="proxy" --proxy-backend-addresses="192.168.0.111:3306" --proxy-read-only-backend-addresses="192.168.0.112:3306" --proxy-lua-script="/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua" --plugins=admin --admin-username="admin" --admin-password="admin" --admin-lua-script="/usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua"

4)Mysql-Proxy的相關參數詳解以下

--help-all                   :獲取所有幫助信息;
--proxy-address=host:port    :代理服務監聽的地址和端口,默認爲4040;
--admin-address=host:port    :管理模塊監聽的地址和端口,默認爲4041;
--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    :進程文件名;

5)MYSQL-Proxy啓動後,在服務器端查看端口,其中4040爲proxy代理端口用於WEB應用鏈接,4041位管理端口用於SA或者DBA管理

6)基於4041端口MySQL-Proxy查看讀寫分離狀態,登陸4041管理端口

7)讀寫分離數據測試,以3306端口登陸到從庫,進行數據寫入和測試,在叢庫上建立good測試庫

8)讀寫分離數據測試,以4040代理端口登陸,執行以下命令,能夠查看到數據即證實讀寫分離成功。

mysql -h192.168.0.113  -uadmin -padmin  -P4040  -e "select  *  from  good.t1;"

爲了方便啓動與管理mysql-proxy能夠建立mysql-proxy服務管理腳本

#!/bin/sh

#
# mysql-proxy This script starts and stops the mysql-proxy daemon
#
# chkconfig: - 78 30
# processname: mysql-proxy
# description: mysql-proxy is a proxy daemon to mysql

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

#PROXY_PATH=/usr/local/bin
PROXY_PATH=/usr/local/mysql-proxy/bin

prog="mysql-proxy"

# Source networking configuration.
. /etc/sysconfig/network

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

# Set default mysql-proxy configuration.
#PROXY_OPTIONS="--daemon"

PROXY_OPTIONS="--proxy-read-only-backend-addresses=192.168.0.112:3306 --proxy-backend-addresses=192.168.0.111:3306 --proxy-lua-script=/usr/local/mysql-proxy/rw-splitting.lua"

PROXY_PID=/usr/local/mysql-proxy/run/mysql-proxy.pid

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

PATH=$PATH:/usr/bin:/usr/local/bin:$PROXY_PATH
# By default it's all good
RETVAL=0

# See how we were called.
case "$1" in
  start)
        # Start daemon.
        echo -n $"Starting $prog: "
        $NICELEVEL $PROXY_PATH/mysql-proxy $PROXY_OPTIONS --daemon --pid-file=$PROXY_PID --user=root --log-level=debug --log-file=/usr/local/mysql-proxy/log/mysql-proxy.log
        RETVAL=$?
        echo
        if [ $RETVAL = 0 ]; then
                touch /var/lock/subsys/mysql-proxy]
                echo "ok"
        fi
       ;;
  stop)
        # Stop daemons.
        echo -n $"Stopping $prog: "
        killproc $prog
        RETVAL=$?
        echo
        if [ $RETVAL = 0 ]; then
                rm -f /var/lock/subsys/mysql-proxy
                rm -f $PROXY_PID
        fi
       ;;
  restart)
        $0 stop
        sleep 3
        $0 start
       ;;
  condrestart)
       [ -e /var/lock/subsys/mysql-proxy ] && $0 restart
      ;;
  status)
        status mysql-proxy
        RETVAL=$?
       ;;
  *)
        echo "Usage: $0 {start|stop|restart|status|condrestart}"
        RETVAL=1
       ;;
esac
exit $RETVAL
#---我將mysql-proxy服務管理腳本放在了/usr/local/mysql-proxy/init.d/文件夾裏
#---給執行權限,創建相應目錄
#chmod +x /usr/local/mysql-proxy/init.d/mysql-proxy
#mkdir /usr/local/mysql-proxy/run
#mkdir /usr/local/mysql-proxy/log

#cd /usr/local/mysql-proxy/init.d/
#---啓動mysql-proxy
#./mysql-proxy start
#---中止mysql-proxy
#./mysql-proxy stop
#---重啓mysql-proxy
#./mysql-proxy restart
相關文章
相關標籤/搜索