keepalive实现MGR的自动切换(二)

文章详细介绍了如何使用Keepalived配合MySQL的组复制功能,建立高可用的数据库集群。通过配置Keepalived的VRRP脚本和检测脚本,动态调整权重,确保VIP始终跟随主数据库节点,实现故障时的快速切换。同时,文章提到了在不同机器上配置Keepalived的步骤以及可能出现的问题和解决方法。
摘要由CSDN通过智能技术生成

10.0.0.7 lemon

10.0.0.8 lemon2

10.0.0.9 lemon3

程序代码里只需写一个VIP连接数据库即可,后面是连接在哪一台通过,keepalived的在服务端实现;通过检测脚本哪一台是master就把VIP飘在哪一台上

一、Mysql的组复制集群

参考前面博文

二、安装keepalived

wget http://www.keepalived.org/software/keepalived-1.2.24.tar.gz
tar -zxvf keepalived-1.2.24.tar.gz
cd keepalived-1.2.24
./configure --prefix=/usr/local/keepalived
make && make install

三、添加对应的配置文件

mkdir /etc/keepalived
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

四、修改keepalived配置文件

在这里,有几台mysql,就得在这些mysql上都装上keepalived ;

vim /etc/keepalived/keepalived.conf 把原来的全部删除,直接用这个就行

! Configuration File for keepalived
 
#指定mysql服务检测脚本
vrrp_script chk_mysql_port {
script "/root/chk_mysql.sh" #脚本路径
interval 2 #脚本检测频率
weight -5 #脚本执行成功与否,权重怎么计算
fall 2 #如果连续两次检测失败,认为节点服务不可用
rise 1 #如果连续2次检查成功则认为节点正常
}
 
vrrp_script chk_mysql_master {
script "/root/chk_mysql2.sh"
interval 2
weight 10
}
 
vrrp_instance VI_1 {
state MASTER
interface eth0 #节点IP的网卡
virtual_router_id 88 #同一个instance相同
priority 100 # 优先级,数值越大,优先级越高
advert_int 1
authentication { #节点间的认证,所有的必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #VIP,自定的,我觉得和外网的IP要一个网段
192.168.2.28
}
 
track_script { #指定前面脚本的名字
chk_mysql_port
chk_mysql_master
}
 
}
 

三台机器的不同点就是:

lemon: priority 100

lemon2: priority 98

lemon3: priority 96

这三个值不要相差太大,最好自己模拟一下算一下,看各种情况下是否是按照自己的预期得到权重;如果相差太大,weight值也比较小的时候,可能会导致备机的权重比主机的大

 

原理:

当通过chk_mysql.sh脚本检测mysql服务是否存在,如果执行了改变权重

通过/root/chk_mysql2.sh脚本检测本机是否是master机,是的话,改变权重

整体来说就是通过改变机器的权重来把VIP飘在权重最大的机器上的;我们要做的就是通过脚本判断是否执行,使得master的权重最高;这里的权限一定得控制好;

权重策略是:

当weight > 0时:脚本执行成功了 Priority+Weight 执行失败 Priority

当weight < 0时:脚本执行成功了 Priority 执行失败 Priority+Weight

每执行一次他的权重是重新开大会算的,并不是接着上一次的来

五、两个mysql检测脚本(三台机器上都要有)

1:检测mysql服务是否存在 chk_mysql.sh

#!/bin/bash
 
nc -z 127.0.0.1 3306 |grep succeeded
 
a=`echo $?`
 
echo 1 > /tmp/ll
 
if [ $a -eq 1 ] ;then
service keepalived stop
fi

注:这里的nc命令得先在自己的机器上安装,yum -y install nc ;稍不注意没安装的话,后面测试的时候总不对,因为这个脚本总是返回错,就会到这priority与weight值不对

2:检测自己是不是master

#!/bin/bash
 
host=`/usr/local/mysql/bin/mysql -h127.0.0.1 -uroot -p123456 -e "SELECT * FROM performance_schema.replication_group_members WHERE MEMBER_ID = (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME= 'group_replication_primary_member')" |awk 'NR==2{print}'|awk -F" " '{print $3}'`
 
host2=`hostname`
 
if [ $host == $host2 ] ;then
exit 0
else
exit 1
fi

注:第一句是判断mysql组复制的master的hostname是什么,然后获取自己的master,看master是不是自己,如果是的话,返回0,返回0表示脚本执行成功了,则与配置文件里对应,weight+10;如果不是,返回1,表示脚本没有执行成功,weight不变;

/usr/local/mysql/bin/mysql -h127.0.0.1 -uroot -p123456 -e "SELECT * FROM performance_schema.replication_group_members WHERE MEMBER_ID = (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME= 'group_replication_primary_member')"

通过不需要直接登录进去打印出哪一台是主,这个是读操作,因此在所有机器上都能执行

在上面的基础上把hostname过滤出来与本机的hostname做对比(hostname也可以改成IP,但是考虑到可能一台机器有多个IP,不好判断),这样就知道自己是不是主,是的话就使优先级增加,这样keepalived的vip就会绑定到这台机器上,就能进行读写操作了

/usr/local/mysql/bin/mysql -h127.0.0.1 -uroot -p123456 -e "SELECT * FROM performance_schema.replication_group_members WHERE MEMBER_ID = (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME= 'group_replication_primary_member')" |awk 'NR==2{print}'|awk -F" " '{print $3}'

这里还有一个重要的点是判断的时候,不能用echo去表示结果,因为echo总会执行,这样的话,不管是不是都会返回0,就会导致结果有问题

脚本里也可以把发送邮件加进去,这样每次切换的时候就知道

六、启动keepalived

1)service keepalived start ;启动完成后,看是否启动成功,ps -ef 和查看日志

keepalived的日志默认在/var/log/messages下,这里看到报错了

报这个错是因为:该平台的Virtual_router_id与其它平台的Virtual_router_id重复,把配置文件里的

virtual_router_id 88这个改一下,重启后,看日志如下:

 

这就表明启动成功了。

七、测试

1)首先通过mysql查看哪一台是mysql的master

 

这里可以看到是lemon机器,然后在主机名为lemon的这台机器上查看VIP是否在这台机器上绑定ip -a

2)查看VIP

注:查看是否绑定IP ip a命令 用ifconfig查看不到这里纠结了一下午,怎么改都看不到

这里可以看到VIP是绑定成功的

3)测试,把lemon这台机器的mysql停掉

然后通过这两台机器可以看mysql组复制的master在那台机器上,这里可以看到是lemon3上

 

然后去看,VIP是否绑定在lemon3那台机器上

 

4)通过VIP访问mysql,看是否能连接成功,并写入

在三台机器上都要添加权限

grant all on *.* to root@'%' identified by "1234567";
flush privileges;

然后通过VIP可以连接上,并能写入数据:

把原来的lemon上的mysql启动,把master3的mysql停掉,继续通过VIP连接mysql看能不能写入和查看

报错了;说只有读权限;一看VIP绑定到lemon2去了,但是查看数据库的master是lemon

这是为什么呢,还以为是权限的问题呢;不是,是开始的时候lemon的mysql停掉了,就执行了把keepalived停掉的脚本,刚刚没有把keepalived开启,所以keepalived的VIP飘到另外一台去了

当一台mysql挂掉,找到问题解决好,一定要做的操作有:

1)启动mysql

/usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/etc/my.cnf

2)打开组复制

set global group_replication_allow_local_disjoint_gtids_join=ON;
start group_replication;

3)启动keepalived

service keepalived restart

注:

测试的时候这里的脚本有可能不执行,这里经过排查是因为配置文件大括号前一定要有一个空格,加上重启后就执行了

 

转载至keepalive实现MGR的自动切换(二) - Captain_Li - 博客园

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值