當今MySQL使用至關普遍,隨着用戶的增多以及數據量的增大,高併發隨之而來。然而咱們有不少辦法能夠緩解數據庫的壓力。分佈式數據庫、負載均衡、讀寫分離、增長緩存服務器等等。這裏咱們將採用讀寫分離技術進展緩解數據庫的壓力。html
其中實現讀寫分離的技術有不少方法,這裏咱們將採用mysql-proxy這個中間軟件來實現。這個軟件中含有一個讀寫分離的lua文件,這也是咱們使用mysql-proxy實現讀寫分離必用的文件,它須要lua解析器進行解析。所以咱們還須要安裝一個lua解析器。mysql
三臺linux虛擬主機linux
Linux版本CentOS6.六、MySQL 5.5c++
mysql-proxy-0.8.5sql
lua-5.1.4數據庫
ip:192.168.95.11(寫)、192.168.95.12(讀)、192.168.95.13(mysql-proxy)後端
詳細能夠參考:mysql主從複製與主主複製緩存
http://www.cnblogs.com/phpstudy2015-6/p/6485819.html#_label2服務器
粗略介紹一下數據庫的主從複製的配置:
第一步:
在192.168.95.11中建立一個192.168.95.12主機中能夠登陸的MySQL用戶
用戶:mysql12
密碼:mysql12
mysql>GRANT REPLICATION SLAVE ON *.* TO ‘mysql12’@’192.168.95.12’ IDENTIFIED BY ‘mysql12’; mysql>FLUSH PRIVILEGES;
第二步:
查看192.168.95.11MySQL服務器二進制文件名與位置
mysql>SHOW MASTER STATUS;
第三步:
告知二進制文件名與位置
在192.168.95.12中執行:
mysql> change master to -> master_host='192.168.95.11', -> master_user='mysql12', -> master_password='mysql12', -> master_log_file='mysql-bin.000124', -> master_log_pos=586;
第四步:
在192.168.95.12中
mysql>SLAVE START; #開啓複製
mysql>SHOW SLAVE STATUS\G #查看主從複製是否配置成功
主從複製配置成功!
(注意:上面Relicate_Do_DB:aa表示主從複製只針對數據庫aa【這是我以前設置的就沒改了】,這裏就不講這個了,要想去了解學醫這個的話能夠參考文章http://www.cnblogs.com/phpstudy2015-6/p/6485819.html#_label7)
百度雲下載:連接:http://pan.baidu.com/s/1slTl18L 密碼:9j0m
官網下載:http://www.lua.org/download.html
Lua 是一個小巧的腳本語言。Lua由標準C編寫而成,代碼簡潔優美,幾乎在全部操做系統和平臺上均可以編譯,運行。
一個完整的Lua解釋器不過200k,在目前全部腳本引擎中,Lua的速度是最快的。這一切都決定了Lua是做爲嵌入式腳本的最佳選擇。
1)、安裝lua須要依賴不少軟件包。
能夠經過rpm -qa | grep name檢查如下軟件是否安裝:
gcc*、gcc-c++*、autoconf*、automake*、zlib*、libxml*、ncurses-devel*、libmcrypt*、libtool*、flex*、pkgconfig*、libevent*、glib*
若缺乏相關的軟件包,可經過yum -y install方式在線安裝,或直接從系統安裝光盤中找到並經過rpm -ivh方式安裝。(個人話通常是直接在系統光盤軟件庫中找到直接rpm安裝的,有些找不到,則先在網上下載而後在ftp傳給linux再進行安裝)
2)、依賴軟件安裝完畢後則進行編譯安裝lua
MySQL-Proxy的讀寫分離主要是經過rw-splitting.lua腳本實現的,所以須要安裝lua。
官網下載:http://www.lua.org/download.html(下載源碼包)
# wget http://www.lua.org/ftp/lua-5.1.4.tar.gz # tar zxvf lua-5.1.4.tar.gz # cd lua-5.1.4 # make linux # make install # export LUA_CFLAGS="-I/usr/local/include" LUA_LIBS="-L/usr/local/lib -llua -ldl" LDFLAGS="-lm" (我安裝的時候是直接在光盤軟件庫中找到,直接rpm安裝)
1)、首先查看linux版本確認是32位仍是64爲系統
查看linux內核版本
# cat /etc/issue
查看linux版本
# cat /proc/version
2)、按系統位數下載(上面百度雲連接64位的文件)
3)、安裝
# tar –zxvf mysql-proxy-0.8.5- linux-rhel5-x86-64bit.tar.gz # mkdir /usr/local/mysql-proxy # cp ./ mysql-proxy-0.8.5-linux-rhel5-x86-64bit/* /usr/local/mysql-proxy # cd /usr/local/mysql-proxy
安裝成功
修改默認鏈接,進行快速測試,不修改的話要達到鏈接數爲4時才啓用讀寫分離
#cp /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua ./
# vi rw-splitting.lua
# cd /usr/local/mysql/bin # ./mysql-proxy --proxy-read-only-backend-addresses=192.168.95.12:3306 --proxy-backend-addresses=192.168.95.11:3306 --proxy-lua-script=/usr/local/mysql-proxy/rw-splitting.lua &
參數:
--proxy-read-only-backend-addresses #只讀服務器地址(ip)
--proxy-backend-addresses #服務器地址(主服務器)
--proxy-lua-script #lua腳本路勁
& #表示後臺執行
用戶名:proxy1
密 碼:321
mysql>grant all on *.* to 'proxy1'@'192.168.95.13' identified by '321'; mysql>use aa; mysql>create table tab1(id int auto_increment,name varchar(32) not null,primary key(id));
【由於已經開啓了主從複製因此,十一、12主機mysql中都建立了這個用戶】
可使用任意ip客戶端登錄這個帳號
在192.168.95.13登錄:
# ./mysql -u proxy1 -P4040 -h192.168.95.13 –p
在兩個mysql中查看結果:一致
結果代表:帳號使用
(ps:id是自增加,以前高主主複製的時候更改了配置文件,還沒更改回來,就將就用着先吧)
mysql> stop slave;
使用proxy1@192.168.95.13帳號打開多個客戶端進行插入數據
打開三個mysql客戶端分別插入2條數據:
mysql> insert into tab1 (name) values('stop_slave11111'); …. mysql> insert into tab1 (name) values('stop_slave6666’);
查看:
分別登錄11mysql與12mysql查看aa.tab1中的數據
主數據庫:
從數據庫:
結果中顯示插入的數據存在與主數據庫,而從數據庫沒有,因此證實寫可以分離。
使用proxy1@192.168.95.13帳號登錄mysql,查看aa.tab1中的數據
mysql>use aa; mysql>select*from tab1;
結果中顯示只有從數據庫的數據,結合上面的測試,能夠證實讀分離。
爲了方便啓動與管理mysql-proxy能夠建立mysql-proxy服務管理腳本
下面這個管理腳本僅適合以上我給出的安裝路徑位置
【此管理腳本須要按照本身的安裝路徑作出相應的修改方可以使用】
1 #!/bin/sh 2 3 # 4 # mysql-proxy This script starts and stops the mysql-proxy daemon 5 # 6 # chkconfig: - 78 30 7 # processname: mysql-proxy 8 # description: mysql-proxy is a proxy daemon to mysql 9 10 # Source function library. 11 . /etc/rc.d/init.d/functions 12 13 #PROXY_PATH=/usr/local/bin 14 PROXY_PATH=/usr/local/mysql-proxy/bin 15 16 prog="mysql-proxy" 17 18 # Source networking configuration. 19 . /etc/sysconfig/network 20 21 # Check that networking is up. 22 [ ${NETWORKING} = "no" ] && exit 0 23 24 # Set default mysql-proxy configuration. 25 #PROXY_OPTIONS="--daemon" 26 27 PROXY_OPTIONS="--proxy-read-only-backend-addresses=192.168.95.12:3306 --proxy-backend-addresses=192.168.95.11:3306 --proxy-lua-script=/usr/local/mysql-proxy/rw-splitting.lua" 28 29 PROXY_PID=/usr/local/mysql-proxy/run/mysql-proxy.pid 30 31 # Source mysql-proxy configuration. 32 if [ -f /etc/sysconfig/mysql-proxy ]; then 33 . /etc/sysconfig/mysql-proxy 34 fi 35 36 PATH=$PATH:/usr/bin:/usr/local/bin:$PROXY_PATH 37 # By default it's all good 38 RETVAL=0 39 40 # See how we were called. 41 case "$1" in 42 start) 43 # Start daemon. 44 echo -n $"Starting $prog: " 45 $NICELEVEL $PROXY_PATH/mysql-proxy $PROXY_OPTIONS --daemon --pid-file=$PROXY_PID --user=root --log-level=debug --log-file=/usr/local/mysql-proxy/log/mysql-proxy.log 46 RETVAL=$? 47 echo 48 if [ $RETVAL = 0 ]; then 49 touch /var/lock/subsys/mysql-proxy] 50 echo "ok" 51 fi 52 ;; 53 stop) 54 # Stop daemons. 55 echo -n $"Stopping $prog: " 56 killproc $prog 57 RETVAL=$? 58 echo 59 if [ $RETVAL = 0 ]; then 60 rm -f /var/lock/subsys/mysql-proxy 61 rm -f $PROXY_PID 62 fi 63 ;; 64 restart) 65 $0 stop 66 sleep 3 67 $0 start 68 ;; 69 condrestart) 70 [ -e /var/lock/subsys/mysql-proxy ] && $0 restart 71 ;; 72 status) 73 status mysql-proxy 74 RETVAL=$? 75 ;; 76 *) 77 echo "Usage: $0 {start|stop|restart|status|condrestart}" 78 RETVAL=1 79 ;; 80 esac 81 exit $RETVAL
#---我將mysql-proxy服務管理腳本放在了/usr/local/mysql-proxy/init.d/文件夾裏
#---給執行權限,創建相應目錄 #chmod +x /usr/local/mysql-proxy/init.d/mysql-proxy #mkdir /usr/local/mysql-proxy/run #mkdir /usr/local/mysql-proxy/log
#cd /usr/local/mysql-proxy/init.d/
#---啓動mysql-proxy
#./mysql-proxy start
#---中止mysql-proxy
#./mysql-proxy stop
#---重啓mysql-proxy
#./mysql-proxy restart
一些相關參數:
PROXY_PATH=/usr/local/mysql-proxy/bin //定義mysql-proxy服務二進制文件路徑
--proxy-read-only-backend-addresses=192.168.95.12:3306 //定義後端只讀從服務器地址
--proxy-backend-addresses=192.168.95.11:3306 //定義後端主服務器地址
--proxy-lua-script=/usr/local/mysql-proxy/rw-splitting.lua //定義lua讀寫分離腳本路徑
PROXY_PID=/usr/local/mysql-proxy/run/mysql-proxy.pid //定義mysql-proxy PID文件路徑
--daemon //定義以守護進程模式啓動
--keepalive //使進程在異常關閉後可以自動恢復【上面的管理腳本沒有加上此參數】
--user=root //以root用戶身份啓動服務
--log-level=debug //定義log日誌級別,由高到低分別有(error|warning|info|message|debug)
--log-file=/usr/local/mysql-proxy/log/mysql-proxy.log //定義log日誌文件路徑
(以上是本身的一些看法與總結,如有不足或者錯誤的地方請各位指出)
做者:那一葉隨風
聲明:以上只表明本人在工做學習中某一時間內總結的觀點或結論。轉載時請在文章頁面明顯位置給出原文連接