mysql-proxy+keepalived对mysql做读写分离
一拓扑图
前几天,我通过Amoeba 对mysql做了读写分离,但是开发用zabbix连接数据库后,发现不能批量执行dml语句。后来我感觉应该是amoeba的不足引起的。
于是,我就换成了mysql-proxy来做读写分离。
此次架构和上次相比有所调整。此次有三个实体机,我做成了master-->master-->slave的形式,其中一个写两个读。
按照正常做法,应该是5台机器,其中两个是mysql-proxy(互为冗余)和三个mysql数据库。但是为了节省机器,并且也不影响整体的性能。经过我的思量,就做成了上图所示的两个主库一个从库的形式。我把mysql-proxy放在了两个负责读的数据库上,其互为冗余。
为了实现故障转移,我对mysql数据库和mysql-proxy都用keepalived做成了高可用。上述三台机器中,可以坏掉其中任何一台机器,并且可以自动切换到对应备机而不需要人工干预,可以说实现了高可用和数据的冗余。
都说mysql是轻量级数据库,我感觉配置mysql确实挺轻巧,不像oracle那么复杂(可能由于我对mysq认识不足)。
和amoeba相比,我感觉mysql-proxy功能有点生硬。amoeba可以设置读库是轮询、基于权重还是HA。但是mysql-prxoy是lua语言编写(amoeba是java编写),只是通过一个脚本实现读写分离的,所以还没像amoeba那样设置灵活。
一开始,我以为mysql-proxy的两个读库只能读一个呢,后来我用shell脚本批量执行读操作,才发现大量的查询都是丢向了第一个读库(10.72.23.88),只有少量的查询丢向了第二个读库。本文后面有我的测试实验,可以参考。
二、部署步骤
关于mysql、mysql-proxy、keepalived的安装在此省略,如果你需要可以参见我的另外一篇文章:http://blog.itpub.net/28916011/viewspace-1603009/。
1、keepalived for mysql-proxy的配置
10.72.23.89(mysql-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.88(mysql-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
}
}
2、keepalived for mysql 的配置
10.72.23.90(mysql数据库主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.88(mysql数据库主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.88的keepalived
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.88的keepalived
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/