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的問題。
Mysql 讀寫分離
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.