暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

keepalive原理

原创 落寞惊梦 2022-07-21
786

做实验怎么提高成功率?

1. 保持和文档里面的东西一样

2. 学会看日志    #看日志是让我们学会思考;将debug模式找开,打开方式baidu里面找;

3. 学会总结


举一反三,总结过程,创造新东西


------------------------------------------------------------

keepalived+双主环境搭建


yum install keepalived 

yum -y install MySQL-python 

keepalived的两台机器上都要装的

markdown 格式,学习一下;



/etc/keepalived/keepalived.conf 

/etc/keepalived/checkMySQL.py -h 127.0.0.1 -P 3306 


echo "/usr/local/mysql/lib" >> /etc/ld.so.conf.d/mysql-x86_64.conf 

ldconfig 


libmysqlclient.so.16 no such file 

libmysqlclient.so.18 

cd /usr/local/mysql/lib

ln -s libmysqlclient.so.18 libmysqlclient.so.16 

ldconfig 



主:

keepalived.conf 

vrrp_script vs_mysql_82 {

    script "/etc/keepalived/checkMySQL.py -h 127.0.0.1 -P 3306"

    interval 60    ##建议是15s以上,表示间隔多长时间作一下检查;

}

vrrp_instance VI_82 {

    state BACKUP

    nopreempt

    interface eth0

    virtual_router_id 82

    priority 100

    advert_int 5

    authentication {

        auth_type PASS

        auth_pass 1111     ###最多只支持8位

    }

    track_script {

       vs_mysql_82     ##特别注意:  virtual_router_id 82     0-255

    }

    virtual_ipaddress {

        192.168.11.100

    }

}


多实例 每个一组vip 

keepalived有几种状态呢?master/backup/fault  


vrrp_script vs_mysql_82 {

    script "/etc/keepalived/checkMySQL.py -h 127.0.0.1 -P 3306"

    interval 60 

}

vrrp_instance VI_82 {

    state BACKUP

    nopreempt

    interface eth0

    virtual_router_id 82

    priority 100

    advert_int 5

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    track_script {

       vs_mysql_82

    }

    virtual_ipaddress {

        192.168.11.100

    }

}



你希望VIP在那台机器上,就在那台机器上先启动KEEPALIVED 

确定VIP绑定成功


checkMySQL.py脑裂的问题没有处理:

脑裂:假设Keepalived里两台机器A,B,A有VIP,B有可能会认为A死掉了,B也会接管VIP

A和B上面都有VIP了?


现在如果网络Ok了,谁的VIP生效?

这个是谁最后更新arp列表成功,谁生效。一般是第二个抢占的,会占用vip,可以ssh vip试试

通常是防火墙开着导致的;


chkconfig --list|grep on

chkconfig iptables off 

建议大家把iptables 关掉

iptables , selinux 都是关掉的

vi /etc/sysconfig/selinux

修改/etc/selinux/config 文件

将SELINUX=enforcing改为SELINUX=disabled


什么样的场景会出现脑裂,以及应对?

1,vrrp通信中断    ##这个是防火墙策略的问题;两台机器一个交换机下面

2,网络中断


vrrp_script vs_mysql_82 {

    script "/etc/keepalived/checkMySQL.py -h 127.0.0.1 -P 3306"

    interval 60 

}


在这个脚本里加一个ping 网关;Return 0 


观查一下keepalived的启动及切换日志

tail -f /var/log/message 



keepalived    #主进程

healtcheck   #调用脚本的进程

VRRP   #vrrp协议


都配置成backup,别搞成master ,




2. 如果state配置的BACKUP,则直接进入BACKUP状态,如果在不存在Master的情况下,执行track_script,成功进入Master,失败进入FAULT; 在存在MASTER的情况下,保持在BACKUP状态。 

其中都是BACKUP配置是,会比较priority的大小,同时启动时,较大的prority,会成为首选的Master.


我们这里的    priority是一样的,谁先启动谁用master;


3. FAULT状态是,试图进入Master没成功时才会进入Fault状态。[所以也能解释: 为什么BACKUP在存在Master的时,只会进入BACKUP状态],在FAULT状时不会接管VIP。


4. Keepalived正常退出,会进入stop state,提前会把VIP释放掉,如果keepalived补Kill掉,那么VIP不会被释放。


ip addr show 

因此在脚本里最好不用写kill `pidof keepalived` 


VIP管理的特性

keepalived管理lvs;

lvs:  Linux Virtual Server


LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。目前有三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR),十种调度算法(rrr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq)。

章博士去滴滴了。




想在挂几个Slave怎么来操作呢?

基于GTID+keepalived 

一种是把Slave挂到非VIP的Master上

另一种是把Slave挂到VIP上同步




传统复制,slave是挂在m2上,为什么不能挂在vip 上,因为binlog不一样;



如果m1挂掉的话,vip会到m2上,还能再切换吗?M1 加回来要会成什么样的结构?

怎么变到这个过程呢?




观查Sql_thread执行到什么位置用两个变量?

relay_master_log_file,exec_master_log_pos


show master status; 还会变呢


m1,s1,s2 的数据还会有变化吗? 应该是不会变的;

stop slave; 

set global sql_slave_skip_counter=1; 

start slave; 





如果需要挂两个从库,可以挂呢,为什么





s1. stop slave; 

change master to master_host=m2, ... auto_position=1;

start slave; 



在GTID模型下,还需配置双主吗?

KEEPALIVED+GTID 还需要配置成双主吗

start slave; 

change master to master_host=m2, ... auto_position=1;

在传统复制里要配置成双主

在传统复制如果不想配置双主有没有办法做这件事呢

在接管VIP之前,做一个show master status; 并记录下来

notify_master /path/get_master_pos.sh 

echo "show master status"|mysql -h127.0.0.1 -P3307 -uroot -pxxxx

echo "show master status"|mysql -h127.0.0.1 -P3307 -uroot -pxxxx

>/path/`date %xxxx `.


notify_master 

notify_backup

notify_fault 




从库怎么做一个高可用呢?



#Keepalived 启动及STATE转换分析


>这里讨论一下keepalived启动及关闭是状态转换及相应的脚本执行

******

***Keepalived启动后状态依赖于 keepalived.conf中配置的state, 下面分别说明***


1. 当state配置是的master状态时,先执行track_script, keepalived试图进入Master状态,参考track_script返回的结果,如果返回成功,则为Master状态,如果失败,进入FAULT状态


Oct 15 17:15:14 node78 Keepalived[7699]: Starting Keepalived v1.2.7 (12/20,2012)

Oct 15 17:15:14 node78 Keepalived[7700]: Starting Healthcheck child process, pid=7701

Oct 15 17:15:14 node78 Keepalived[7699]: Starting Keepalived v1.2.7 (12/20,2012)

Oct 15 17:15:14 node78 Keepalived[7700]: Starting Healthcheck child process, pid=7701

Oct 15 17:15:14 node78 Keepalived[7700]: Starting VRRP child process, pid=7702

....

Oct 15 17:15:14 node78 Keepalived_healthcheckers[7701]: Configuration is using : 4685 Bytes

Oct 15 17:15:14 node78 Keepalived_healthcheckers[7701]: Using LinkWatch kernel netlink reflector...

Oct 15 17:15:14 node78 root: Failed:redis-cli -h 127.0.0.1 -p 6680 PING

Oct 15 17:15:14 node78 Keepalived_vrrp[7702]: VRRP_Instance(redis1) Transition to MASTER STATE

Oct 15 17:15:15 node78 Keepalived_vrrp[7702]: VRRP_Instance(redis1) Entering FAULT STATE

Oct 15 17:15:15 node78 Keepalived_vrrp[7702]: VRRP_Instance(redis1) Now in FAULT state

Oct 15 17:15:15 node78 root: From notify: INSTANCE redis1 FAULT 90

如果有兄弟在Master状态,track_script返回成功,则接管Master状态,原来的进入BACKUP状态。(线上为两者为BACKUP状态)


2. 如果state配置的BACKUP,则直接进入BACKUP状态,如果在不存在Master的情况下,执行track_script,成功进入Master,失败进入FAULT; 在存在MASTER的情况下,保持在BACKUP状态。 


其中都是BACKUP配置是,会比较priority的大小,同时启动时,较大的prority,会成为首选的Master.



3. FAULT状态是,试图进入Master没成功时才会进入Fault状态。[所以也能解释: 为什么BACKUP在存在Master的时,只会进入BACKUP状态],在FAULT状时不会接管VIP。


4. Keepalived正常退出,会进入stop state,提前会把VIP释放掉,如果keepalived补Kill掉,那么VIP不会被释放。




##总结

对于Keepalived双方都是配置的state ***BACKUP***状态的情况下,不能适用于对于数据有持久化要求的场景(原因先启动Redis在启动Keepalived都需要先执行一个notify_backup脚本)


场景1: 指定主从启动 RedisA->RedisB

 

 启动Redis A上Keepalived的进入BACKUP状态,执行notify_backup, 变为RedisB的从

 启动Redis B上keepalived的进入BACKUP状态,执行notfiy_backup,变为Redis A的从

 

    Note: 这个阶段很有可能出现互为主从的结构,然后Redis不响应写,响应读也很慢,任何命令都会很慢,大的量的访问有可能会挂掉。

 

 直致最终两者出现一个升级为master ,执行notify_master

避免方法:

在Redis双方都挂掉,或是都重新启动时,先起动一个节点,保证第一个节起为Master状态,VIP接管成功后,再起另一个状态。



场景2: 双方起动后两边都有VIP,但主从关系正常

原因: 一方的keepalived被kill掉后,另一方起动keepalived,接管了vip,但原来的VIP没释放,故障的keepalived启动后,进入backup状态VIP没清理造成的。但通信上,应该是以接管的为主。

处理办法:确定KEEPALIVED相应的INSTANCE的状态后,手工释放那个无效的VIP。

场景3:两边都有VIP,主从关系不正常)

原因:

Master/Slave网络有问题,双方联系不上对方了,各自认为是自已是主了。

如原来的BACKUP和MASTER网络之间有问题,BACKUP接收到MASTER发来的通知包时,BACKUP就会升级新的主服务器。 这样就出现了两边都有VIP,STATE都MASTER的状态。

企望这种情况下保持不动:

处理办法:

在MASTER状态下,vrrp_script只检测自已的监管的进程(Redis)是否存在或是INFO输出是否正常。

在Slave状态下,vrrp_script要做两个检测: 

自已的网络是否正常 依赖是不是能PING通网关

在检测是监管的进程是不是正常

全OK,exit 0具备进入Master状态,如果任一不OK,exit 1在期望接管理时,会进入FAULT状态


场景4: FAULT->MASTER的过程


在配置为state BACKUP下,当keepalived满足从FAULT进入MASTER时(vrrp_script返回成功),KEEPALIVED会先进入BACKUP状态,执行notfiy_backukp,然后在进入MASTER状态。

作业:


完成keepalived+双主

扩展 LVS做从库负载

MHA环境搭建;



「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论