《MYSQL數(shù)據(jù)庫(kù)MySQL讀寫分離技術(shù)》要點(diǎn):
本文介紹了MYSQL數(shù)據(jù)庫(kù)MySQL讀寫分離技術(shù),希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
導(dǎo)讀:當(dāng)今MySQL使用相當(dāng)廣泛,隨著用戶的增多以及數(shù)據(jù)量的增大,高并發(fā)隨之而來(lái).然而我們有很多辦法可以緩解數(shù)據(jù)庫(kù)的壓力.分布式數(shù)據(jù)庫(kù)、負(fù)載均衡、讀寫分離、增加緩存服務(wù)器等等.這里我
1、簡(jiǎn)介
當(dāng)今MySQL使用相當(dāng)廣泛,隨著用戶的增多以及數(shù)據(jù)量的增大,高并發(fā)隨之而來(lái).然而我們有很多辦法可以緩解數(shù)據(jù)庫(kù)的壓力.分布式數(shù)據(jù)庫(kù)、負(fù)載均衡、讀寫分離、增加緩存服務(wù)器等等.這里我們將采用讀寫分離技術(shù)進(jìn)展緩解數(shù)據(jù)庫(kù)的壓力.
其中實(shí)現(xiàn)讀寫分離的技術(shù)有很多方法,這里我們將采用mysql-proxy這個(gè)中間軟件來(lái)實(shí)現(xiàn).這個(gè)軟件中含有一個(gè)讀寫分離的lua文件,這也是我們使用mysql-proxy實(shí)現(xiàn)讀寫分離必用的文件,它需要lua解析器進(jìn)行解析.因此我們還需要安裝一個(gè)lua解析器.
2、基本環(huán)境
三臺(tái)linux虛擬主機(jī)
Linux版本CentOS6.6、MySQL 5.5
mysql-proxy-0.8.5
lua-5.1.4
ip:192.168.95.11(寫)、192.168.95.12(讀)、192.168.95.13(mysql-proxy)
3、配置主從復(fù)制
詳細(xì)可以參考:mysql主從復(fù)制與主主復(fù)制
http://www.cnblogs.com/phpstudy2015-6/p/6485819.html#_label2
粗略介紹一下數(shù)據(jù)庫(kù)的主從復(fù)制的配置:
第一步:
在192.168.95.11中創(chuàng)建一個(gè)192.168.95.12主機(jī)中可以登錄的MySQL用戶
用戶:mysql12
密碼:mysql12
mysql>GRANT REPLICATION SLAVE ON *.* TO ‘mysql12’@’192.168.95.12’ IDENTIFIED BY ‘mysql12’;
mysql>FLUSH PRIVILEGES;
第二步:
查看192.168.95.11MySQL服務(wù)器二進(jìn)制文件名與位置
mysql>SHOW MASTER STATUS;
第三步:
告知二進(jìn)制文件名與位置
在192.168.95.12中執(zhí)行:
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;?? #開(kāi)啟復(fù)制
mysql>SHOW SLAVE STATUS\G?? #查看主從復(fù)制是否配置成功

主從復(fù)制配置成功!
(注意:上面Relicate_Do_DB:aa表示主從復(fù)制只針對(duì)數(shù)據(jù)庫(kù)aa【這是我之前設(shè)置的就沒(méi)改了】,這里就不講這個(gè)了,要想去了解學(xué)醫(yī)這個(gè)的話可以參考文章http://www.cnblogs.com/phpstudy2015-6/p/6485819.html#_label7)
4、MySQL讀寫分離配置
百度云下載:鏈接:http://pan.baidu.com/s/1slTl18L 密碼:9j0m
回到頂部
4.1、安裝lua
官網(wǎng)下載:http://www.lua.org/download.html
Lua 是一個(gè)小巧的腳本語(yǔ)言.Lua由標(biāo)準(zhǔn)C編寫而成,代碼簡(jiǎn)潔優(yōu)美,幾乎在所有操作系統(tǒng)和平臺(tái)上都可以編譯,運(yùn)行.
一個(gè)完整的Lua解釋器不過(guò)200k,在目前所有腳本引擎中,Lua的速度是最快的.這一切都決定了Lua是作為嵌入式腳本的最佳選擇.
1)、安裝lua需要依賴很多軟件包.
可以通過(guò)rpm -qa | grep name檢查以下軟件是否安裝:
gcc*、gcc-c++*、autoconf*、automake*、zlib*、libxml*、ncurses-devel*、libmcrypt*、libtool*、flex*、pkgconfig*、libevent*、glib*
若缺少相關(guān)的軟件包,可通過(guò)yum -y install方式在線安裝,或直接從系統(tǒng)安裝光盤中找到并通過(guò)rpm -ivh方式安裝.(我的話一般是直接在系統(tǒng)光盤軟件庫(kù)中找到直接rpm安裝的,有些找不到,則先在網(wǎng)上下載然后在ftp傳給linux再進(jìn)行安裝)
2)、依賴軟件安裝完畢后則進(jìn)行編譯安裝lua
MySQL-Proxy的讀寫分離主要是通過(guò)rw-splitting.lua腳本實(shí)現(xiàn)的,因此需要安裝lua.
官網(wǎng)下載: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"
(我安裝的時(shí)候是直接在光盤軟件庫(kù)中找到,直接rpm安裝)
4.2、安裝mysql-proxy
1)、首先查看linux版本確認(rèn)是32位還是64為系統(tǒng)
查看linux內(nèi)核版本
# cat /etc/issue
查看linux版本
# cat /proc/version
2)、按系統(tǒng)位數(shù)下載(上面百度云鏈接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

安裝成功
5、MySQL讀寫分離測(cè)試
1)、修改rw-splitting.lua文件
修改默認(rèn)連接,進(jìn)行快速測(cè)試,不修改的話要達(dá)到連接數(shù)為4時(shí)才啟用讀寫分離
#cp /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua ./

# vi rw-splitting.lua

2)、修改完成后,啟動(dòng)mysql-proxy
# 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 &
參數(shù):
--proxy-read-only-backend-addresses #只讀服務(wù)器地址(ip)
--proxy-backend-addresses #服務(wù)器地址(主服務(wù)器)
--proxy-lua-script #lua腳本路勁
& #表示后臺(tái)執(zhí)行

3)、創(chuàng)建用于讀寫分離的數(shù)據(jù)庫(kù)連接用戶
用戶名: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));
【因?yàn)橐呀?jīng)開(kāi)啟了主從復(fù)制所以,11、12主機(jī)mysql中都創(chuàng)建了這個(gè)用戶】
回到頂部
4)、測(cè)試登陸賬號(hào)proxy1@192.168.95.13進(jìn)行添加數(shù)據(jù)
可以使用任意ip客戶端登陸這個(gè)賬號(hào)
在192.168.95.13登陸:
# ./mysql -u proxy1 -P4040 -h192.168.95.13 –p

在兩個(gè)mysql中查看結(jié)果:一致

結(jié)果表明:賬號(hào)使用
(ps:id是自增長(zhǎng),之前高主主復(fù)制的時(shí)候更改了配置文件,還沒(méi)更改回來(lái),就將就用著先吧)
回到頂部
5)、關(guān)閉12mysql的從復(fù)制
mysql> stop slave;

6)、證明寫分離
使用proxy1@192.168.95.13賬號(hào)打開(kāi)多個(gè)客戶端進(jìn)行插入數(shù)據(jù)
打開(kāi)三個(gè)mysql客戶端分別插入2條數(shù)據(jù):
mysql> insert into tab1 (name) values('stop_slave11111');
….
mysql> insert into tab1 (name) values('stop_slave6666’);
查看:
分別登陸11mysql與12mysql查看aa.tab1中的數(shù)據(jù)
主數(shù)據(jù)庫(kù):

從數(shù)據(jù)庫(kù):

結(jié)果中顯示插入的數(shù)據(jù)存在與主數(shù)據(jù)庫(kù),而從數(shù)據(jù)庫(kù)沒(méi)有,所以證明寫能夠分離.
回到頂部
7)、證明讀分離
使用proxy1@192.168.95.13賬號(hào)登陸mysql,查看aa.tab1中的數(shù)據(jù)
mysql>use aa;
mysql>select*from tab1;

結(jié)果中顯示只有從數(shù)據(jù)庫(kù)的數(shù)據(jù),結(jié)合上面的測(cè)試,可以證明讀分離.
回到頂部
6、建議
為了方便啟動(dòng)與管理mysql-proxy可以創(chuàng)建mysql-proxy服務(wù)管理腳本
下面這個(gè)管理腳本僅適合以上我給出的安裝路徑位置
【此管理腳本需要按照自己的安裝路徑做出相應(yīng)的修改方可使用】
- #!/bin/sh?
- ?
- #?
- #?mysql-proxy?This?script?starts?and?stops?the?mysql-proxy?daemon?
- #?
- #?chkconfig:?-?78?30?
- #?processname:?mysql-proxy?
- #?description:?mysql-proxy?is?a?proxy?daemon?to?mysql?
- ?
- #?Source?function?library.?
- .?/etc/rc.d/init.d/functions?
- ?
- #PROXY_PATH=/usr/local/bin?
- PROXY_PATH=/usr/local/mysql-proxy/bin?
- ?
- prog="mysql-proxy"?
- ?
- #?Source?networking?configuration.?
- .?/etc/sysconfig/network?
- ?
- #?Check?that?networking?is?up.?
- [?${NETWORKING}?=?"no"?]?&&?exit?0?
- ?
- #?Set?default?mysql-proxy?configuration.?
- #PROXY_OPTIONS="--daemon"?
- ?
- 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"?
- ?
- PROXY_PID=/usr/local/mysql-proxy/run/mysql-proxy.pid?
- ?
- #?Source?mysql-proxy?configuration.?
- if?[?-f?/etc/sysconfig/mysql-proxy?];?then?
- ????????.?/etc/sysconfig/mysql-proxy?
- fi?
- ?
- PATH=$PATH:/usr/bin:/usr/local/bin:$PROXY_PATH?
- #?By?default?it's?all?good?
- RETVAL=0?
- ?
- #?See?how?we?were?called.?
- case?"$1"?in?
- ??start)?
- ????????#?Start?daemon.?
- ????????echo?-n?$"Starting?$prog:?"?
- ????????$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?
- ????????RETVAL=$??
- ????????echo?
- ????????if?[?$RETVAL?=?0?];?then?
- ????????????????touch?/var/lock/subsys/mysql-proxy]?
- ????????????????echo?"ok"?
- ????????fi?
- ???????;;?
- ??stop)?
- ????????#?Stop?daemons.?
- ????????echo?-n?$"Stopping?$prog:?"?
- ????????killproc?$prog?
- ????????RETVAL=$??
- ????????echo?
- ????????if?[?$RETVAL?=?0?];?then?
- ????????????????rm?-f?/var/lock/subsys/mysql-proxy?
- ????????????????rm?-f?$PROXY_PID?
- ????????fi?
- ???????;;?
- ??restart)?
- ????????$0?stop?
- ????????sleep?3?
- ????????$0?start?
- ???????;;?
- ??condrestart)?
- ???????[?-e?/var/lock/subsys/mysql-proxy?]?&&?$0?restart?
- ??????;;?
- ??status)?
- ????????status?mysql-proxy?
- ????????RETVAL=$??
- ???????;;?
- ??*)?
- ????????echo?"Usage:?$0?{start|stop|restart|status|condrestart}"?
- ????????RETVAL=1?
- ???????;;?
- esac?
- exit?$RETVAL?
- #---我將mysql-proxy服務(wù)管理腳本放在了/usr/local/mysql-proxy/init.d/文件夾里?
- #---給執(zhí)行權(quán)限,建立相應(yīng)目錄?
- #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/?
- #---啟動(dòng)mysql-proxy?
- #./mysql-proxy?start?
- #---停止mysql-proxy?
- #./mysql-proxy?stop?
- #---重啟mysql-proxy?
- #./mysql-proxy?restart?
一些相關(guān)參數(shù):
PROXY_PATH=/usr/local/mysql-proxy/bin //定義mysql-proxy服務(wù)二進(jìn)制文件路徑
--proxy-read-only-backend-addresses=192.168.95.12:3306?? //定義后端只讀從服務(wù)器地址
--proxy-backend-addresses=192.168.95.11:3306?? //定義后端主服務(wù)器地址
--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?? //定義以守護(hù)進(jìn)程模式啟動(dòng)
--keepalive?? //使進(jìn)程在異常關(guān)閉后能夠自動(dòng)恢復(fù)【上面的管理腳本沒(méi)有加上此參數(shù)】
--user=root?? //以root用戶身份啟動(dòng)服務(wù)
--log-level=debug?? //定義log日志級(jí)別,由高到低分別有(error|warning|info|message|debug)
--log-file=/usr/local/mysql-proxy/log/mysql-proxy.log?? //定義log日志文件路徑
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.snjht.com/jiaocheng/5600.html