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