keepalived详细讲解

keepalived:

Keepalived是一个基于VRRP(‌Virtual Router Redundancy Protocol,‌虚拟路由冗余协议)‌协议实现的LVS(‌Linux Virtual Server)‌服务高可用方案。‌它的主要作用是进行虚拟路由的故障切换,‌确保服务的持续可用性。‌Keepalived通过监控LVS集群系统中各个服务节点的状态,‌实现高可用性。‌它不仅可以管理LVS软件,‌还可以作为其他服务(‌如Nginx、‌Haproxy、‌MySQL等)‌的高可用解决方案软件。‌Keepalived为Linux系统和基于Linux的架构提供了负载均衡和高可用能力,‌其负载均衡功能主要源自集成在Linux内核中的LVS项目模块IPVS(‌IP Virtual Server)‌。‌此外,‌Keepalived还实现了基于多层TCP/IP协议的健康检查机制,‌包括4层TCP/IP协议负载均衡和多层TCP/IP协议的健康检查机制。‌Keepalived的作用是为LVS集群节点提供健康检查和为LVS负载均衡服务器提供故障切换的用户空间进程。‌

Keepalived采用模块化设计,‌主要包含core、‌check和vrrp三个模块,‌分别负责不同的功能。‌它支持两台服务器运行,‌一台作为主机服务器(‌MASTER)‌,‌另一台作为备份服务器(‌BACKUP)‌,‌共同对外表现为一个虚拟IP。‌当主机服务器出现问题时,‌备份服务器能够接管虚拟IP,‌继续提供服务,‌从而保证了高可用性。

1.keepalived的优点

Keepalived的特点包括自动完成不需人工干涉、‌开源、‌参与故障转移群集节点不受限制、‌避免单节点故障、‌可靠性强。‌

  • 自动完成不需人工干涉:‌Keepalived是一个类似于layer3, 4 & 5交换机制的软件,‌能够自动检测服务器的状态并进行相应的操作,‌无需人工干预。‌
  • 开源:‌Keepalived是一个开源软件,‌这意味着它可以被广泛使用和修改,‌以满足不同的需求。‌
  • 参与故障转移群集节点不受限制:‌Keepalived支持在群集节点中进行故障转移,‌且群集节点的数量不受限制。‌
  • 避免单节点故障:‌通过健康状态检查和发现活跃设备故障进行转换到备份设备,‌Keepalived能够避免单节点故障。‌
  • 可靠性强:‌Keepalived的可靠性强,‌因为它通过VRRP协议实现主备模式,‌当主设备故障时,‌备份设备可以迅速接管服务,‌确保服务的持续可用性。‌

此外,‌Keepalived是基于VRRP协议的,‌所有报文通过IP多播方式发送,‌只有主路由器(‌Master角色)‌会发送VRRP数据包,‌而备份路由器(‌BACKUP角色)‌只接收主路由器的报文信息,‌用于监控主路由器的运行状态。‌当主路由器不可用时,‌备份路由器会进行选举,‌优先级最高的备份路由器将成为新的主路由器,‌继续提供对外服务。‌这种选举角色切换非常快,‌保证了服务的持续可用性。

2.高可用集群

1.1 集群类型

LB Load Balance 负载均衡
LVS/HAProxy/nginx http/upstream, stream/upstream
HA High Availability 高可用集群
数据库、 Redis
SPoF: Single Point of Failure ,解决单点故障
HPC High Performance Computing 高性能集群

1.2 系统可用性

SLA Service-Level Agreement 服务等级协议(提供服务的企业与客户之间就服务的品质、水准、性能
等方面所达成的双方共同认可的协议或契约)
A = MTBF / (MTBF+MTTR
指标 : 99.9%, 99.99%, 99.999%,99.9999%

1.3 系统故障

硬件故障:设计缺陷、 wear out (损耗)、非人为不可抗拒因素
软件故障:设计缺陷 bug

1.4 实现高可用

提升系统高用性的解决方案:降低 MTTR- Mean Time To Repair( 平均故障时间 )
解决方案:建立冗余机制
active/passive /
active/active 双主
active --> HEARTBEAT --> passive
active <--> HEARTBEAT <--> active

1.5.VRRPVirtual Router Redundancy Protocol

虚拟路由冗余协议 , 解决静态网关单点风险
物理层 : 路由器、三层交换机
软件层 :keepalived

3.keepalived环境部署

3.1

 Keepalived 相关文件

      软件包名:keepalived

       主程序文件:/usr/sbin/keepalived

          主配置文件:/etc/keepalived/keepalived.conf

            配置文件示例:/usr/share/doc/keepalived/

              Unit File:/lib/systemd/system/keepalived.service

安装keepalived(rhel7.9):yum install keepalived -y

注意:每台服务器均需要关闭防火墙和SELINUX

3.2 配置文件组成部分

配置文件: /etc/keepalived/keepalived.conf
配置文件组成
GLOBAL CONFIGURATION
Global definitions : 定义邮件配置, route_id vrrp 配置,多播地址等
VRRP CONFIGURATION
VRRP instance(s) :定义每个vrrp 虚拟路由器
LVS CONFIGURATION
Virtual server group(s)
Virtual server(s) : LVS集群的 VS RS

3.3全局配置

3.31配置虚拟路由

KA1:

KA2:

测试
[root@KA2 ~]# tcpdump -i eth0 -nn host 224.0.0.18
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
22:48:23.294894 IP 172.25.250.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 20,prio 100, authtype none, intvl 1s, length 20
22:48:24.084793 IP 172.25.250.20 > 224.0.0.18: VRRPv2, Advertisement, vrid 30,prio 80, authtype none, intvl 1s, length 20
22:48:24.295075 IP 172.25.250.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 20,prio 100, authtype none, intvl 1s, length 20
22:48:25.085256 IP 172.25.250.20 > 224.0.0.18: VRRPv2, Advertisement, vrid 30,prio 80, authtype none, intvl 1s, length 20
22:48:25.296296 IP 172.25.250.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 20,prio 100, authtype none, intvl 1s, length 20
22:48:26.085843 IP 172.25.250.20 > 224.0.0.18: VRRPv2, Advertisement, vrid 30,prio 80, authtype none, intvl 1s, length 20
关闭KA1后再看组播信息

3.4Keepalived日志功能

[root@ka1 ~]# cat /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -S 6"
 
[root@ka1 ~]#cat /etc/rsyslog.conf
local6.* /var/log/keepalived.log
 
[root@ka1 ~]#systemctl restart keepalived.service rsyslog.service #重启服务生效\

4.企业应用实例

4.1 实现master/slave Keepalived 单主架构

ka1:

ka2:

抓包观察

tcpdump -i ens160 -nn host 224.0.0.18

4.2 抢占模式和非抢占模式

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

ka1:

ka2:

4.2.2 抢占延迟模式 preempt_delay

抢占延迟模式,即优先级高的主机恢复后,不会立即抢回 VIP ,而是延迟一段时间(默认 300s )再抢回VIP

注意:需要各 keepalived 服务器 state BACKUP, 并且不要启用 vrrp_strict

4.3 VIP单播配置

默认 keepalived 主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量
注意:启用 vrrp_strict 时,不能启用单播
ka1:
ka2:
抓包查看单播效果

4.4 Keepalived 通知脚本配置

4.4.1 通知脚本类型
当前节点成为主节点时触发的脚本
notify_master <STRING>|<QUOTED-STRING>
当前节点转为备节点时触发的脚本
notify_backup <STRING>|<QUOTED-STRING>
当前节点转为失败状态时触发的脚本
notify_fault <STRING>|<QUOTED-STRING>
通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知
notify <STRING>|<QUOTED-STRING>
当停止VRRP时触发的脚本
notify_stop <STRING>|<QUOTED-STRING>
4.4.2 脚本的调用方法

在 vrrp_instance VI_1 语句块的末尾加下面行

创建通知脚本

QQ邮箱配置

在etc下的mail.rc文件里最低加入

安装邮件发送工具:yum install mailx -y

测试:echo test message |mail -s test 1301654293@qq.com

4.4.3 实战案例:实现 Keepalived 状态切换的通知脚本

chmod +x /etc/keepalived/mail.sh

#模拟master故障

  1. [root@ka1 ~]#killall keepalived

4.5 实现 master/master 的 Keepalived 双主架构


master/slave的单主架构,同一时间只有一个Keepalived对外提供服务,此主机繁忙,而另一台主机却很空闲,利用率低下,可以使用master/master的双主架构,解决此问题。

master/master 的双主架构:

即将两个或以上VIP分别运行在不同的keepalived服务器,以实现服务器并行提供web访问的目的,提高服务器资源利用率

ka1:

ka2:

4.6. IPVS相关配置


4.6.1. 虚拟服务器配置结构


virtual_server IP port {
        ...
    real_server {
        ...
    }
    real_server {
        ...
    }
    ...
}


4.6.2 virtual server (虚拟服务器)的定义格式


virtual_server IP port #定义虚拟主机IP地址及其端口
virtual_server fwmark int #ipvs的防火墙打标,实现基于防火墙的负载均衡集群
virtual_server group string #使用虚拟服务器组


4.6.3 虚拟服务器配置


virtual_server IP port { #VIP和PORT
    delay_loop <INT> #检查后端服务器的时间间隔
    lb_algo rr|wrr|lc|wlc|lblc|sh|dh #定义调度方法
    lb_kind NAT|DR|TUN #集群的类型,注意要大写
    persistence_timeout <INT> #持久连接时长
    protocol TCP|UDP|SCTP #指定服务协议,一般为TCP
    sorry_server <IPADDR> <PORT> #所有RS故障时,备用服务器地址
    real_server <IPADDR> <PORT> { #RS的IP和PORT
    weight <INT> #RS权重
    notify_up <STRING>|<QUOTED-STRING> #RS上线通知脚本
    notify_down <STRING>|<QUOTED-STRING> #RS下线通知脚本
    HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... } #定义当前主机健康状态检测方法
    }
}
#注意:括号必须分行写,两个括号写在同一行,如: }} 会出错


4.6.4 应用层监测


应用层检测:HTTP_GET|SSL_GET

HTTP_GET|SSL_GET {
    url {
        path <URL_PATH> #定义要监控的URL
        status_code <INT> #判断上述检测机制为健康状态的响应码,一般为 200
    }
    connect_timeout <INTEGER> #客户端请求的超时时长, 相当于haproxy的timeout server
    nb_get_retry <INT> #重试次数
    delay_before_retry <INT> #重试之前的延迟时长
    connect_ip <IP ADDRESS> #向当前RS哪个IP地址发起健康状态检测请求
    connect_port <PORT> #向当前RS的哪个PORT发起健康状态检测请求
    bindto <IP ADDRESS> #向当前RS发出健康状态检测请求时使用的源地址
    bind_port <PORT> #向当前RS发出健康状态检测请求时使用的源端口
}

5. 实战案例

实战案例1:实现单主的 LVS-DR 模式

准备web服务器并使用脚本绑定VIP至web服务器lo网卡

#准备两台后端RS主机
[root@rs1 ~]# yum install httpd -y
[root@rs1 ~]# echo RS1 - 172.25.250.110 > /var/www/html/index.html
 
[root@rs1 ~]# ip addr add 172.25.250.100/32 dev lo
[root@rs1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@rs1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@rs1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@rs1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
 
[root@rs2 ~]# yum install httpd -y
[root@rs2 ~]# echo RS2 - 172.25.250.120 > /var/www/html/index.html
 
[root@rs2 ~]# ip addr add 172.25.250.100/32 dev lo
[root@rs2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@rs2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@rs2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@rs2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

配置keepalived

[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
@@@@ 省略内容 @@@@
virtual_server 172.25.250.100 80 {
    delay_loop 6
    lb_algo wrr
    lb_kind DR
    protocol TCP
    sorry_server 172.25.250.10
 
    real_server 172.25.250.110 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 5
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
 
    real_server 172.25.250.120 80 {
        weight 1
        HTTP_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
        }
    }
}
 
 
#ka2节点的配置,配置和ka1基本相同,只需修改三行
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf
@@@@ 省略内容 @@@@
virtual_server 172.25.250.100 80 {
    delay_loop 6
    lb_algo wrr
    lb_kind DR
    protocol TCP
    sorry_server 172.25.254.30
 
    real_server 172.25.250.110 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 5
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
 
    real_server 172.25.250.120 80 {
        weight 1
        HTTP_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
        }
    }
}
访问测试结果

[root@client ~]# for i in {1..6}; do curl 172.25.250.100; done
RS1 - 172.25.250.110
RS2 - 172.25.250.120
RS1 - 172.25.250.110
RS2 - 172.25.250.120
RS1 - 172.25.250.110
RS2 - 172.25.250.120
[root@ka1 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=5993)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.204.100:80 wrr
-> 172.25.254.110:80 Route 1 0 6
-> 172.25.254.120:80 Route 1 0 6
 

实战案例:实现HAProxy高可用

#在两个ka1和ka2先实现haproxy的配置
[root@ka1 & ka2 ~]# vim /etc/haproxy/haproxy.cfg
listen webserver
    bind 172.25.250.100:80
    server web1 172.25.250.110:80 check
    server web2 172.25.250.120:80 check
 
 
#在两个ka1和ka2两个节点启用内核参数
[root@ka1 & ka2 ~]# vim /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1
[root@ka1 & ka2 ~]# sysctl -p
 
 
#在ka1中编写检测脚本
[root@ka1 ~]# vim /etc/keepalived/scripts/haproxy.sh
#!/bin/bash
/usr/bin/killall -0 haproxy
 
[root@ka1 ~]# chmod +X /etc/keepalived/scripts/haproxy.sh
 
#在ka1中配置keepalived
[root@ka1 ~]#cat /etc/keepalived/keepalived.conf
vrrp_script check_haproxy {
    script "/etc/keepalived/scripts/haproxy.sh"
    interval 1
    weight -30
    fall 2
    rise 2
    timeout 2
}
vrrp_instance web {
    state MASTER
    interface ens160
    virtual_router_id 50
    priority 100
    advert_int 1
  
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.250.100 dev ens160 label ens160:0
    }
    track_script {
        check_haproxy
    }
}
 
#测试
root@ka1 ~]# systemctl stop haproxy.service

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值