keepalived


原理

keepalived是基于VRRP协议实现高可用.
VRRP虚拟路由器冗余协议,最开始是给网络设备实现高可用.目前keepalive实现vrrp协议,通过vrrp实现高可用.
分为主,备一般是2个节点.主备之间通过vrrp协议发送数据包沟通. 
主给备定期发送数据包,备收到数据包表示主还活着,备无法收到数据包,表示主挂了,备胎转正了,接管用户请求流量.
vrrp协议使用组播的ip. 224.xx.xx.xx 默认(224.0.0.18)

默认配置文件解析

! Configuration File for keepalived

#全局定义部分
global_defs {
   router_id web01    # 每一个keepalived的名字 在 当前网络中唯一
} 

vrrp_instance VI_1 {      # VRRP实例的名字   主备之间的名字一定要相同
    state MASTER          # 主 MASTER  备 BUCKUP
    interface eth0        # 指定网卡
    virtual_router_id 51  # 一对主备之间的id号  要相同
    priority 100          # 优先级 数字越大优先级越高,建议之间相差50
    advert_int 1          # 心跳检测  多久发送一次VRRP数据包
    authentication {      # VRRP的授权于认证  对数据包进行加密处理
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {        # 设置vip
      10.0.0.3 dev eth0 label eth0:0  #  #label 设置了别名
    }
}
#主配置下面都是一些无关的配置  为另一个软件写的配置

实例主备之间的配置--抢占式

# 抢占式  老大永远是老大

# 非抢占式 都可以坐老大
	state 都为BACKUP
	priority 必须不同
	vrrp_instance 模块下添加 nopreempt       
############## lb01 ###############
global_defs {
   router_id web01    
} 

vrrp_instance VI_1 {     
    state MASTER        
    interface eth0       
    virtual_router_id 51 
    priority 100         
    advert_int 1         
    authentication {     
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress { 
      10.0.0.3 dev eth0 label eth0:0 
    }
}
}
################# lb02 #################
global_defs {
   router_id web02
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
      10.0.0.3 dev eth0 label eth0:0
    }
}
通过抓包来看是 10.0.0.7 一直向 224.0.0.18 发送加密信息  :我还活着:

image-20240710170054977

问题解决

1. # 主备都有vip
备认为主挂了,接管资源生成VIP.实际上主并没有挂,仍有VIP.
有很多原因可以导致脑裂,开启防火墙,selinux,keepalived配置,物理线路.

解决:
监控(备节点监控),只要备节点有vip就告警. ---- 发邮件
更狠一点监控备节点只要有vip,远程控制主节点,只要备节点认为主挂了,那就让他真的挂了. ---- 写脚本利用ssh终止主的keepalived

nginx配合keepalived

keepalived只会在主机挂了,网络断开后,才会进行主备切换.
默认情况下keepalived不会监控某个服务.
项目目标: 某个服务关闭了,keepalived就进行主备切换.
项目步骤: 
	1 书写脚本,过滤服务进程数,端口数量,检查是否运行.
	2 然后进行判断如果服务没有运行,则关闭keepalived.
	3 修改keepalived配置文件,通过keepalived调用这个脚本.
检测脚本 -- 根据端口 根据服务
#####    一定要给执行权限     ####
############### 端口 #############
#!/bin/bash
#author: lidao996
#desc: 监控 nginx 端口数量
port_cnt=`ss -lntup |grep nginx |wc -l`
if [  $port_cnt -eq 0 ];then
   systemctl stop keepalived
fi

############### 服务 #############
###### 服务名不可以含有nginx 会影响判断 ####
#!/bin/bash
#author: lidao996
#desc: 监控 nginx 端口数量
port_cnt=`ps -ef |grep [n]ginx |wc -l`
if [  $port_cnt -eq 0 ];then
   systemctl stop keepalived
fi
global_defs {
   router_id web01    
} 
vrrp_script check_web {
        script "/root/keep_lb.sh"
        interval 5
        weight   1
        user root
}

vrrp_instance VI_1 {     
    state BACKUP        
    interface eth0       
    nopreempt         
    virtual_router_id 51 
    priority 100         
    advert_int 1         
    authentication {     
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress { 
      10.0.0.3 dev eth0 label eth0:0 
    }
    track_script {
     check_web
    }
}

双主模式

应对高并发的时候设置的双主模式  充分利用两个主机 进行交互

image-20240710173811534

image-20240710174629900