Mysql 讀寫分離

    MySQL Replication

以將master的數據複製分佈到多個slave上,然後可以利用slave來分擔master的讀壓力。那麼對於前臺應用來說,就要考慮如何將讀的壓力
分佈到多個slave上。如果每個應用都需要來實現讀寫分離的算法,一則成本太高,二來如果slave增加更多的機器,應用就要隨之修改。明顯的,如果在
應用和數據庫間加一個專門用於實現讀寫分離的中間層,則整個系統的架構擁有更好的擴展性。MySQL
Proxy就是這麼一箇中間層代理,簡單的說,MySQL Proxy就是一個連接池,負責將前臺應用的連接請求轉發給後臺的數據庫,並且通過使用
lua腳本

可以實現複雜的連接控制和過濾,從而實現讀寫分離和負載平衡。對於應用來說,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的問題。

發佈了27 篇原創文章 · 獲贊 1 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章