Centos5.6下MySQL Proxy0.8.2的安裝及測試html
參考:
http://www.hake.cc/a/shujuku/mysql/2012/0323/46760.html
Mysql-proxy就是一箇中間層代理,簡單的說,
mysql proxy就是一個鏈接池,負責將前臺應用的鏈接請求轉發給後臺的數據庫,而且經過使用lua腳本,能夠實現複雜的鏈接控制和過濾,從而實現讀寫分離和負載均衡。對於應用來講,mysql-proxy是徹底透明的,應用則只須要鏈接到mysql proxy的監聽端口便可。固然,這樣proxy機器可能成爲單點失效,但徹底可使用多個proxy機器作爲冗餘,在應用服務器的鏈接池中配置到多個proxy的鏈接參數便可。Mysql proxy更強大的一項功能是實現「讀寫分離」,基本原理是讓主數據庫處理事務性查詢,讓從庫處理select查詢。數據庫複製被用來把事務性查詢致使的變動同步到集羣中的從庫。在生成mysql的M-S結構後,爲了實現讀寫分離,須要使用mysql proxy。
Mysql proxy目前應用的生產環境
1. 現實中不少應用環境是這樣:在程序開發初期沒有規劃好,程序讀寫數據都只提供一個
IP接口,後期因爲壓力頂不住,公司要求後來的系統架構師/DBA將公司的數據庫架構更改,這樣在程序上實現比較困難,因此加進此中間層來實現。
2. 建議你們仍是將其應用中小型網站,特別是讀比較頻繁的網站。若是是大型網站或門戶網站的網站,建議讀寫分離仍是從開發層面實現。
3. 建議你們採用
mysql proxy0.8.0以上的版本,它修正了之前很多bug,並且穩定性也不錯。
Mysql proxy 0.8.2的安裝步驟以下:
Mysql proxy0.8.2安裝以前有先決條件以下:
libevent 1.x 或更高
(libevent-2.0.13-stable.tar.gz)
glib2 2.6.0 或更高
(glib-2.22.5.tar.gz)
lua 5.1.x 或更高
(lua-5.1.4.tar.gz)
pkg-config
(
yum安裝……)
libtool 1.5 或更高
(yum安裝……)
服務器操做系統:
CentOS 6.2 x86_64
Mysql proxy環境設置說明:
Mysql proxy服務器:
192.168.2.6
Mysql master服務器:
192.168.2.5
Mysql slave服務器:
192.168.2.4
i. 爲了加速安裝進度,咱們能夠先
yum安裝必須的庫,同時解決pkg-config、libtool和mysql開發庫,因爲mysql proxy實際並不須要在本機運行mysql實例,因此咱們這裏用yum安裝,命令以下:
#yum –y install gcc gcc-c++ autoconf mysqldevel libtool pkgconfig ncurses ncurses-devel
ii. 安裝
libevet
#tar zxvf libevent-2.0.13-stable.tar.gz
#cd libevent-2.0.13-stable
#./configure
#make && make install
iii. 安裝
glib
#tar zxvf glib-2.22.5.tar.gz
#cd glib-2.22.5
#./configure
#make && make install
iv. 安裝
readline
#tar zxvf readline-6.1.tar.gz
#cd readline-6.1
#./configure
#make && make install
爲了讓動態連接庫爲系統所共享,咱們這裏用
ldconfig
#ldconfig –v
用此選項,
ldconfig將顯示正在掃描的目錄及搜索到的動態連接庫,還有它所建立的鏈接的名字
v. 安裝
lua
#tar zxvf lua-5.1.4.tar.gz
#cd lua-5.1.4
64位系統,需在
CFLAGS里加上-fPIC,咱們用vim編輯下src/Makefile文件,修改代碼以下:
CGLAGS= -O2 –Wall –Fpic $(MYCFLAGS)
#make linux && make install
vi. 配置
pkg-config環境變量,命令以下:
#cp etc/lua.pc /usr/local/lib/pkgconfig
#export PKG_CONFIG_PATH=$PKG_COFNIG_PATH:/usr/local/lib/pkgconfig
以上操做就完成了基本文件安裝
mysql proxy0.8.2的安裝
vii. #tar zxvf mysql-proxy-0.8.2.tar.gz
#cd mysql-proxy-0.8.2
#./configure –prefix=/usr/local/mysql-proxy
#make && make install
#cp lib/rw-splitting.lua /usr/local/lib
#cp lib/admin.lua /usr/local/lib
到這裏
mysql-proxy已基本安裝完成,接下來就是mysql proxy的配置和測試了
a. mysql proxy選項說明,你們能夠用
mysql-proxy –help-all 查看它的幫助選項,命令以下:
#/usr/local/mysql-proxy/bin/mysql-proxy –help-all
代理功能選項:
-P, --proxy-address=<host:port>是
mysql-proxy服務器的監聽端口,缺省是4040,建議改成3306,方便開發人員寫代碼。
-r, --proxy-read-only-backend-
addresses
=<host:port>只讀
slave的地址和端口;
-b, --proxy-backend-
addresses
=<host:port>遠程
master地址和端口;
-s, --proxy-lua-script=<file>指定一個
lua腳原本控制mysql proxy的運行和設置,這個腳本在每次新建鏈接和腳本發生修改的時候講從新調用;
其餘選項:
--defaults-file=<file>配置文件,能夠把
mysql proxy的參數信息置入一個配置文件裏,比較方便;
--daemon mysql proxy以守護進程方式運行;
--pid-file=<file>設置
mysql proxy的存儲PID文件的路徑;
--keepalive保持鏈接啓動進程會有
2個,一號進程用來監視 二號進程,若是二號進程死掉重啓proxy,這是新版本mysql proxy增長的keepalived功能,它修正了之前mysql proxy容易死掉的bug,建議開啓。
Mysql proxy配置文件以下:
[root@CentOS bin]# cat /etc/mysql-proxy.cnf
[mysql-proxy]
admin-username=root
admin-password=123456
admin-lua-script=/usr/local/lib/admin.lua
proxy-read-only-backend-addresses=192.168.2.4
proxy-backend-addresses=192.168.2.5
proxy-lua-script=/usr/local/lib/rw-splitting.lua
log-file=/usr/local/mysql-proxy/mysql-proxy.log
log-level=debug
daemon=true
keepalive=true
b. 給相關服務器受權
在
master/slave上各創建一個用戶,以後客戶端發送的SQL都是經過mysql-proxy服務器來轉發,因此要保證能夠從mysql-proxy服務器登陸master和slave:
在
192.168.2.5和192.168.2.4上均執行此命令:
Mysql>grant all privileges on *.* to root@’192.168.2.6’ identified by ‘123456’;
Mysql>flush privileges;
添加完用戶以後,開始啓動
mysql-proxy,進行測試。
注:啓動以前需將mysql-proxy.cnf配置文件的權限設爲600(chomd 600 /etc/mysql-proxy.cnf),不然會報錯提示。
#/usr/local/mysql-proxy/bin/mysql-proxy –P 192.168.2.6:4040 --default-file=/etc/mysql-proxy.cnf
此時能夠查看進行,有兩個
[root@CentOS bin]# ps ax | grep mysql-proxy
31168 ?
S 0:00 /usr/local/mysql-proxy/bin/mysql-proxy -P 192.168.2.6:4040 --defaults-file=/etc/mysql-proxy.cnf
31169 ?
S 0:17 /usr/local/mysql-proxy/bin/mysql-proxy -P 192.168.2.6:4040 --defaults-file=/etc/mysql-proxy.cnf
此時能夠查看
mysql-proxy的日誌文件:
2012-12-27 13:04:17: (message) Initiating shutdown, requested from signal handler
2012-12-27 13:04:18: (message) shutting down normally, exit code is: 0
2012-12-27 13:04:18: (debug) chassis-unix-daemon.c:167: 31169 returned: 31169
2012-12-27 13:04:18: (message) chassis-unix-daemon.c:176: [angel] PID=31169 exited normally with exit-code = 0 (it used 1 kBytes max)
2012-12-27 13:04:18: (message) Initiating shutdown, requested from mysql-proxy-cli.c:604
2012-12-27 13:04:18: (message) shutting down normally, exit code is: 0
2012-12-27 13:04:28: (message) chassis-unix-daemon.c:136: [angel] we try to keep PID=31409 alive
2012-12-27 13:04:28: (debug) chassis-unix-daemon.c:157: waiting for 31409
2012-12-27 13:04:28: (debug) chassis-unix-daemon.c:121: we are the child: 31409
2012-12-27 13:04:28: (message)
mysql-proxy 0.8.2 started
2012-12-27 13:04:28: (debug) max open file-descriptors = 1024
2012-12-27 13:04:28: (message)
proxy listening on port 192.168.2.6:4040
2012-12-27 13:04:28: (message)
added read/write backend: 192.168.2.5
2012-12-27 13:04:28: (message)
added read-only backend: 192.168.2.4
接下來即是測試
mysql proxy的讀寫功能了,爲了快速看到效果,先在修改下rw-splitting.lua。
-- connection pool
if not proxy.global.config.rwsplit then
proxy.global.config.rwsplit = {
min_idle_connections = 1, //默認爲
4
max_idle_connections = 2, //默認爲
8
is_debug = true //默認爲
false
}
end
修改完成後,重啓
mysql-proxy。
測試讀寫分離效果
登陸主數據庫服務器:
192.168.2.5,爲了清晰的看到讀寫分離的效果,須要暫時關閉mysql主從複製的功能。在主mysql數據庫中的test數據庫常見表,並插入數據
Mysql>use test;
Database changed
Mysql>create table first_tb(id int(3),name char(10));
Query Ok,1 row affected(0.00 sec)
Mysql>insert into first_tb values (1,’myself’);
Query Ok, 1 row affected (0.00 sec)
mysql>select * from first_tb;
+------+-------+
| id
| name |
+------+-------+
|
1 | myself |
+------+-------+
1 row in set (0.00 sec)
在從
192.168.2.4mysql數據庫中的test中建立表並插入數據
mysql>use test;
Database changed
mysql>create table first_tb(id int(3),name char(10));
Query Ok, 1 row affected (0.00 sec)
mysql>insert into first_tb values (2,'yours');
Query Ok, 1 row affected (0.00 sec)
mysql>select * from first_tb;
+------+-------+
| id
| name |
+------+-------+
|
2 | yours |
+------+-------+
1 row in set (0.00 sec)
此時在
mysql-proxy192.168.2.6服務器上登陸
#mysql –uroot –p123456 –h192.168.2.6 –P4040
mysql> select * from test.first_tb;
+------+--------+
| id
| name |
+------+--------+
|
1 | myself |
+------+--------+
4 rows in set (0.00 sec)
顯示讀取的數據爲
192.168.2.5主數據庫中的數據,再從新打開一個mysql-proxy終端一樣select一下
#mysql –uroot –p123456 –h192.168.2.6 –P4040
mysql> select * from test.first_tb;
+------+--------+
| id
| name |
+------+--------+
|
2 | yours |
+------+--------+
4 rows in set (0.00 sec)
再打開終端請求過來,
select所有到192.168.2.4從庫上去查詢。此時在mysql-proxy上插入一條數據;
#mysql -uroot -ppassword -h192.168.2.6 -P4040 test
mysql> use test;
mysql>insert into first_tb values (110,'second');
而後分別去主從服務器上查看信息
mysql> select * from first_tb; (主
192.168.2.5)
+------+--------+
| id
| name |
+------+--------+
|
1 | myself |
| 110 | second |
+------+--------+
4 rows in set (0.00 sec)
mysql> select * from first_tb; (從
192.168.2.4)
+------+--------+
| id
| name |
+------+--------+
|
2 | yours |
+------+--------+
4 rows in set (0.00 sec)
可見寫到主數據庫(
192.168.2.5)中了,讀寫分離完成!
由此,咱們已經實現了
mysql讀寫分離,目前全部的寫操做都所有在master主服務器上,用來避免數據的不一樣步;
另外,全部的讀操做都分攤給了
slave從服務器,分擔數據庫的壓力;