mysql-proxy+keepalived對mysql做讀寫分離

czxin788發表於2015-05-01


 

mysql-proxy+keepalivedmysql做讀寫分離

一拓撲圖

 

 

         前幾天,我透過Amoeba mysql做了讀寫分離,但是開發用zabbix連線資料庫後,發現不能批次執行dml語句。後來我感覺應該是amoeba的不足引起的。

         於是,我就換成了mysql-proxy來做讀寫分離。

         此次架構和上次相比有所調整。此次有三個實體機,我做成了master--&gtmaster--&gtslave的形式,其中一個寫兩個讀。

         按照正常做法,應該是5臺機器,其中兩個是mysql-proxy(互為冗餘)和三個mysql資料庫。但是為了節省機器,並且也不影響整體的效能。經過我的思量,就做成了上圖所示的兩個主庫一個從庫的形式。我把mysql-proxy放在了兩個負責讀的資料庫上,其互為冗餘。

         為了實現故障轉移,我對mysql資料庫和mysql-proxy都用keepalived做成了高可用。上述三臺機器中,可以壞掉其中任何一臺機器,並且可以自動切換到對應備機而不需要人工干預,可以說實現了高可用和資料的冗餘。

         都說mysql是輕量級資料庫,我感覺配置mysql確實挺輕巧,不像oracle那麼複雜(可能由於我對mysq認識不足)。

         amoeba相比,我感覺mysql-proxy功能有點生硬。amoeba可以設定讀庫是輪詢、基於權重還是HA。但是mysql-prxoylua語言編寫(amoebajava編寫),只是透過一個指令碼實現讀寫分離的,所以還沒像amoeba那樣設定靈活。

         一開始,我以為mysql-proxy的兩個讀庫只能讀一個呢,後來我用shell指令碼批次執行讀操作,才發現大量的查詢都是丟向了第一個讀庫(10.72.23.88),只有少量的查詢丟向了第二個讀庫。本文後面有我的測試實驗,可以參考。

 

 

 

二、部署步驟

關於mysqlmysql-proxykeepalived的安裝在此省略,如果你需要可以參見我的另外一篇文章:http://blog.itpub.net/28916011/viewspace-1603009/

 

1keepalived for mysql-proxy的配置

10.72.23.89mysql-proxy主)

 

[root@zabbixsrvbjdb02 proxy]# cat /etc/keepalived/keepalived.conf

global_defs {

router_id Hadb_1

}

vrrp_sync_group VGM {

group {

mysqlproxy

}

}

vrrp_script chk_mysql_proxy {

script "killall -0 mysql-proxy"

#script "/tcp/127.0.0.1/3308"

#script "/opt/amoeba.sh"

interval 1

}

# vvrp_instance define #

vrrp_instance mysqlproxy {

state MASTER

interface eth0

virtual_router_id 49

priority 200

advert_int 1

authentication {

auth_type PASS

auth_pass hamysqlproxy11

}

virtual_ipaddress {

10.72.23.91

}

track_script {

chk_mysql_proxy

}

}

 

10.72.23.88mysql-proxy備)

 

[root@zabbixsrvbjdb01 local]# cat /etc/keepalived/keepalived.conf

global_defs {

router_id Hadb_1

}

vrrp_sync_group VGM {

group {

VI_HA

}

}

vrrp_script chk_mysql {

script "killall -0 mysqld"

#script "/tcp/127.0.0.1/3307"

#script "/opt/amoeba.sh"

interval 1

}

vrrp_script chk_mysql_proxy {

script "killall -0 mysql-proxy"

#script "/tcp/127.0.0.1/3306"

#script "/opt/amoeba.sh"

interval 1

}

# vvrp_instance define #

vrrp_instance VI_HA {

state BACKUP

interface eth0

virtual_router_id 46

priority 50

advert_int 1

authentication {

auth_type PASS

auth_pass hamysql11

}

virtual_ipaddress {

10.72.23.87

}

track_script {

chk_mysql

}

}

vrrp_instance mysql_proxy {

state BACKUP

interface eth0

virtual_router_id 49

priority 150

advert_int 1

authentication {

auth_type PASS

auth_pass hamysqlproxy11

}

virtual_ipaddress {

10.72.23.91

}

track_script {

chk_mysql_proxy

}

}

 

 

2keepalived for mysql 的配置

10.72.23.90mysql資料庫主2

 

[root@zabbixsrvbjdb04 ~]# cat /etc/keepalived/keepalived.conf

global_defs {

router_id Hadb_1

}

vrrp_sync_group VGM {

group {

VI_HA

}

}

vrrp_script chk_mysql {

script "killall -0 mysqld"

#script "/tcp/127.0.0.1/3307"

#script "/opt/amoeba.sh"

interval 1

}

# vvrp_instance define #

vrrp_instance VI_HA {

state MASTER

interface eth0

virtual_router_id 46

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass hamysql11

}

virtual_ipaddress {

10.72.23.87

}

track_script {

chk_mysql

}

}

 

 

 

 

10.72.23.88mysql資料庫主1

 

 

[root@zabbixsrvbjdb01 local]# cat /etc/keepalived/keepalived.conf

global_defs {

router_id Hadb_1

}

vrrp_sync_group VGM {

group {

VI_HA

}

}

vrrp_script chk_mysql {

script "killall -0 mysqld"

#script "/tcp/127.0.0.1/3307"

#script "/opt/amoeba.sh"

interval 1

}

vrrp_script chk_mysql_proxy {

script "killall -0 mysql-proxy"

#script "/tcp/127.0.0.1/3306"

#script "/opt/amoeba.sh"

interval 1

}

# vvrp_instance define #

vrrp_instance VI_HA {

state BACKUP

interface eth0

virtual_router_id 46

priority 50

advert_int 1

authentication {

auth_type PASS

auth_pass hamysql11

}

virtual_ipaddress {

10.72.23.87

}

track_script {

chk_mysql

}

}

vrrp_instance mysql_proxy {

state BACKUP

interface eth0

virtual_router_id 49

priority 150

advert_int 1

authentication {

auth_type PASS

auth_pass hamysqlproxy11

}

virtual_ipaddress {

10.72.23.91

}

track_script {

chk_mysql_proxy

}

}

 

 

3、關於mysql-proxy 兩個讀庫分配比例的測試

隨便找兩個其他機器作為客戶端,連線mysql-proxy測試兩個讀庫訪問情況。

[root@node1 ~]# cat 1.sh

for((i=1;i<10000;i++))

do

 mysql -h10.72.23.91 -uroot -pxxx -e "select * from czx.czxt" >> /tmp/czx.txt

done

 

在測試機1上執行的結果:

[root@node1 ~]# sh 1.sh

[root@node1 ~]# cat /tmp/czx.txt |grep 89 |wc -l

820

[root@node1 ~]# cat /tmp/czx.txt |grep 88 |wc -l

9179

 

在測試機2上執行的結果:

[root@dg ~]# sh 1.sh

[root@dg ~]# cat /tmp/czx.txt |grep 89 |wc -l

800

[root@dg ~]# cat /tmp/czx.txt |grep 88 |wc -l

9199

 

可以看出mysql-proxy分配讀請求在兩個資料庫上是1:11分配的。

注意,此測試如果只用一臺客戶端機器來訪問mysql-proxy,會看到讀操作只分配到一個機器上(我的是讀操作都分配到了10.72.23.88機器上了,沒有看到將讀分配到10.72.23.89上)。我想這個原因可能就是高併發訪問mysql-proxy時,才會將讀操作分配到不同的讀庫上。

 

4、啟動mysql-proxy的方法

1、先在10.72.23.88上繫結vip 91

ifconfig eth0:0 10.72.23.91 netmask 255.255.255.0

2、再在10.72.23.88上啟動myql-proxy

/usr/local/proxy/bin/mysql-proxy -P 10.72.23.91:3306 -b 10.72.23.87:3307  -r 10.72.23.88:3307 -s /usr/local/proxy/share/doc/mysql-proxy/rw-splitting.lua

3、重啟10.72.23.88的網路,當掉vip 91

service network restart

4、關閉10.72.23.88keepalived

service keepalived stop

4、在10.72.23.89上繫結vip 91

ifconfig eth0:0 10.72.23.91 netmask 255.255.255.0

5、在10.72.23.89上啟動mysql-proxy

/usr/local/proxy/bin/mysql-proxy -P 10.72.23.91:3306 -b 10.72.23.87:3307  -r 10.72.23.88:3307 -r 10.72.23.89:3307 -s /usr/local/proxy/share/doc/mysql-proxy/rw-splitting.lua &

6、重啟10.72.23.89的網路,當掉vip 91

service network restart

7、啟動10.72.23.88keepalived
8、我在10.72.23.89上加了個每分鐘執行的指令碼,用來判斷寫資料庫10.72.23.90是否當機,如果寫資料庫當機,就將89的mysql-proxy代理許可權交給88來管理:
[root@zabbixsrvbjdb02 script]# cat check_remote_mysql 
#!/bin/bash
nmap -sT -p 3307 -oG – 10.72.23.90 |grep open
status=`echo $?`
if [ $status -eq 1 ];then
pkill -9 mysql-proxy
fi

完。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28916011/viewspace-1617532/,如需轉載,請註明出處,否則將追究法律責任。

相關文章