Centos5.6下MySQL Proxy0.8.2的安裝及測試

來源:互聯網
上載者:User

BKJIA獨家特稿】MySQL Proxy就是這麼一個中介層代理,簡單的說,MySQL Proxy就是一個串連池,負責將前台應用的串連請求轉寄給背景資料庫,並且通過使用lua指令碼,可以實現複雜的串連控制和過濾,從而實現讀寫分離和Server Load Balancer。對於應用來說,MySQL Proxy是完全透明的,應用則只需要串連到MySQL Proxy的監聽連接埠即可。當然,這樣proxy機器可能成為單點失效,但完全可以使用多個proxy機器做為冗餘,在應用伺服器的串連池配置中配置到多個proxy的串連參數即可。MySQL Proxy更強大的一項功能是實現“ 讀寫分離”,基本原理是讓主要資料庫處理事務性查詢,讓從庫處理SELECT查詢。資料庫複寫被用來把事務性查詢導致的變更同步到叢集中的從庫。在產生Mysql的M-S結構後,為了實現讀寫分離,需要使用Mysql Proxy。目前Mysql Proxy的版本為0.8.2 。

MySQl Proxy目前應用的生產環境:

一、現實中很多應用環境是這樣:在程式開發初期就沒有規劃好,程式讀寫資料都只提供一個IP介面,後期由於壓力頂不住,公司要求後來的系統架構師/DBA將公司的資料庫結構描述更改,這樣在程式上實現比較困難,所以加進此中介層來實現。

二、建議大家還是將其應用中小型網站,特別是讀比較頻繁的網站。如果是大型網站或門戶型的網站,建議讀寫分離還是從開發層面實現。

三、建議大家採用MySQL Proxy 0.8.0以上的版本,它修正了以前不少BUG,而且穩定性也不錯。

一、MySQL Proxy0.8.2的安裝步驟如下:

先從mysql.com官方地址http://dev.mysql.com/downloads/mysql-proxy/下載源碼包到/usr/local/src/目錄下,建議大家採用最新的MySQL Proxy0.8.2版本,Mysql Proxy0.8.2安裝之前有先決條件,如下:

libevent 1.x 或更高
glib2 2.6.0 或更高
lua 5.1.x 或更高
pkg-config
libtool 1.5 或更高
MySQL 5.0.x 或更高的開發庫

伺服器作業系統:Centos5.6 x86_64

1.為了加速安裝進度,我們可以先yum安裝必須的庫,同時解決pkg-config、libtool和Mysql開發庫,由於mysql-proxy實際並不需要在本機上運行mysql執行個體,所以我們在這裡用yum安裝,命令如下所示:

 
  1. yum -y install gcc gcc-c++ autoconf mysql-devel libtool pkgconfig ncurses ncurses-devel 

2.libevent安裝libevent-2.0.13版本,從此處可以下載:

http://monkey.org/~provos/libevent-2.0.13-stable.tar.gz

運行如下命令進行安裝:

 
  1. tar xvf libevent-2.0.13-stable.tar.gz  
  2. cd libevent-2.0.13-stable  
  3. ./configure  
  4. make && make install 

3.glib2安裝glib-2.18.4版,從此處可以下載:

http://ftp.gnome.org/pub/gnome/sources/glib/2.18/glib-2.18.4.tar.gz

運行如下命令進行安裝:

 
  1. tar xvf glib-2.18.4.tar.gz  
  2. cd glib-2.18.4  
  3. ./configure  
  4. make && make install 

4.lua安裝5.1.4版本,安裝之前需要先安裝readline 6.1,不然會報錯缺少標頭檔:

readline 6.1下載:

ftp://ftp.cwru.edu/pub/bash/readline-6.1.tar.gz

運行如下命令進行安裝:

 
  1. tar xvf readline-6.1.tar.gz     
  2. cd readline-6.1  
  3. ./configure  
  4. make && make install 

為了讓動態連結程式庫為系統所共用,我們這裡用ldconfig

 
  1. ldconfig -v 

用此選項時,ldconfig將顯示正在掃描的目錄及搜尋到的動態連結程式庫,還有它所建立的串連的名字。

5.安裝lua 5.1.4,其為http://www.lua.org/ftp/lua-5.1.4.tar.gz。

 
  1. cd /usr/local/src  
  2. tar xvf lua-5.1.4.tar.gz  
  3. cd lua-5.1.4 

# 64位系統,需在CFLAGS裡加上-fPIC ,我們用vim編輯下src/Makefile檔案,修改代碼如下所示:

 
  1. CFLAGS= -O2 -Wall -fPIC $(MYCFLAGS) 

我們繼續用如下命令進行安裝:

 
  1. make linux  
  2. make install 

6.配置pkg-config 環境變數,命令如下所示:

 
  1. cp etc/lua.pc /usr/local/lib/pkgconfig/   
  2. export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig 

7.以上操作就完成了基礎檔案的安裝,接下來是MySQL Proxy0.8.2安裝,下載完後運行如下命令:

 
  1. tar xvf mysql-proxy-0.8.2.tar.gz  
  2. cd mysql-proxy-0.8.2  
  3. ./configure –prefix=/usr/local/mysql-proxy  
  4. make && make install  
  5. cp lib/rw-splitting.lua /usr/local/lib/  
  6. cp lib/admin.lua /usr/local/lib/ 

二、到這裡MySQL-proxy已基本安裝完成,接下來就是MySQL Proxy0.8.2的測試和配置了。

MySQL Proxy環境設定說明

Master  MySQL伺服器:192.168.2.117

Slave MySQL伺服器:192.168.192.168.2.115

MySQL Proxy伺服器:192.168.2.112

1.mysql-proxy選項說明,大家也可以用mysql-proxy –help-all查看它的協助選項,命令如下所示:

 
  1. mysql-proxy --help-all 

管理功能選項:

 
  1. --admin-address=host:port 指定一個mysqo-proxy的管理連接埠,預設是4041;  
  2. --admin-username=<string> username to allow to log in  
  3. --admin-password=<string> password to allow to log in  
  4. --admin-lua-script=<filename> script to execute by the admin plugin 

代理功能選項:

-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地址和連接埠,可設定多個做failover和load balance,預設是127.0.0.1:3306;
--proxy-skip-profiling 關閉查詢分析功能, 預設是開啟的;
--proxy-fix-bug-25371 修正 mysql的libmysql版本大於5.1.12的一個#25371號bug;
-s,--proxy-lua-script=<file> 指定一個Lua指令碼來控制mysql-proxy的運行和設定,這個指令碼在每次建立串連和指令碼發生修改的的時候將重新調用;

其他選項:

--defaults-file=<file>設定檔,可以把mysql-proxy的參數資訊置入一個設定檔裡,建議大家用這種配置MySQL Proxy0.8.2,比較方便;
--daemon mysql-proxy以守護進程方式運行;
--pid-file=file 設定mysql-proxy的儲存PID檔案的路徑;
--keepalive try to restart the proxy if it crashed,保持串連啟動進程會有2個, 一號進程用來監 視二號進程, 如果二號進程死掉自動重啟proxy,這是新版MySQL Proxy的增加的Keepalived功能,它修正了以前MySQL Proxy容易死掉的bug,建議大家開啟此功能。

完整的mysql-proxy設定檔如下:
 

 
  1. [mysql-proxy]  
  2. admin-username=root  
  3. admin-password=123456  
  4. admin-lua-script=/usr/local/lib/admin.lua  
  5. proxy-read-only-backend-addresses=192.168.2.115  
  6. proxy-backend-addresses=192.168.2.117  
  7. proxy-lua-script=/usr/local/lib/rw-splitting.lua  
  8. log-file=/var/log/mysql-proxy.log  
  9. log-level=debug  
  10. daemon=true 
  11. keepalive=true 

2.給使用者授權
在Master/Slave建立一個測試使用者,因為以後用戶端發送的SQL都是通過mysql-proxy伺服器來轉寄,所以要確保可以從mysql-proxy伺服器上登入MySQL主從庫,分別在主和從MySQL機器上執行如下所示:

 
  1. mysql> grant all privileges on *.* to 'test'@'192.168.2.117' identified by 'test' with  grant option;  
  2. mysql> grant all privileges on *.* to 'test'@'192.168.2.115' identified by 'test' with  grant option; 

3.做完此步我們就可以在MySQL Proxy0.8.2上進行測試了,命令如下所示:

 
  1. /usr/local/mysql-proxy/bin/mysql-proxy -P 192.168.2.112:3306 --defaults-file=/etc/mysql-proxy.cnf  

我們監測下MySQL Proxy的日誌,有如下字樣表示MySQL Proxy已成功啟動了注意之前要成功啟動117和115上的mysql程式),如下所示:
2012-03-13 14:05:38: (message) added read-only backend: 192.168.2.115
2012-03-13 16:14:56: (message) proxy-plugin.c.1508: connect(192.168.2.115:3306) failed: Connection refused. Retrying with different backend.
2012-03-14 13:58:23: (message) chassis-unix-daemon.c:136: [angel] we try to keep PID=2399 alive
2012-03-14 13:58:23: (debug) chassis-unix-daemon.c:157: waiting for 2399
2012-03-14 13:58:23: (debug) chassis-unix-daemon.c:121: we are the child: 2399
2012-03-14 13:58:23: (message) mysql-proxy 0.8.2 started
2012-03-14 13:58:23: (debug) max open file-descriptors = 1024
2012-03-14 13:58:23: (message) proxy listening on port 192.168.2.112:3306
2012-03-14 13:58:23: (message) added read/write backend: 192.168.2.117
2012-03-14 13:58:23: (message) added read-only backend: 192.168.2.115

我們多開些MySQL用戶端,會發現MySQL Proxy0.8.2很容易的利用Lua指令碼實現讀寫分離功能了,在進行測試前我比較擔心的一個問題是:如果主Master因故障停止服務了,MySQL Proxy會不會在從機上面寫資料呢?這樣會導致主從資料不一,事實上,我在停掉192.168.2.117上的MySQL時發現,MySQL Proxy0.8.2直接不允許寫資料了。

三、MySQL Proxy0.8.2測試中遇到的問題。
1.我們可以修改讀寫分離Lua指令碼,讓測試更容易,Lua指令碼預設最小4個最大8個以上的用戶端串連才會實現讀寫分離這是因為mysql-proxy會檢測用戶端串連, 當串連沒有超過min_idle_connections預設值時,不會進行讀寫分離,即查詢操作會發生到Master上),現改為最小1個最大2個,我們用vim修改/usr/local/lib/rw-splitting.lua指令碼,改動內容如下所示:

 
  1. if not proxy.global.config.rwsplit then  
  2.         proxy.global.config.rwsplit = {  
  3.                 min_idle_connections = 1,  
  4.                 max_idle_connections = 2,  
  5.  
  6.                 is_debug = false 
  7.         }  
  8. end 

2.MySQL Proxy0.8.2啟動後,我們看的網站頁面全是亂碼,所以我們要將主從資料庫的設定檔my.cnf加進如下代碼以避免這個問題:

 
  1. [mysqld]  
  2. skip-character-set-client-handshake  
  3. init-connect='SET NAMES utf8' 
  4. default-character-set=utf8 

3.設定檔的許可權問題

建議使用設定檔的形式啟動,注意設定檔必須是660許可權,否則無法啟動。如果有多個Slave的話,proxy-read-only-backend-addresses參數可以配置多個以逗號分隔的IP:Port從庫列表。

注意的是,雖然以前的MySQL Proxy的版本存在著這樣或那樣的問題,但新版的MySQL Proxy0.8.2基本都修正這些Bug了,而且它畢竟是MySQL官方推出的產品,而且相對於Amoeba而言,MySQL Proxy支援事務,我們在生產環境下可以嘗試將其用之於代碼已固定而且不能更改、的中小型網站。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.