高可用集群Keepalived

一、keepalived部署

1.简介

vrrp 协议的软件实现,原生设计目的为了高可用 ipvs服务

功能: 基于vrrp协议完成地址流动

为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)

为ipvs集群的各RS做健康状态检测

基于脚本调用接口完成脚本中定义的功能,进而影响集群事务,以此支持nginx、haproxy等服务

2、环境准备

KA1:172.25.254.50

KA2:172.25.254.60

RS1:172.25.254.11

RS2:172.25.254.21

安装keepalive

在KA1和KA2中安装keepalived,realserver中安装nginx

复制代码
[root@KA1 ~]# dnf install keepalived -y
[root@KA1 ~]# systemctl start keepalived
[root@RS1 ~]# dnf install nginx -y
[root@RS1 ~]# systemctl enable --now nginx
[root@RS1 ~]# systemctl start nginx

3、全局配置

复制代码
! Configuration File for keepalived
 global_defs {
   notification_email {
         zcx@zcx.com     #keepalived 发生故障切换时邮件发送的目标邮箱,可以按行区分写多个   
   }
   notification_email_from keepalived@KA1.timinglee.org  #发邮件的地址
   smtp_server 127.0.0.1                                 #邮件服务器地址
   smtp_connect_timeout 30                               #邮件服务器连接timeout
   router_id KA1.timinglee.org                           #每个keepalived主机唯一标识
                                                         #建议使用当前主机名,但多节点重名不影响
  
  vrrp_skip_check_adv_addr                               #对所有通告报文都检查,会比较消耗性能
                                                         #启用此配置后,如果收到的通告报文和上一个报文是同一                                                                
                                                         #个路由器,则跳过检查,默认值为全检查
  
   vrrp_strict                                  #严格遵循vrrp协议
                                                #启用此项后以下状况将无法启动服务:
                                                #1.无VIP地址 
                                                #2.配置了单播邻居 
                                                #3.在VRRP版本2中有IPv6地址
                                                #建议不加此项配置
  
  vrrp_garp_interval 1                          #免费 ARP(Gratuitous ARP)报文时间间隔
                                                #免费 ARP用于通知网络中其他设备,某 IP 地址对应的 MAC 地址发生了变化
                                                #帮助网络设备更新 ARP 缓存,确保数据能正确转发到新的主节点
                                                
  vrrp_gna_interval 1                           #用于配置发送 Gratuitous NA(免费邻居通告报文的时间间隔
                                                #通知网络中其他设备,某 IPv6 地址对应的链路层地址(MAC 地址)发生了变化
                                                #帮助网络设备更新邻居缓存(Neighbor Cache)
                                                #确保 IPv6 数据包能正确转发到新的主节点
                                                 
  vrrp_mcast_group4 224.0.0.44                  #指定组播IP地址范围: 
 }

4、配置虚拟路由器

复制代码
vrrp_instance WEB_VIP {
    state MASTER
    interface ens160         #绑定为当前虚拟路由器使用的物理接口,如:eth0,可以和VIP不在一个网卡
    virtual_router_id 51     #每个虚拟路由器惟一标识,范围:0-255,每个虚拟路由器此值必须唯一否则服务无法启动
                             #同属一个虚拟路由器的多个keepalived节点必须相同

    priority 100             #当前物理节点在此虚拟路由器的优先级,值越大优先级越高范围:1-254
    advert_int 1             #vrrp通告的时间间隔,默认1s
    authentication {         #认证机制
        auth_type PASS       #AH为IPSEC认证(不推荐),PASS为简单密码(建议使用)
        auth_pass 1111       #预共享密钥,仅前8位有效
    }
    virtual_ipaddress {      #虚拟IP,生产环境可能指定上百个IP地址
        172.25.254.100/24 dev ens160 label ens160:0
    }
    accept                   #开启vip 对外响应ping包,注意此处功能需要关闭vrrp_strict
}

#检查
[root@KA1 ~]# keepalived -t -f /etc/keepalived/keepalived.conf

测试

5、启用keepalived日志功能

复制代码
[root@KA1 ~]# vim /etc/sysconfig/keepalived
 KEEPALIVED_OPTIONS="-D -S 6"                     #日志级别为0-7        
[root@ka1 ~]#vim /etc/rsyslog.conf

local6.*                                          /var/log/keepalived.log 
[root@ka1 ~]#systemctl restart keepalived.service rsyslog.service

测试

6、实现独立子配置文件

当生产环境复杂时,/etc/keepalived/keepalived.conf 文件中内容过多,不易管理 将不同集群的配置,比如:不同集群的VIP配置放在独立的子配置文件中利用include 指令可以实现包含子配置文件

示例:

复制代码
[root@KA1 ~]# mkdir  /etc/keepalived/conf.d
[root@KA1 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
 global_defs {
     notification_email {
     zcx@qq.com
     }
     notification_email_from keepalived@KA1.timinglee.org
     smtp_server 127.0.0.1
     smtp_connect_timeout 30
     router_id KA1.zcx.org
     vrrp_skip_check_adv_addr
     #vrrp_strict
     vrrp_garp_interval 1
     vrrp_gna_interval 1
     vrrp_mcast_group4 224.0.0.44
}
include /etc/keepalived/conf.d/*.conf       #相关子配置文件

[root@KA1 ~]# systemctl restart keepalived

二、Keepalived 企业应用示例

1、单主架构

MASTER配置:

复制代码
[root@KA1 ~]# mkdir  /etc/keepalived/conf.d
[root@KA1 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance WEB_VIP {
    state MASTER            #status为MASTER模式
    interface ens160
    virtual_router_id 51    
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    unicast_src_ip 172.25.254.50    
    unicast_peer {
        172.25.254.60
    }
    virtual_ipaddress {
        172.25.254.100/24 dev ens160 label ens160:0    #vip设置
    }
}

[root@KA1 ~]# systemctl restart keepalived

BACKUP配置

复制代码
[root@KA1 ~]# mkdir  /etc/keepalived/conf.d
[root@KA1 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance WEB_VIP {
    state BACKUP            #status为MASTER模式
    interface ens160
    virtual_router_id 51    #相同id管理同一个虚拟路由
    priority 80             #优先级,应低于master
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    unicast_src_ip 172.25.254.60    #单播
    unicast_peer {
        172.25.254.50
    }
    virtual_ipaddress {
        172.25.254.100/24 dev ens160 label ens160:0    #vip设置
    }
}

[root@KA1 ~]# systemctl restart keepalived

抓包观察

2、抢占和非抢占模式

默认为抢占模式preempt,即当高优先级的主机恢复在线后,会抢占低先级的主机的master角色,这样会使vip在KA主机中来回漂移,造成网络抖动,建议设置为非抢占模式 nopreempt ,即高优先级主机恢复后,并不会抢占低优先级主机的master角色 非抢占模块下,如果原主机down机, VIP迁移至的新主机, 后续也发生down时,仍会将VIP迁移回原主机

非抢占模式:

复制代码
[root@KA1 ~]# mkdir  /etc/keepalived/conf.d
[root@KA1 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance WEB_VIP {
    state BACKUP            #互为主备,status都为BACKUP
    interface ens160
    virtual_router_id 51    
    priority 100
    nopreempt              #非抢占模式,互为主备
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev ens160 label ens160:0
    }
}

[root@KA1 ~]# systemctl restart keepaliv

当vip在线主机宕机后,vip转移至另一台主机,重新上线后,只有在另一台主机宕机时vip才会重新转移回来

抢占模式:

复制代码
#KA1中设置
vrrp_instance WEB_VIP {
    state MASTER
    interface ens160
    virtual_router_id 51    
    priority 100
    #nopreempt              #非抢占模式,互为主备
    preempt_delay 10        #抢占模式,可以设定延时抢占
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev ens160 label ens160:0
    }
}

#在KA2中
vrrp_instance WEB_VIP {
    state BACKUP
    interface ens160
    virtual_router_id 51    
    priority 100
    #nopreempt
    preempt_delay 10
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev ens160 label ens160:0
    }
}

当master宕机后,vip转移至backup,当master重新上线后待延时后vip重新转移至master

3、vip单播配置

默认keepalived主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量。(注:启用 vrrp_strict 时,不能启用单播)

复制代码
vrrp_instance WEB_VIP {
    state MASTER
    interface ens160
    virtual_router_id 51
    priority 100
    #nopreempt              #非抢占模式,互为主备
    #preempt_delay  300     #延迟抢占模式
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    unicast_src_ip 172.25.254.50    #单播配置,源地址
    unicast_peer {                  
        172.25.254.60               #指定接收单播的对方目标主机IP
                                    #如果有多个keepalived,再加其它节点的IP
    }
    virtual_ipaddress {
        172.25.254.100/24 dev ens160 label ens160:0
    }
}

抓包测试:

4、Keepalived 通知脚本配置

当keepalived的状态变化时,可以自动触发脚本的执行,比如:发邮件通知用户默认以用户

keepalived_script身份执行脚本

如果此用户不存在,以root执行脚本可以用下面指令指定脚本执行用户的身份

keepalived配置文件修改

复制代码
global_defs {
   notification_email {
    zcx@zcx.ogr              
   }
   notification_email_from zcx@zcx1.org
   smtp_server 127.0.0.0
   smtp_connect_timeout 30
   router_id KA1
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 1
   vrrp_gna_interval 1
   enable_script_security       #全局安全选项,用于 限制脚本执行权限,防止未经授权的脚本被调用
   script_user root             #指定所有外部脚本,以root用户执行
   vrrp_mcast_group4 224.0.0.44
}

vrrp_instance WEB_VIP {
    state MASTER
    interface ens160
    virtual_router_id 51
    priority 100
    #nopreempt              #非抢占模式,互为主备
    #preempt_delay  300     #延迟抢占模式
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    unicast_src_ip 172.25.254.50
    unicast_peer {
        172.25.254.60
    }
    virtual_ipaddress {
        172.25.254.100/24 dev ens160 label ens160:0
    }
    notify_master "/etc/keepalived/mail.sh master"        #当前节点成为主节点时触发的脚本
    notify_backup "/etc/keepalived/mail.sh backup"        #当前节点转为备节点时触发的脚本

    notify_fault "/etc/keepalived/mail.sh fault"          #当前节点转为"失败"状态时触发的脚本
}

创建通知脚本

复制代码
[root@KA1 ~]# vim /etc/keepalived/mail.sh
#!/bin/bash
mail_dest='zcx@qq.com'
mail_send()
{
    mail_subj="$HOSTNAME to be $1 vip 转移"
    mail_mess="`date +%F\ %T`: vrrp 转移,$HOSTNAME 变为 $1"
    echo "$mail_mess" | mail -s "$mail_subj" $mail_dest
}
case $1 in
    master)
    mail_send master
     ;;
     backup)
     mail_send backup
     ;;
     fault)
     mail_send fault
     ;;
     *)
     exit 1
     ;;
     esac
[root@KA1 ~]# chmod  +x /etc/keepalived/mail.sh

邮件配置

复制代码
#安装邮件发送工具
[root@KA2 ~]# dnf install sendmail -y

#配置邮箱
[root@KA1 ~]# vim /etc/mail.rc
set smtp=smtp.163.com
set smtp-auth=login
set smtp-auth-user=zcx@163.com              #163网易邮箱
set smtp-auth-password=SZdEcPS2pz8rFbFx     #IMAP/SMTP服务验证码
set from=zcx@163.com
set ssl-verify=ignor

[root@KA1 ~]# systemctl enable --now sendmail.service
[root@KA1 ~]# echo test message |mail -s test zcx@qq.com    #登录自己邮箱即可收到

5、实现 master/master 的 Keepalived 双主架构

master/slave的单主架构:同一时间只有一个Keepalived对外提供服务,此主机繁忙,而另一台主机却 很空闲,利用率低下,可以使用master/master的双主架构,解决此问题。 master/master的双主架构: 即将两个或以上VIP分别运行在不同的keepalived服务器,以实现服务器并行提供web访问的目的,提高 服务器资源利用率

双主机配置:

复制代码
[root@KA1 ~]# vim /etc/keepalived/keepalived.conf
#主
vrrp_instance WEB_VIP {
    state MASTER
    interface ens160
    virtual_router_id 51
    priority 100
    #nopreempt              #非抢占模式,互为主备
    #preempt_delay  300     #延迟抢占模式
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev ens160 label ens160:0
    }
}

#备
vrrp_instance DB_VIP {
    state BACKUP
    interface ens160
    virtual_router_id 52
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.200/24 dev ens160 label ens160:1
    }
}

KA2
[root@KA2 ~]# vim /etc/keepalived/keepalived.conf
#备
vrrp_instance WEB_VIP {
    state BACKUP
    interface ens160
    virtual_router_id 51
    priority 80
    #nopreempt              #非抢占模式,互为主备
    #preempt_delay  300     #延迟抢占模式
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev ens160 label ens160:0
    }
  }
#主
vrrp_instance DB_VIP {
    state MASTER
    interface ens160
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.200/24 dev ens160 label ens160:1
    }
}

当一个主机宕机后,vip自动迁移至另一个主机中,重新上线后vip转移为原来的主机中

6、实现IPVS的高可用性

在keepalived中安装ipvsadm

虚拟服务器配置

复制代码
[root@KA1 ~]# vim /etc/keepalived/keepalived.conf
virtual_server 172.25.254.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    protocol TCP
    real_server 172.25.254.11 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 5
            retry 3
            delay_before_retry 3
            connect_port 80
        }
    }

    real_server 172.25.254.21 80 {
        weight 1
        HTTP_GET {                #应用层监测
            url {
                path /
                status_code 200
            }
            connect_timeout 1
            retry 3
            delay_before_retry 1
        }
    }
}

在realserver中配置vip

复制代码
[root@RS1 ~]# ip a a 172.25.254.100/32 dev lo

#lo的arp抑制
[root@RS1 ~]# echo net.ipv4.conf.all.arp_ignore=1 > /etc/sysctl.conf
[root@RS1 ~]# echo net.ipv4.conf.all.arp_announce=2 >> /etc/sysctl.conf
[root@RS1 ~]# echo net.ipv4.conf.lo.arp_ignore=1 >> /etc/sysctl.conf
[root@RS1 ~]# echo net.ipv4.conf.lo.arp_announce=2 >> /etc/sysctl.conf
[root@RS1 ~]# sysctl -p

测试:

当有一个主机宕机时,vip转移,访问仍然是正常的

7、实现其它应用的高可用性 VRRP Script

keepalived利用 VRRP Script 技术,可以调用外部的辅助脚本进行资源监控,并根据监控的结果实现优先 动态调整,从而实现其它应用的高可用性功能

vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值,公共定义,可被多个实例调用,定 义在vrrp实例之外的独立配置块,一般放在global_defs设置块之后。

通常此脚本用于监控指定应用的状态。一旦发现应用的状态异常,则触发对MASTER节点的权重减至 低于SLAVE节点,从而实现 VIP 切换到 SLAVE 节点

定义 VRRP script

复制代码
 vrrp_script <SCRIPT_NAME> {            #定义一个检测脚本,在global_defs 之外配置
     script <STRING>|<QUOTED-STRING>    #shell命令或脚本路径
     interval <INTEGER>                 #间隔时间,单位为秒,默认1秒
     timeout <INTEGER>                  #超时时间
     weight <INTEGER:-254..254>         #默认为0,如果设置此值为负数,
                                        #当上面脚本返回值为非0时
                                        #会将此值与本节点权重相加可以降低本节点权重,     
                                        #即表示fall. 
                                        #如果是正数,当脚本返回值为0,
                                        #会将此值与本节点权重相加可以提高本节点权重
                                        #即表示 rise.通常使用负值
     
     fall <INTEGER>                     #执行脚本连续几次都失败,则转换为失败,建议设为2以上
     rise <INTEGER>                     #执行脚本连续几次都成功,把服务器从失败标记为成功
     user USERNAME [GROUPNAME]          #执行监测脚本的用户或组
     init_fail                          #设置默认标记为失败状态,监测成功之后再转换为成功状态
}

示例:实现HAProxy高可用

复制代码
#在keepalived中安装haproxy
[root@KA2 ~]# dnf install haproxy -y
[root@KA2 ~]# vim /etc/haproxy/haproxy.cfg
listen webcluster
    bind    *:80
    mode    http
    server web1 172.25.254.11:80 check inter 3 fall 2 rise 1
    server web2 172.25.254.21:80 check inter 3 fall 2 rise 1

[root@KA2 ~]# systemctl restart haproxy.service

#在两个ka1和ka2两个节点启用内核参数
[root@KA2 ~]# vim /etc/sysctl.conf 
net.ipv4.ip_nonlocal_bind = 1
[root@KA2 ~]# sysctl -p
net.ipv4.ip_nonlocal_bind = 1

#在KA1中编写检测脚本
[root@KA1 ~]# vim /etc/keepalived/scripts/haproxy.sh
#!/bin/bash
kallall -0 haproxy &> /dev/null

[root@KA1 ~]# chmod  +X /etc/keepalived/scripts/haproxy.sh

在ka1中配置keepalived

复制代码
vrrp_script CHECK_HAPROXY {
    script "/etc/keepalived/scripts/haproxy.sh"
    interval 1
    weight -30
    fall 2
    rise 2
    timeout 2
}

vrrp_instance WEB_VIP {
    state MASTER
    interface ens160
    virtual_router_id 51
    priority 100
    #nopreempt              #非抢占模式,互为主备
    #preempt_delay  300     #延迟抢占模式
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev ens160 label ens160:0
    }
    track_script {
        CHECK_HAPROXY
    }
}
相关推荐
A小辣椒2 天前
TShark:Wireshark CLI 功能
linux
A小辣椒2 天前
TShark:基础知识
linux
AlfredZhao2 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334663 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪3 天前
linux 拷贝文件或目录到指定的位置
linux
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush43 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5203 天前
Linux 11 动态监控指令top
linux