程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> MySQL Proxy實現數據庫讀寫分離

MySQL Proxy實現數據庫讀寫分離

編輯:關於MYSQL數據庫
可以將master的數據復制分布到多個slave上,然後可以利用slave來分擔master的讀壓力。那麼對於前台應用來說,就要考慮如何將讀的壓力
分布到多個slave上。如果每個應用都需要來實現讀寫分離的算法,一則成本太高,二來如果slave增加更多的機器,應用就要隨之修改。明顯的,如果在
應用和數據庫間加一個專門用於實現讀寫分離的中間層,則整個系統的架構擁有更好的擴展性。MySQL
Proxy就是這麼一個中間層代理,簡單的說,
MySQL Proxy就是一個連接池,負責將前台應用的連接請求轉發給後台的數據庫,並且通過使用,
可以實現復雜的連接控制和過濾,從而實現讀寫分離和負載平衡。對於應用來說,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-only-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-only-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的問題。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved