高可用集群工具keepalived超详细讲解

一、高可用集群

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.95%:(60*24*30)*(1-0.9995)=21.6 分钟 # 一般按一个月停机时间统计

指标 : 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

1.5.1  VRRP 的概念

    VRRP(Virtual Router Redundancy Protocol)即虚拟路由器冗余协议,是一种网络容错协议。VRRP通过在多个路由器间建立虚拟的路由身份,提供了一种简单高效的机制来保障网络出口点的高可用性,从而防止因单一设备故障导致的网络中断问题。

1.5.2  技术优点

1.高可靠性:VRRP能够在主路由器出现故障时快速切换到备份路由器,从而保证网络通信的连续性和可靠性。

2.简化管理:配置VRRP不需要修改现有的动态路由协议或主机默认网关设置,简化了网络管理的复杂性。

3.适应性强:VRRP报文封装在IP报文中,支持多种上层协议,具有很强的适应性。

4.开销小:VRRP只定义了一种报文类型,且只有处于Master状态的路由器会发送VRRP报文,减少了网络开销。

5.互操作性:VRRP作为一个通用解决方案,能够与不同厂商的设备进行无缝集成,提高了互操作性。

6.安全性:VRRP支持认证机制,可以配置密码来防止非法路由器加入VRRP备份组,增强网络安全性。

1.5.3 技术缺点

依赖于配置:VRRP的运作依赖于正确的配置,错误的配置可能导致网络不稳定。
不适用于动态路由:VRRP主要应用于静态路由环境中,对于动态路由协议如RIP、OSPF,VRRP不会提供额外的优势。
仅限于局域网:VRRP通常用于局域网环境中,对于广域网的复杂性和多样性,可能需要更高级的解决方案。
资源占用:虽然VRRP本身开销小,但在大型网络中,维护大量的虚拟路由器信息可能会占用一定的系统资源。

1.5.4 应用场景

简化配置:使用VRRP可以无需修改现有主机或网关的配置,简化网络管理的复杂度。

适用场景:VRRP适用于需要高可靠性的网络环境,例如企业网、数据中心等场合,确保关键业务在出现单点故障时仍能维持正常运行。

1.5.5  VRRP 相关术语

虚拟路由器:Virtual Router

虚拟路由器标识:VRID(0-255),唯一标识虚拟路由器

VIP:Virtual IP

VMAC:Virutal MAC (00-00-5e-00-01-VRID)

物理路由器:

master:主设备

backup:备用设备

priority:优先级

1.5.6  VRRP 相关技术

通告:心跳,优先级等;

周期性 工作方式:抢占式,非抢占式

安全认证:

1.无认证

2.简单字符认证:预共享密钥

3.MD5

工作模式:

主/备:单虚拟路由器

主/主:主/备(虚拟路由器1),备/主(虚拟路由器2)

二、 Keepalived 

2.1 Keepalived 体系结构

2.2  Keepalived 相关文件

软件包名:keepalived
主程序文件:/usr/sbin/keepalived
主配置文件:/etc/keepalived/keepalived.conf
配置文件示例:/usr/share/doc/keepalived/
Unit File:/lib/systemd/system/keepalived.service
Unit File的环境配置文件:/etc/sysconfig/keepalived
用户空间核心组件:

vrrp stack:VIP消息通告

checkers:监测

real server system call:实现 vrrp 协议状态转换时调用脚本的功能

SMTP:邮件组件

IPVS wrapper:生成IPVS规则

Netlink Reflector:网络接口

WatchDog:监控进程

控制组件:提供keepalived.conf 的解析器,完成Keepalived配置

IO复用器:针对网络目的而优化的自己的线程抽象

内存管理组件:为某些通用的内存管理功能(例如分配,重新分配,发布等)提供访问权限

三、 Keepalived全局配置

vim /etc/keepalived/keepalived.conf
 
global_defs {
   notification_email {
      2721509002@qq.com                #keepalived 发生故障切换时邮件发送的目标邮箱,可以按行区分写多个
   }
   notification_email_from keepalived@ka1.exam.org      #发邮件的地址
   smtp_server 127.0.0.1                                #邮件服务器地址
   smtp_connect_timeout 30                              #邮件服务器连接timeout
   router_id ka1.exam.org                               #每个keepalived主机唯一标识,多节点 
                                                         重名不影响
 
   vrrp_skip_check_adv_addr                 #对所有通告报文都检查,会比较消耗性能  
                                            #启用此配置后,如果收到的通告报文和上一个报文是同一个路由器,则跳过检查,默认值为全检查
 
   #vrrp_strict                            #严格遵循vrrp协议
                                           #启用此项后以下状况将无法启动服务:
                                              1.无VIP地址
                                              2.配置了单播邻居
                                              3.在VRRP版本2中有IPv6地址
                                           #建议不加此项配置
 
   vrrp_garp_interval 0                    #报文发送延迟,0表示不延迟
   vrrp_gna_interval 0                     #消息发送延迟
   vrrp_mcast_group4 224.0.0.18            #指定组播IP地址范围:
}

四、配置虚拟路由器 

vrrp_instance VI_1 {
       
     state MASTER
 
     interface eth0 #绑定为当前虚拟路由器使用的物理接口,如:eth0,可以和VIP不在一个网卡
 
     virtual_router_id 51    #每个虚拟路由器惟一标识,范围:0-255,每个虚拟路由器此值必须唯一
 
                             #否则服务无法启动
 
                             #同属一个虚拟路由器的多个keepalived节点必须相同
 
                             #务必要确认在同一网络中此值必须唯一
 
      priority 100           #当前物理节点在此虚拟路由器的优先级,范围:1-254
 
                             #值越大优先级越高,每个keepalived主机节点此值不同
 
      advert_int 1           #vrrp通告的时间间隔,默认1s
 
      authentication {       #认证机制
 
           auth_type AH|PASS     #AH为IPSEC认证(不推荐),PASS为简单密码(建议使用)
 
           uth_pass 1111        #预共享密钥,仅前8位有效
 
                                #同一个虚拟路由器的多个keepalived节点必须一样
 
     }
     virtual_ipaddress {        #虚拟IP,生产环境可能指定上百个IP地址
 
    <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
    
     172.25.254.100     #指定VIP,不指定网卡,默认为eth0,注意:不指定/prefix,默认32
 
     172.25.254.101/24 dev eth1
 
     172.25.254.102/24 dev eth2 label eth2:1
 
    }
 
}
 

五、应用层监测

应用层检测: 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发出健康状态检测请求时使用的源端口
}

六、TCP监测

TCP_CHECK {
    connect_ip <IP ADDRESS> #向当前RS的哪个IP地址发起健康状态检测请求
    connect_port <PORT> #向当前RS的哪个PORT发起健康状态检测请求
    bindto <IP ADDRESS> #发出健康状态检测请求时使用的源地址
    bind_port <PORT> #发出健康状态检测请求时使用的源端口
    connect_timeout <INTEGER> #客户端请求的超时时长
                              #等于haproxy的timeout server
}

七、抢占模式和非抢占模式

7.1 非抢占模式 nopreempt

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

7.2 抢占延迟模式 preempt_delay

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


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

八、VIP单播配置

    默认 keepalived 主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量。
注意:启用 vrrp_strict 时,不能启用单播
# 在所有节点 vrrp_instance 语句块中设置对方主机的 IP ,建议设置为专用于对应心跳线网络的地
址,而非使用业务网络
unicast_src_ip <IPADDR> # 指定发送单播的源 IP
unicast_peer {
<IPADDR> # 指定接收单播的对方目标主机 IP
......
}

 九、双主架构

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

十、实验部分

10.1 实现keepalived的双主架构 master/master


vim /etc/keepalived/keepalived.conf
 
vrrp_instance VI_2 {
    state MASTWE
    interface eth0
    virtual_router_id 200
    priority 80      先级不能一样
    advert_int 1
    #preempt_delay 5s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.200/24 dev eth0 label eth0:2
    }
    unicast_src_ip 172.25.254.10
    unicast_peer {
        172.25.254.20
    }
}

10.2 实现单主的 LVS-DR 模式 

永久设定vip:
vim /etc/sysconfig/network-scripts/ifcfg-lo 
添加:
IPADDR1=172.25.254.100
NETMASK1=255.255.255.255
NETWORK=127.0.0.0
 
reslserver1和2上面给上vip(临时)
ip a a 172.25.254.100 dev lo
 
解决响应问题:
查看arp:
sysctl -a | grep arp
 
ka1上面
vim /etc/sysctl.d/arp.conf
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.lo.arp_ignore=1
 
用scp命令写到ka2上面:
scp /etc/sysctl.d/arp.conf root@172.25.254.110:/etc/sysctl.d/arp.conf
 

ka1和ka2上面安装ipvsadm 用来查看策略:
yum install ipvsadm -y
ka1和ka2一样:
vim /etc/keepalived/keepalived.conf
 
virtual_server 172.25.254.100 80 {
    delay_loop 6
    lb_algo wrr
    lb_kind DR
    #persistence_timeout 50
    protocol TCP
 
real_server 172.25.254.110 80 {
    weight 1
    HTTP_GET {
        url {
          path /
          status_code 200
        }
        connect_timeout 3
        nb_get_retry 2
        delay_before_retry 2
    }
}
real_server 172.25.254.120 80 {
    weight 1
    HTTP_GET {
        url {
          path /
          status_code 200
        }
        connect_timeout 3
        nb_get_retry 2
        delay_before_retry 2
    }
}
}
 
ssytemctl restart keepalived.service
 
使用ipvsadm -Ln 查看策略是否写进去

测试:

10.3 vip单播模式配置 


vim /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 100
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev eth0 label eth0:1
    }
    unicast_src_ip 172.25.254.10   指定谁到谁  ka2上相反
    unicast_peer {
        172.25.254.20
    }
测试:

[root@ka1 ~]# tcpdump -i eth0 -nn src host 172.25.254.10 and dst 172.25.254.20

listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 

14:57:34.119048 IP 172.25.254.10 > 172.25.254.20: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20

14:57:35.120354 IP 172.25.254.10 > 172.25.254.20: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20

 10.4  邮件通知 

安装邮件发送工具

[root@ka1 ~]# yum install mailx -y

[root@ka2 ~]# yum install mailx -y

QQ邮箱认证

[root@ka1 ~]# vim /etc/mail.rc

[root@ka1 ~]# echo test message | mail -s test ***********@qq.com

写脚本:

vim /etc/keepalived/mail.sh

#!/bin/bash
mail_dst="2823279147@qq.com"
send_message()
{
  mail_sub="HOSTNAME to be $1 vip mopve"
  mail_msg="`date +%F\ %T`: vrrp move $HOSTNAME chage $1"
  echo $mail_msg | mail -s "$mail_sub" $mail_dst
}

case $1 in
  master)
  send_message master
  ;;
  backup)
  send_message backup
  ;;
  fault)
  send_message fault
  ;;
  *)
  ;;
esac

chmod +x /etc/keepalived/mail.sh

在ka1和ka2虚拟路由上面添加节点:
vim /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 100
    priority 80
    advert_int 1
    #preempt_delay 5s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev eth0 label eth0:1
    }
    unicast_src_ip 172.25.254.20
    unicast_peer {
        172.25.254.10
    }
    notify_master "/etc/keepalived/notify.sh master"   
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
}

10.5 利用脚本实现主从角色切换

[root@ka1 ~]# vim /etc/keepalived/test.sh

检测文件是否存在,存在为真(1),ka1就降低优先级,vip飘到ka2上面,不存在为假(0),vip就按兵不动
[root@ka1 ~]# vim /etc/keepalived/test.sh
#!/bin/bash
[ ! -f /mnt/ding ]   

chmod +x /etc/keepalived/test.sh        # 给上可执行权限

[root@ka1 ~]# vim /etc/keepalived/keepalived.conf

vrrp_script lee {
   script "/etc/keepalived/test.sh"     #shell命令或脚本的路径
   interval 1                           #检测的间隔时间,默认为1s
   weight -30                           #默认为零,这里测试设置-30,当运行脚本检测到之后,为非0,就会与VIP的优先级相加,优先降低,实现VIP飘移,为0时就VIP就按兵不动。
   fall 2                     #脚本连续几次都执行失败,则转换为失败,建议设置为2以上
   rise 2                      #执行脚本连续几次都成功,把服务器标记为成功
   timeout 2                  #设置的超时时间。
}


vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 100
    priority 100
    advert_int 1
    #preempt_delay 5s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev eth0 label eth0:1
    }
    unicast_src_ip 172.25.254.10
    unicast_peer {
        172.25.254.20
    }
    track_script {            #调用这个script配置参数
         lee
    }    
}

[root@ka1 ~]# systemctl restart keepalived.service 

sh /etc/keepalived/test.sh
echo $?

0
此时/mnt底下没有ding这个文件,运行脚本输出0,VIP就不动

 测试:

10.6 抢占延迟模式preempt_delay


vim /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 100
    priority 100
    advert_int 1
    preempt_delay 5s    
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev eth0 label eth0:1
    }

 10.7 非抢占模式 nopreempt


vim /etc/keepalived/keepalived.conf
 
vrrp_instance VI_1 {
    state BACKUP  
    interface eth0
    virtual_router_id 100 
    priority 100
    advert_int 1
    nopreempt     
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev eth0 label eth0:1
    }
}

测试:

10.8 keepalived实现HAProxy高可用 

# 开启启用内核参数

[root@ka1 ~]# vim /etc/sysctl.conf

net.ipv4.ip_nonlocal_bind = 1

[root@ka1 ~]# sysctl -p

net.ipv4.ip_nonlocal_bind = 1

[root@ka2 ~]# vim /etc/sysctl.conf

[root@ka2 ~]# sysctl -p

net.ipv4.ip_nonlocal_bind = 1

#  下载并配置Haproxy

[root@ka1 ~]# yum install haproxy -y

[root@ka2 ~]# yum install haproxy -y

[root@ka1 ~]# vim /etc/haproxy/haproxy.cfg

[root@ka1 ~]# systemctl restart haproxy

[root@ka1 ~]# systemctl enable --now haproxy

# realserver配置

[root@realserver1 ~]# ip a d 172.25.254.100/32 dev lo

[root@realserver1 ~]# vim /etc/sysctl.d/arp.conf

realserver2 相同

在ka1中编写检测脚本

[root@rhel7-ka1 ~]# vim /etc/keepalived/scripts/haproxy.sh

#!/bin/bash

/usr/bin/killall -0 haproxy

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

在ka1中配置keepalived

[root@ka1 ~]# vim /etc/keepalived/keepalived.conf

 [root@ka2 ~]# systemctl restart keepalived

测试:

 

 10.9 实现独立子配置文件

[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
建立文件
[root@ka1 ~]# mkdir -p /etc/keepalived/conf.d

开启子文件
[root@ka1 ~]# vim /etc/keepalived/conf.d/172.25.254.100.conf

 [root@ka1 ~]# systemctl restart keepalived.service

10.10 启用keepalived日志功能

[root@ka1 ~]# vim /etc/sysconfig/keepalived

KEEPALIVED_OPTIONS="-D -S 6"

[root@ka1 ~]#vim /etc/rsyslog.conf

local6.*      /var/log/keepalived.log

[root@ka1 ~]#systemctl restart keepalived.service rsyslog.service

10.11 配置http服务

[root@realserver1~]# yum install httpd -y

[root@realserver1 ~]# echo 172.25.254.110 > /var/www/html/index.html

[root@realserver1 ~]# systemctl enable --now httpd

[root@realserver2 ~]# yum install httpd -y

[root@realserver2 ~]# echo 172.25.254.120 > /var/www/html/index.html

[root@realserver2 ~]# systemctl enable --now httpd
测试
[root@ka1 ~]# curl 172.25.254.110 172.25.254.110

[root@ka1 ~]# curl 172.25.254.120 172.25.254.120

以上就是本期的所有内容了,谢谢大家的观看。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值