原理:
在上一節(jié)中我們介紹了如何配置實現(xiàn)主從數(shù)據(jù)庫的同步,這樣是達(dá)到了我們靜態(tài)的實現(xiàn)。如何動態(tài)的實現(xiàn)主從呢,mysql推薦MySQL Proxy,其強(qiáng)大功能是實現(xiàn)“讀寫分離”,基本原理是讓主數(shù)據(jù)庫處理寫方面事務(wù),讓從庫處理SELECT查詢。同時Amoeba for MySQL是阿里巴巴推出的一款很優(yōu)秀的實現(xiàn)讀寫分離負(fù)載均衡的中間件,這節(jié)我們還是主要講Mysql Proxy。
準(zhǔn)備:
192.168.30.128 master
192.168.30.131 slave
192.168.30.132 mysql proxy 部署機(jī)器
1、安裝mysql-proxy
實現(xiàn)讀寫分離是有l(wèi)ua腳本實現(xiàn)的,現(xiàn)在mysql-proxy里面已經(jīng)集成,無需再安裝。
wget http://dev.mysql.com/downloads/mysql-proxy/ //在線download
tar zxvf mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz //解壓
mv mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit /usr/local/mysql-proxy //移動到/usr/local/mysql-proxy
2、新建配置文件
cd /usr/local/mysql-proxy
mkdir lua #創(chuàng)建腳本存放目錄
mkdir logs #創(chuàng)建日志目錄
cp share/doc/mysql-proxy/rw-splitting.lua ./lua #復(fù)制讀寫分離配置文件
cp share/doc/mysql-proxy/admin-sql.lua ./lua #復(fù)制管理腳本
vi /etc/mysql-proxy.cnf #創(chuàng)建配置文件
[mysql-proxy]
user=root #運行mysql-proxy用戶
admin-username=sync#主從mysql共有的用戶
admin-password=root #用戶的密碼
proxy-address=192.168.30.132:4000 #mysql-proxy運行ip和端口,不加端口,默認(rèn)4040
proxy-read-only-backend-addresses=192.168.30.131 #指定后端從slave讀取數(shù)據(jù)
proxy-backend-addresses=192.168.30.128 #指定后端主master寫入數(shù)據(jù)
proxy-lua-script=/usr/local/mysql-proxy/lua/rw-splitting.lua #指定讀寫分離配置文件位置
admin-lua-script=/usr/local/mysql-proxy/lua/admin-sql.lua #指定管理腳本
log-file=/usr/local/mysql-proxy/logs/mysql-proxy.log #日志位置
log-level=info #定義log日志級別,由高到低分別有(error|warning|info|message|debug)
daemon=true #以守護(hù)進(jìn)程方式運行
keepalive=true #mysql-proxy崩潰時,嘗試重啟
vi /usr/local/mysql-proxy/lua/rw-splitting.lua
if not proxy.global.config.rwsplit then
proxy.global.config.rwsplit = {
min_idle_connections = 1, #默認(rèn)超過4個連接數(shù)時,才開始讀寫分離,改為1
max_idle_connections = 1, #默認(rèn)8,改為1
is_debug = false
}
end
3、啟動mysql proxy并賦予master、slave訪問權(quán)限
/usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/etc/mysql-proxy.cnf
執(zhí)行netstat -an | grep 4000 #查看端口監(jiān)聽情況
新建一個用戶給mysql proxy 訪問:
mysql> grant all on . to 'proxy'@'192.168.30.132' identified by 'root'; //只要在master機(jī)器上執(zhí)行就可以,會自動同步到slave機(jī)器
mysql> flush privileges;
4、測試mysql proxy
下面就是測試mysql proxy啦,在master機(jī)器上面訪問mysql proxy
mysql -u proxy -h 192.168.30.132 -P 4000 -proot
create table user_test (id INT(11) primary key,name VARCHAR(255));
insert into user_test values(1,'hahah');
mysql> select * from user_test;
+----+-------+
| id | name |
+----+-------+
| 1 | hahah |
+----+-------+
退出proxy機(jī)器然后登錄master、slave機(jī)器查看test_copy.user_test數(shù)據(jù)。
mysql> use test_copy;
Database changed
mysql> show tables;
+---------------------+
| Tables_in_test_copy |
+---------------------+
| user_test |
+---------------------+
1 row in set (0.00 sec)
mysql> select * from user_test;
+----+-------+
| id | name |
+----+-------+
| 1 | hahah |
+----+-------+
1 row in set (0.00 sec)
或許有人會說這樣能看出來實現(xiàn)了讀寫分離嗎?是看不出那需要怎么弄呢,其實我們只需要測試write時候把master機(jī)器mysql干掉,測試read的時候把slave的mysql機(jī)器干掉。
把master機(jī)器干掉,做insert操作,看看會不會報錯就好了。
文/hello_coke(簡書作者)
原文鏈接:http://www.itdecent.cn/p/8528072cba9a
著作權(quán)歸作者所有,轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),并標(biāo)注“簡書作者”。