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

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

一拓扑图

412c85d42d74744ca72ae7c7316138f2.png

前几天,我通过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-prxoy是lua语言编写(amoeba是java编写),只是通过一个脚本实现读写分离的,所以还没像amoeba那样设置灵活。

一开始,我以为mysql-proxy的两个读库只能读一个呢,后来我用shell脚本批量执行读操作,才发现大量的查询都是丢向了第一个读库(10.72.23.88),只有少量的查询丢向了第二个读库。本文后面有我的测试实验,可以参考。

二、部署步骤

关于mysql、mysql-proxy、keepalived的安装在此省略,如果你需要可以参见我的另外一篇文章:。

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

完。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值