mysql-proxy+keepalived对mysql做读写分离


 

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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/28916011/viewspace-1617532/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值