這篇文章算是mysql數(shù)據(jù)庫主從配置的后續(xù)残炮,因為配置proxy的前提是需要配置數(shù)據(jù)庫的主從環(huán)境。如果不清楚主從數(shù)據(jù)庫怎么配置的同學(xué)可以參考:http://www.reibang.com/p/eed0ca8ba299
主從配置文章中的主數(shù)據(jù)庫和從數(shù)據(jù)庫的IP地址可能與這篇文章中的不一樣势就,這是因為弄proxy前重裝了虛擬機里面的系統(tǒng),但基本思想是一樣的蛋勺,望諒解鸠删。
首先說說proxy的基本用途和原理:
主從同步是將master庫中的數(shù)據(jù)同步到slave中贼陶,讀寫數(shù)據(jù)還是經(jīng)過master庫的,數(shù)據(jù)量少的時候還能負載的起碉怔,但當(dāng)數(shù)據(jù)量比較大的時候,因為讀寫都由master庫來執(zhí)行撮胧,所以性能將會急劇下降,所以才會提到讀寫分離锻离,在主從數(shù)據(jù)庫中铺峭,slave只會從所指定的master同步數(shù)據(jù)蜈膨,但一般不會被用來直接寫入數(shù)據(jù),因為這樣的話將造成主從不同步的問題莉炉,而master數(shù)據(jù)庫則是需要寫入數(shù)據(jù)供slave庫同步碴犬,所以,master庫可以用來只寫入數(shù)據(jù)用服协,而讀取數(shù)據(jù)就使用slave庫,這樣就可以使用讀寫分離治专,從而優(yōu)化數(shù)據(jù)庫的讀寫性能遭顶,提高讀寫效率张峰。
從圖中可以看到棒旗,SQL語句并不直接進入到master數(shù)據(jù)庫或者slave數(shù)據(jù)庫,而是進入到proxy饶深,然后proxy判斷這條語句是有關(guān)寫的語句(包括insert逛拱、update敌厘、delete)還是讀語句(select)朽合,當(dāng)時寫語句的時候,那么proxy將向master所在的服務(wù)器發(fā)出請求曹步,同理,如果是讀語句的時候讲婚,proxy將向slave所在的服務(wù)器發(fā)出請求。
首先是需要用到的數(shù)據(jù)庫服務(wù)器IP地址和有關(guān)環(huán)境:
Master(主)服務(wù)器IP:192.168.189.128
Slave(從)服務(wù)器IP:192.168.189.129
Proxy服務(wù)器IP:192.168.189.130
操作系統(tǒng):CentOS 6.9 64位
數(shù)據(jù)庫:MySQL 5.6
讀寫分離是由lua實現(xiàn)的活合,即lua是基礎(chǔ)組件,但聽說新版的已經(jīng)集成了lua芜辕,不知道是不是不再需要自己手動去安裝的意思尚骄,反正不差那么一步
# yum -y install gcc* gcc-c++* autoconf* automake* zlib* libxml* ncurses-devel* libmc rypt* libtool* flex* pkgconfig*
安裝需要一段時間侵续,在這段時間可以去下載proxy的tar包状蜗,這里用的是tar包宏邮,還沒嘗試過用yum來安裝蜜氨。
下載地址:https://downloads.mysql.com/archives/proxy/#downloads
如果Linux有圖形界面而且用的是虛擬機的話就好辦,直接拖進去就可以了郎汪,但如果沒有圖形界面或想要在Linux中上傳Windows的文件煞赢,那么需要參考到之前寫的這篇文章:
http://www.reibang.com/p/304ec5b0ae32
獲取到proxy的tar包之后就可以開始進行配置了照筑。
# tar zxvf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz //解壓文件
# mv mysql-proxy-0.8.5-linux-el6-x86-64bit /usr/local/mysql-proxy //將解壓得到的文件夾移動到某個位置,這個位置需要自己創(chuàng)建
將解壓得到的文件復(fù)制到對應(yīng)的位置
# cd /usr/local/mysql-proxy
# mkdir lua #創(chuàng)建腳本存放目錄
# mkdir logs #創(chuàng)建日志目錄
# cp share/doc/mysql-proxy/rw-splitting.lua ./lua #復(fù)制讀寫分離配置文件
# cp share/doc/mysql-proxy/admin-sql.lua ./lua #復(fù)制管理腳本
# vi /etc/mysql-proxy.cnf #創(chuàng)建配置文件
將以下復(fù)制到配置文件中弟断,并按照自己的需要修改
重點注意的是:#后面的文字只是為了讀者明白各個參數(shù)的意義昏翰,在實際的文件中最好刪除或者將注釋和參數(shù)放在不同的行棚菊,同時检碗,每個參數(shù)后面不能后空格折剃,一個空格都不行(重點怕犁!重點奏甫!重點!)款筑,這關(guān)系到最后啟動服務(wù)的問題奈梳,如果留有空格攘须,將啟動失敗于宙,筆者曾經(jīng)就踩了這個坑捞魁!
[mysql-proxy]
user=root #運行mysql-proxy用戶
admin-username=root #主從mysql共有的用戶
admin-password=123456 #用戶的密碼
proxy-address=192.168.189.130:4040 #mysql-proxy運行ip和端口奉件,不加端口,默認4040
proxy-read-only-backend-addresses=192.168.189.129 #指定后端從slave讀取數(shù)據(jù)
proxy-backend-addresses=192.168.189.128 #指定后端主master寫入數(shù)據(jù)
proxy-lua-script=/usr/local/mysql-proxy/lua/rw-splitting.lua #指定讀寫分離配置文件位置
admin-lua-script=/usr/local/mysql-proxy/lua/admin-sql.lua #指定管理腳本
log-file=/usr/local/mysql-proxy/logs/mysql-proxy.log #日志位置
log-level=info #定義log日志級別,由高到低分別有(error|warning|info|message|debug)
daemon=true #以守護進程方式運行
keepalive=true #mysql-proxy崩潰時摆碉,嘗試重啟
:wq保存后退出兆解,然后修改文件的權(quán)限
# chmod 660 /etc/mysql-proxy.cnf
修改讀寫分離配置文件
# vi /usr/local/mysql-proxy/lua/rw-splitting.lua
if not proxy.global.config.rwsplit then
proxy.global.config.rwsplit = {
min_idle_connections = 1, #默認超過4個連接數(shù)時,才開始讀寫分離现拒,改為1
max_idle_connections = 1, #默認8印蔬,改為1
is_debug = false
}
end
配置一下環(huán)境變量侥猬,不然將找不到mysql-proxy這個命令
# export PATH=$PATH:/usr/local/mysql-proxy/bin/
# echo "PATH=$PATH:/usr/local/mysql-proxy/bin" >> /etc/profile
配置完環(huán)境變量之后荤胁,可以使用該命令來測試一下是否配置成功
mysql-proxy --help
順便仅政,這里介紹一下各個參數(shù)的意義:
--help-all :獲取全部幫助信息圆丹;
--proxy-address=host:port :代理服務(wù)監(jiān)聽的地址和端口惊楼;
--admin-address=host:port :管理模塊監(jiān)聽的地址和端口;
--proxy-backend-addresses=host:port :后端mysql服務(wù)器的地址和端口;
--proxy-read-only-backend-addresses=host:port :后端只讀mysql服務(wù)器的地址和端口劣欢;
--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 :進程文件名醉者;
下面遍開始啟動mysql-proxy了
# mysql-proxy --defaults-file=/etc/mysql-proxy.cnf #開啟服務(wù)
# netstat -tupln | grep 4040 #已經(jīng)啟動
# tcp 0 0 192.168.189.130:4040 0.0.0.0:* LISTEN 1264/mysql-proxy
如果執(zhí)行開啟服務(wù)的命令后,后面沒有跟著一堆東西,說明配置成功了
下面開始讀寫分離的測試:
測試的話從網(wǎng)上看到的大致有兩種方法:
1粒竖、在主從和proxy配置正確的情況下,關(guān)閉從庫的服務(wù):slave stop岁歉;然后在proxy作查詢操作,正常情況下只能看到表非剃,但不能查詢到表里面的內(nèi)容
2备绽、另一種方法就是使用抓包的方式,這里主要使用這種方式,應(yīng)該比較容易理解
首先使用該命令分別在master服務(wù)器和slave服務(wù)器上監(jiān)聽:
其中eth部分是網(wǎng)卡的驅(qū)動名稱塌西,可以在/etc/sysconfig/network-scripts/中看到办桨,一般第一個顯示的就是崔挖,只需要eth*這部分就可以了
master服務(wù)器:
# tcpdump -i eth2 -nn -XX ip dst 192.168.189.128 and tcp dst port 3306
slave服務(wù)器:
# tcpdump -i eth1 -nn -XX ip dst 192.168.189.129 and tcp dst port 3306
然后需要登錄上proxy的服務(wù)器上的數(shù)據(jù)庫,準備對數(shù)據(jù)庫進行操作古沥。
# mysql -uroot -p123456 --port=4040 //注意,這里的端口號是前面配置文件里面寫的端口號盹沈,如果還是使用3306乞封,那么將登錄的不是proxy的數(shù)據(jù)庫
筆者這里使用方法是在Windows上的Navicat中遠程登錄肃晚,具體方法可以參考:http://www.reibang.com/p/fa4db03db9ca
對了,還有一點晋修,要確保這個數(shù)據(jù)庫與master還有slave的數(shù)據(jù)庫是一樣的廊蜒,比如原本master用含有test_db數(shù)據(jù)庫著榴,那么proxy和slave也應(yīng)該有,即是數(shù)據(jù)要同步
筆者這里已經(jīng)創(chuàng)建了一個名為test_db的數(shù)據(jù)庫和一張名為user的表作為測試用
然后在查詢中輸入一條insert語句并執(zhí)行
insert into user values(124);
然后查看master中的抓的包
從圖中可以看見可以抓取到insert的語句严卖,但再看看slave的監(jiān)聽結(jié)果發(fā)現(xiàn)并沒有結(jié)果
同樣的来颤,執(zhí)行一條查詢語句
select * from user;
然后再去看看slave的監(jiān)聽結(jié)果
會發(fā)現(xiàn),slave中能抓取到查詢時候的語句拷沸,但master中并沒有抓取到
總結(jié):
master中能抓取到有關(guān)寫的sql語句的包(update和delete讀者可以自行測試),但slave不能跨扮,同時帝嗡,slave能抓取到有關(guān)讀的sql語句的包,但master不能,說明這已經(jīng)完成了讀寫分離的配置了
其實這種配置方法只是將解壓到的包放到相應(yīng)的文件夾中喉脖,再弄個配置文件就OK了抑月,并沒有想象的那樣復(fù)雜,最主要的還是自己建的那個用來啟動的配置文件里面不能有錯谦絮,不能有空格(重要),這點要細心檢查性锭。