Keepalived

版权声明:原创作品,谢绝转载!否则将追究法律责任。 ————— 作者:kirin

一、Keepalived( 地址漂移技术 )

单点故障: 一个功能(业务),服务器只有1台(极其凶险)

高可用: HA(High Available) 给单点设备做一个备份(时刻可以使用) 一主一备

1.什么是高可用

一般是指2台机器启动着相同的业务系统,当有一台机器down机了, 另外一台 服务器能快速的接管, 对于访问的用户是无感知的。

2.高可用通常使用什么软件?

通常服务高可用我们选择使用keepalived软件实现

keepalived 传送门

heartbeat ❤

3.keepalived 如何实现高可用的?

keepalived软件是基于VRRP议实现的。VRRP拟路由冗余协议,主要用于解决单点故障问题

4.那VRRP是如何诞生的,VRRP的原理又是什么?

Keepalived高可用对之间是通过VRRP协议通信的,因此,我从VRRP协议 介绍开始给您讲起:

1、VRRP协议,全称Virtual Router Redundancy Protocol,中文名为虚拟 路由冗余协议,VRRP的出现是为了解决静态路由的单点故障。
2、VRRP是通过一种竞选协议机制来将路由任务交给某台VRRP路由器的。
3、VRRP是用过IP多播的方式(默认多播地址(224.0.0.18))实现高可用 对之间通信的。
4、工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包 的时候,就启动接管程序接管主节点的资源。备节点可以有多个,通过优 先级竞选,但一般Keepalived系统运维工作中都是一对。
5、VRRP使用了加密协议加密数据,但Keepalived官方目前还是推荐用明 文的方式配置认证类型和密码。

1、比如公司的网络是通过网关转换进行上网的,那如果该路由器故障了,网关 无法转发报文了,此时所有人都将无法上网,这么时候怎么办呢?*

2、通常做法是给路由增加一台备节点,但问题来了?如果我们的主网关master 故障了,用户是需要手动修改网关指向Backup,如果用户过多修改起来会非 常的麻烦。

3、第一个问题: 假设用户将指向都修改到Backup路由器,那么Master路由器 如果修复好了又该怎么办?

4、第二个问题: 假设Master网关故障,我们将Backup网关配置为Master网 关IP行不行?

5、其实上不行,因为PC第一次是通过ARP广播寻找到Master网关的Mac地址与 IP地址,PC则会将Master网关的对应IP与MAC地址写入ARP缓存表中,那么 PC第二次则会直接读取ARP缓存表中的MAC地址与IP地址,然后进行数据包的 转发。此时PC转发的数据包还是会教给Master。(除非PC的ARP缓存表过 期,在次发起ARP广播的时候才能正确获取Bakcup的Mac地址与对应的IP地 址。)*

高可用核心概念总结

1.如何确定谁是主节点谁是备节点。(投票选举?优先级?配置文件中设 置)
2.如果Master故障,Backup自动接管,那Master恢复后会夺权吗?(抢占式、非抢占式)
3.如果两台服务器都认为自己是Master会出现什么问题?(都认为对方挂了) (脑裂)

二、环境准备与安装

可用安装配置

状态 IP 角色 主机名
节点1 10.0.0.5 Master Lb01
节点2 10.0.0.6 Backup Lb02(nginx)
VIP 10.0.0.3

2.1.在master与backup上分别安装 keepalived

lb01 ~]#   yum install keepalived -y
lb02 ~]#   yum install keepalived -y

2.2.编写配置文件

lb01 ~]#   vim / etc/keepalived/keepalived.conf
global_defs {     
    router_id lb01   
}
 
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 50
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
}
    virtual_ipaddress {
        10.0.0.3
    }
}
 
#启动服务并加入开机自启
lb01 ~]#   systemctl start keepalived.service
lb01 ~]#   systemctl enable keepalived.service 

#Backup配置

lb02 ~]#   vim / etc/keepalived/keepalived.conf
global_defs {     
    router_id lb02   
}
 
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 50
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
}
    virtual_ipaddress {
        10.0.0.3
    }
}
 
#启动服务并加入开机自启
lb02 ~]#   systemctl start keepalived.service
lb02 ~]#   systemctl enable keepalived.service 

2.3.##通过命名行看到lb01上会多出一个10.0.0.3的VIP地址。


通过arp表看到10.0.0.3与10.0.0.5的mac地址一样

2.3.1keepalived高可用的地址漂移测试
1.在Master上进行如下操作
# Master存在vip地址
[root@lb01 ~]# ip addr |grep 10.0.0.3
inet 10.0.0.3/24 scope global secondary eth0
# 停止Master上的keepalived, 检测vip已不存在
[root@lb01 ~]# systemctl stop keepalived
[root@lb01 ~]# ip addr |grep 10.0.0.3
2.在Backup上进行如下操作
#发现地址已经漂移至Backup端
[root@lb02 ~]# ip addr|grep 10.0.0.3
inet 10.0.0.3/24 scope global secondary eth0
3.此时重新启动Master上的Keepalived,会发现VIP被强行抢占
[root@lb01 ~]# systemctl start keepalived
[root@lb01 ~]# ip addr |grep 10.0.0.3
inet 10.0.0.3/24 scope global secondary eth0

三、keepalived高可用抢占式与非抢占式?

默认是抢占式

通常master服务故障后backup会变成master,但是当master服务又恢复的 时候,master会抢占VIP,这样就会发生两次切换对业务繁忙的网站来说并 不是太友好,此时我们可以配置keepalived为非抢占式(前提两台主机的硬件 配置信息一致)

配置非抢占式步骤如下

1、两个节点的state都必须配置为BACKUP(官方建议)
2、两个节点都在vrrp_instance中添加nopreempt参数
3、其中一个节点的优先级必须要高于另外一个节点的优先级。

两台服务器都角色状态启用nopreempt后,必须修改角色状态统一为 BACKUP,唯一的区分就是优先级。

#当高优先级机器联机时,VRRP通常会抢占低优先级机器。

#“nopreempt”允许低优先级机器维护主角色,即使高优先级机器重新联机。

#注意:要使其工作,此项的初始状态必须是BACKUP。

#Master
vrrp_instance VI_1 {
	state BACKUP
	priority 150
	nopreempt###非抢占
}
#Backup
vrrp_instance VI_1 {
	state BACKUP
	priority 150
	nopreempt###非抢占
}

四、 keepalived 监控nginx 高可用

keepalived 只在keepalived服务关闭或断网,服务器宕机,才会进行主备切换.要使用keepalived监控某个服务,需要书写监控脚本,然后keepalived 定时执行脚本.

#监控脚本思路:

##1. 检查nginx进程/端口是否存在
##2. 如果没有,就把keepaliived 关闭
#1 . 测试命令
Ps -ef|grep nginx |wc -l
#2. 书写脚本
[root@lb01 ~]# cat   /server/scripts/chk_lb.sh
#!/bin/bash
proc_cnt=`ps -C nginx --no-heading |wc -l`
if [ $proc_cnt -eq 0 ];then
systemctl stop keepalived
fi
#测试
[root@lb01 ~]# systemctl is-active nginx   keepalived.service
active
active
[root@lb01 ~]# pkill nginx
[root@lb01 ~]# systemctl is-active nginx keepalived.service
failed
active
[root@lb01 ~]# sh /server/scripts/chk_lb.sh
[root@lb01 ~]# systemctl is-active nginx   keepalived.service
#检查脚本升级: 给nginx一次机会,启动一次看看

#监控脚本思路:

##1. 检查nginx进程/端口是否存在
	#1) 如果不存在,则重启nginx
	#2) 等待2-3秒
	#3) 再次检查nginx进程/端口 是否存在
	#a 仍然不存在
	#b.就把keepaliived 关闭
[root@lb01 ~]# cat /server/scripts/chk_lb-v2.sh
#!/bin/bash
 
#第1次检查脚本状态
proc_cnt=`ps -C nginx --no-heading |wc -l`
if [ $proc_cnt -eq 0 ];then
systemctl start nginx
sleep 3
#等待3秒后,再次检查nginx状态
	proc_cnt=`ps -C nginx --no-heading |wc -l`
	if [ $proc_cnt -eq 0 ];then
	systemctl stop keepalived
	fi
fi
 
#keep执行监控脚本
[root@lb01 script]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
  router_id lb02
}
 
vrrp_script chk_lb {      #<==定义vrrp脚本,检 测HTTP端口
script "/server/scripts/chk_lb.sh" #<==执行脚本,当nginx 服务有问题,就停掉keepalived服务。
interval 2          #<==间隔2秒
weight 2 ####权重,可以不加
}
 
vrrp_instance VI_1 {
 state BACKUP
 interface eth0
 virtual_router_id 50
 priority 100
 advert_int 1
 authentication {
 auth_type PASS
 auth_pass 1111
}
 virtual_ipaddress {
 10.0.0.3
}
 
track_script {        #指定vrrp实例使用 , 监控脚本
chk_lb      #<==触发检查
}
}

五、keepalived高可用故障脑裂

由于某些原因,导致两台keepalived高可用服务器在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权,而此时的两台高可用 服务器又都还活着。

1.服务器网线松动等网络故障

2.服务器硬件故障发生损坏现象而崩溃

3.主备都开启firewalld防火墙

脑裂的时候是什么样子的:

有vip地址

ping通 master_ip

curl /wget

#脑裂检查脚本思路

#1.检查备节点是否有vip

#2.检查备节点是否可以ping通 主节点

##1. 和 2. 同时成立 脑裂

[root@lb02 ~]# cat   /server/scripts/chk_break_brain.sh
#!/bin/bash
vip=10.0.0.3
master_ip=10.0.0.5
while true
do
vip_cnt=`ip a |grep  $vip -w|wc -l`
#使用ping检查指定ip是否可以访问
ping -c1 -W1 $master_ip &>/dev/null
if [ $? -eq 0 -a $vip_cnt 1 ] ; then
echo 发生脑裂;
else
echo 一切正常
	fi
sleep 3 
done

测试

posted @ 2022-04-12 20:55  kirin(麒麟)  阅读(310)  评论(0编辑  收藏  举报
Δ