能夠將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-on ly-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-on ly-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的問題。