程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> MySQL-Proxy 實現 MySQL 的負載均衡和讀寫分離

MySQL-Proxy 實現 MySQL 的負載均衡和讀寫分離

編輯:關於MYSQL數據庫
 MySQL proxy是MySQL官方開發一個MySQL數據庫前端代理,使用C語言編寫,並且支持lua來編寫proxy規則,可以用來實現MySQL的讀寫分離,負載均衡等等功能.
MySQL-Proxy 實現 MySQL 的負載均衡和讀寫分離一:安裝MySQL-Proxy1)系統環境的設置(系統為CentOs 5.2):
確定這些包已經安裝:GNU Autotools, flex, pkg-config, bazaar, MySQL client librarIEs
[root@xutest opt]# yum install autoconf automake libtool flex pkgconfig bzr MySQL-devel
因為系統自帶的libevent 和 glib的版本都比較低,然而MySQL proxy 0.7.0對其版本要求是libevent>1.4.0,glib2>2.1.16.因此要手動編譯.A:libevent
[root@xutest opt]#wget http://www.dbasky.Net/tool/libevent-1.4.9-stable.tar.gz
[root@xutest opt]#tar zvfx libevent-1.4.9-stable.tar.gz
[root@xutest opt]#cd libevent-1.4.9-stable
[root@xutest opt]#./configure
[root@xutest opt]#make
[root@xutest opt]#make install

B:GLIB
[root@xutest opt]# wget http://www.dbasky.Net/tool/glib-2.18.4.tar.gz
[root@xutest opt]#tar zvfx glib-2.18.4.tar.gz
[root@xutest opt]#cd glib-2.18.4
[root@xutest opt]#./configure
[root@xutest opt]#make
[root@xutest opt]#make install
2)安裝lua 5.1
[root@xutest opt]#wget http://www.dbasky.Net/tool/lua-5.1.4.tar.gz
[root@xutest opt]#tar zvfx lua-5.1.4.tar.gz
[root@xutest opt]#cd lua-5.1.4
[root@xutest opt]#vi src/Makefile   #在64位機上編譯出現了"relocations"錯誤,需要在CFLAGS裡加上-fPIC.
[root@xutest opt]#make Linux
[root@xutest opt]#make install
[root@xutest opt]#cp etc/lua.pc /usr/local/lib/pkgconfig/
重要:讓pkg-config找到自己編譯的庫在哪裡
[root@xutest opt]#export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
3)安裝MySQL-proxy
[root@xutest opt]#wget http://www.dbasky.Net/tool/MySQL-proxy-0.7.0.tar.tar
[root@xutest opt]#tar zxvf MySQL-proxy-0.7.0.tar.tar
[root@xutest opt]#cd MySQL-proxy-0.7.0
[root@xutest opt]#./configure
[root@xutest opt]#make
[root@xutest opt]#make check
[root@xutest opt]#make install
編譯完成,可以檢查一下最終結果:
[root@xutest opt]#MySQL-proxy -V
mysql-proxy: error while loading shared librarIEs: /usr/local/lib/libMySQL-chassis.so.0: cannot restore segment prot after reloc: Permission denIEd
解決辦法:
編輯/etc/seLinux/config,找到這段:
# This file controls the state of SELinux on the system.
# SELinux= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - SELinux is fully disabled.
SELinux=enforcing
把 SELINUX=enforcing 注釋掉:#SELinux=enforcing ,然後新加一行為:
SELinux=disabled
保存,關閉
在你保證SELinux 被disable後.還執行下:chcon -t texrel_shlib_t
例:
[root@testserver mysql-proxy-0.7.0]# chcon -t texrel_shlib_t /usr/local/lib/libMySQL-chassis.so.0
再一次檢查:
[root@xutest opt]#MySQL-proxy -V
MySQL-proxy 0.7.0
  glib2: 2.18.4
  libevent: 1.1a
  admin: 0.7.0
  proxy: 0.7.0

二:使用:
[root@xutest opt]#MySQL-proxy --help-all           #查看所有的設置選項               
                  
管理功能選項--admin-address=host:port -- 指定一個mysqo-proxy的管理端口,缺省是 4041
代理功能選項--proxy-address=host:port -- 這個是MySQL-proxy 服務器端的監聽端口,缺省是 4040
--proxy-read-only-backend-addresses=<host:port> -- 遠程只讀Slave服務器的地址和端口,缺省為不設置(本選項在MySQL-proxy0.5.0版本中沒有)
--proxy-backend-addresses=host:port -- 指定遠程MySQL服務器地址和端口,可以設置多個,
--proxy-skip-profiling -- 關閉查詢分析功能,缺省是打開的
--proxy-fix-bug-25371 -- 修正 mysql的libMySQL版本大於5.1.12的一個#25371號bug
--proxy-lua-script=file -- 指定一個Lua腳本程序來控制MySQL-proxy的運行和設置,這個腳本在每次新建連接和腳本發生修改的的時候將重新調用
其他選項--daemon -- MySQL-proxy以守護進程方式運行
--pid-file=file -- 設置MySQL-proxy的存儲PID文件的路徑

例:
  監聽本地MySQL 3307端口:
[root@xutest opt]#/usr/local/sbin/MySQL-proxy --proxy-backend-addresses=127.0.0.1:3307
通過其它機器的MySQL客戶端連接:
[root@server ~]#/usr/local/mysql/bin/MySQL -uroot -h 192.168.1.6 -p 4040
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 32
Server version: 5.0.45Type 'help;' or '\h' for help. Type '\c' to clear the buffer.MySQL>

例:對兩台或者多台MySQL的負載均衡:
        假設有兩台Slave的讀數據服務器,我們使用MySQL_proxy多個數據庫的輪詢技術來進行兩台Slave數據庫的負載均衡分散訪問措施,mysql-proxy可以做到,缺省就具有了簡單的均衡功能,它自帶的均衡功能是當有多台MySQL服務器的時候,進行逐個訪問的原則,比如有A、B兩台MySQL服務器,那麼第一個連接就訪問A,第二個連接訪問B,第三個連接訪問A,一次分布,達到A、B兩台MySQL訪問均衡。
       對於MySQL-proxy這個功能,我們進行檢測一下。增加一個Lua檢測腳本 test-conn.lua,就一個函數:function read_query( packet )
    print("read_query: connection.backend_ndx: ", proxy.connection.backend_ndx)
end

執行:
[root@xutest opt]#/usr/local/sbin/MySQL-proxy --proxy-address=192.168.1.6:3306 --proxy-backend-addresses=192.168.1.231:3306 --proxy-backend-addresses=192.168.1.10:3306 --proxy-lua-script=/opt/test-conn.lua

通過其它機器的mysql客戶端進行多次的連接登陸,在MySQL-proxy的服務端輸出:
read_query: connection.backend_ndx:     1
read_query: connection.backend_ndx:     2
read_query: connection.backend_ndx:     1
read_query: connection.backend_ndx:     2
read_query: connection.backend_ndx:     1
read_query: connection.backend_ndx:     2
附:
 啟動腳本:
 [root@xutest opt]# vi MySQL-proxy.sh #!/bin/sh
export LUA_PATH=/usr/local/share/MySQL-proxy/?.lua
case "$1" in
start)
     /usr/local/sbin/MySQL-proxy --daemon \
     --proxy-address=192.168.1.6:3306 \
     --proxy-backend-addresses=192.168.1.6:3307 \
     #--proxy-read-only-backend-addresses=192.168.1.10:3306 \
     --proxy-lua-script=/usr/local/share/MySQL-proxy/rw-splitting.lua
     ;;
     stop)
     killall MySQL-proxy
      ;;
     *)
    echo "Usage: MySQL-proxy {start|stop}"
    exit 1
   esac
三:管理MySQL Proxy
            在啟動 mysql-proxy 之後,就會打開兩個端口,一個是4040,這個是缺省用於提供給MySQL客戶端連接使用的端口,可以通過 --proxy-address 選項修改為其他的,比如設置為 --proxy-address=192.168.1.6:3306,就完全模擬成了一台MySQL數據庫了。另外默認開放 4041 的端口,這個是用來提供給管理 mysql-proxy 使用的,可以使用標准的MySQL客戶端來連接,同樣能夠通過 --admin-address 選項來設置為其他管理端口。
例: [root@xutest opt]#/usr/local/mysql/bin/mysql -u root -h 192.168.1.6 -P 4041Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 10
Server version: 5.0.45-agent MySQL Enterprise Agent
MySQL> select * from proxy_connections;
+------+--------+-------+------------+
| id   | type   | state | db         |
+------+--------+-------+------------+
|    0 | server | 0     |            |
|    1 | proxy  | 0     |            |
|    2 | proxy  | 10    | replaction |
|    3 | server | 10    |            |
+------+--------+-------+------------+
4 rows in set (0.02 sec)MySQL> select * from proxy_config;
+----------------------------+------------------+
| option                     | value            |
+----------------------------+------------------+
| admin.address              | :4041            |
| proxy.address              | 192.168.1.10:3306 |
| proxy.lua_script           | NULL             |
| proxy.backend_addresses[0] | 192.168.1.231:3306   |
| proxy.fix_bug_25371        | 0                |
| proxy.profiling            | 1                |
+----------------------------+------------------+
6 rows in set (0.02 sec)
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved