高可用集群keep-alive

keepalive简介
keepalive为LVS应用延伸的高可用服务。lvs的调度器无法做高可用。但keepalive不是为lvs专门集群服务的,也可以为其他的的代理服务器做高可用。
keepalive在lvs的高可用集群,主调度器和备调度器(可以有多个) 一主两备或一主一备。

VRRP: keepalived是基于vrrp协议实现Ivs服务的高可用。解决了调度器单节点的故障问题。
VRRP协议:提高网络路由器的可靠性开发的一种协议。

vrrp工作原理
·选举出主和备,预先设定主备的优先级。主的优先级较高,备的优先级低,一旦开启服务器,优先级高的,会自定抢占主的位置。
·VRRP组播通信: 224.0.0.18 VRRP协议当中的主备服务器通过组播地进行通信,交换主备服务器之间的运行状态。主服务会周期性的发送vrrp协议报文,告诉备:主的当前状态。
·主备切换:主服务器发生故障,或者不可达,VRRP协议会把请求转义到备服务器。通过组播地址,VRRP可以迅速的通知其他服务器发生了主备切换,确保新的主服务器可以正常处理客户端的请求。
·故障恢复: 一旦主服务器恢复通信,由组播地址进行通信,发现在恢复的主服务器优先级更高,会抢占原主服务器的位置,成为主服务器,调度和接受请求。

keepalive工作原理
主调度器能够正常运行时,由主调度器进行后端真实服务器的分配处理。其余的备用调度器处于冗余状态。
不参与集群的运转。主调度器故障无法运行,备调度器才会承担主调度器的工作。
一旦主调度恢复工作,继续由主调度器进行处理,备调度器又成了冗余。

一、高可用集群

1.1 集群类型

Keep-alive高可用集群通常是指通过一些机制保持服务可用性的分布式系统,常见的集群类型包括:

  1. 负载均衡(LB):这种类型的集群主要用于分发用户请求到一组服务器,以平均负载并防止单台服务器过载。LB可以是硬件设备(如F5 BIG-IP)或软件解决方案(如Nginx,HAProxy)。它根据预设策略将流量分配给各个节点,提高整个系统的可用性和性能。

  2. 高可用集群(HA):设计目的是确保即使某个组件故障也能继续运行。这通常涉及到冗余配置、自动故障检测和恢复机制。比如,通过主备模式或多副本数据库来避免单点故障。常见于关键业务系统,如数据库、Web服务器等。

  3. 单点故障(Spof) 解决方案:Spof通常指系统中的某个单一元素,一旦这个元素宕机,整个系统就会失效。解决办法可能是采用高可用设计,例如前面提到的主备结构,或者是使用分布式系统来分散风险。

  4. 高性能计算集群(HPC):这类集群专为需要大量计算资源的任务设计,如科学模拟、数据分析或大规模机器学习。HPC集群通常包含大量的高性能服务器和优化的硬件配置,以及专门的调度和文件存储系统,如Slurm、SGE等。

1.2系统可用性

系统可用性是指系统在特定条件下,能够正常执行其预定功能的能力。它通常通过一系列指标来衡量,如系统的稳定性、响应时间、故障恢复能力等。高可用性的系统能够确保在面临各种故障或挑战时,仍然能够持续提供服务,从而满足用户的需求。

SLA(服务等级协议)

SLA是提供服务的企业与客户之间就服务的品质、水准、性能等方面所达成的双方共同认可的协议或契约。它明确规定了服务提供商必须达到的服务标准,以及未达到这些标准时应承担的责任。SLA的核心目的是确保服务提供商和客户

1.3 系统故障

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

软件故障:设计缺陷 bug

1.4 实现高可用

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

    active/active 双主

    active --> HEARTBEAT --> passive

    active <--> HEARTBEAT <--> active

二、Keepalived配置

1.1环境搭建

k1:172.25.254.10

k2:172.25.254.20

client:172.25.254.200

webserver1:172.25.254.110

webserver2:172.25.254.120

(1).webserver1和webserver2上都装httpd、写入测试文字、开启http服务

[root@webserver1 ~]# yum install httpd -y
[root@webserver1 ~]# echo 172.25.254.110 > /var/www/html/index.html
[root@webserver1 ~]# systemctl enable --now httpd.service

(2).k1和k2上测试

[root@k1 ~]# curl 172.25.254.110
172.25.254.110
[root@k1 ~]# curl 172.25.254.120
172.25.254.120

2.1配置虚拟路由器

(1).开启服务,进入k1主配置文件编写代码

[root@k1 ~]# systemctl start keepalived.service 
[root@k1 ~]# vim /etc/keepalived/keepalived.conf 

global_defs {               
   notification_email {
     2815074063@qq.com       
   }
   notification_email_from keepalived@rhel7.org       
   smtp_server 127.0.0.1                             
   smtp_connect_timeout 30                         
   router_id k1.rhel7.org                              
   vrrp_skip_check_adv_addr                           
   vrrp_strict                                         
   vrrp_garp_interval 0                               
   vrrp_gna_interval 0                                
   vrrp_mcast_group4 224.0.0.18                        
}
 
vrrp_instance VI_1 {                                  
    state MASTER
    interface eth0                                     
    virtual_router_id 100    
    priority 100            
    advert_int 1                                       
    authentication {                                  
        auth_type PASS       
        auth_pass 1111                               
    }
    virtual_ipaddress {                                
        172.25.254.100/24 dev eth0 label eth0:1
    }
}

(2).开启服务,进入k2主配置文件编写代码

[root@k2 ~]# systemctl start keepalived.service 
[root@k2 ~]# vim /etc/keepalived/keepalived.conf 

global_defs {
   notification_email {
     3283085081@qq.com
   }
   notification_email_from keepalived@rhel7.org
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id k2.rhel7.org
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
   vrrp_mcast_group4 224.0.0.18
}
 
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
    }
}

(3).重启服务

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

(4).测试

[root@k1 ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.25.254.10  netmask 255.255.255.0  broadcast 172.25.254.255
        inet6 fe80::20c:29ff:fe5d:d389  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:5d:d3:89  txqueuelen 1000  (Ethernet)
        RX packets 5024  bytes 399854 (390.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 6216  bytes 508605 (496.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
 
eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.25.254.100  netmask 255.255.255.0  broadcast 0.0.0.0
        ether 00:0c:29:5d:d3:89  txqueuelen 1000  (Ethernet)

3.1开启通信功能及独立日志

(1).进入配置文件编写策略并重启

vrrp_strict添加此选项无法访问 vip ,可以用 nft list ruleset 查看

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

(2).开启日志功能

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

-D:这个选项使得 Keepalived 守护进程在前台运行,并且会打印日志到标准输出(stdout)和错误输出(stderr)。

-S 6:这个选项用于设置 Keepalived 的日志级别。Keepalived 的日志级别范围从 0 到 7,其中 0 表示最少量的日志信息(仅错误信息),而 7 表示最详细的日志信息(包括调试信息)

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

(3).测试:此时vip通信开启

[root@k1 ~]# ping 172.25.254.100
PING 172.25.254.100 (172.25.254.100) 56(84) bytes of data.
64 bytes from 172.25.254.100: icmp_seq=1 ttl=64 time=0.048 ms
64 bytes from 172.25.254.100: icmp_seq=2 ttl=64 time=0.093 ms
64 bytes from 172.25.254.100: icmp_seq=3 ttl=64 time=0.066 ms
64 bytes from 172.25.254.100: icmp_seq=4 ttl=64 time=0.067 ms

(4).进入rsyslog.conf配置文件写日志路径并重启

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

[root@k1 ~]# systemctl restart rsyslog.service 

(5).测试:可以看到有日志生成

[root@k1 ~]# ll /var/log/keepalived.log 
-rw------- 1 root root 12086 8月  12 13:29 /var/log/keepalived.log
 
[root@k1 ~]# tail -3 /var/log/keepalived.log 
Aug 12 13:29:12 k1 Keepalived_healthcheckers[5809]: Lost quorum 1-0=1 > 0 for VS [192.168.200.100]:443
Aug 12 13:29:12 k1 Keepalived_healthcheckers[5809]: Remote SMTP server [127.0.0.1]:25 connected.
Aug 12 13:29:12 k1 Keepalived_healthcheckers[5809]: SMTP alert successfully sent.

4.1独立子配置文件
       当生产环境复杂时, /etc/keepalived/keepalived.conf 文件中内容过多,不易管理。将不同集群的配置,比如:不同集群的 VIP 配置放在独立的子配置文件中利用 include 指令可以实现包含 子配置文件。
(1).创建子文件并写策略,记得将主配置文件的策略注释掉并写入子配置文件的路径

[root@k1 ~]# mkdir -p /etc/keepalived/conf.d
[root@k1 ~]# vim /etc/keepalived/conf.d/172.25.254.100.conf

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

(2).重启服务

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

(3).测试:可以看到子配置文件生效了

[root@k1 ~]# ll /etc/keepalived/conf.d/172.25.254.100.conf 
-rw-r--r-- 1 root root 271 8月  12 13:27 /etc/keepalived/conf.d/172.25.254.100.conf

三、应用示例

1.非抢占模式 nopreempt

默认为抢占模式preempt,即当高优先级的主机恢复在线后,会抢占低先级的主机的master角色, 这样会使vip在KA主机中来回漂移,造成网络抖动。

建议设置为非抢占模式 nopreempt ,即高优先级主机恢复后,并不会抢占低优先级主机的master角色 非抢占模块下,如果原主机down机, VIP迁移至的新主机, 后续也发生down时,仍会将VIP迁移回原主机。

注意:要关闭 VIP抢占,必须将各 keepalived 服务器state配置为BACKUP

(1).ka1主机配置

编辑keepalived.conf配置:

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

vrrp_instance VI_1 {
   state BACKUP
   interface ens33
   virtual_router_id 100
   priority 100
   nopreempt 
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass 1111
   }
   virtual_ipaddress {
       172.25.254.100/24 dev en33 label en33:1
   }
}

(2).ka2主机配置

编辑keepalived.conf配置:

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

vrrp_instance VI_1 {
   state BACKUP
   interface ens33
   virtual_router_id 100
   priority 80 
   advert_int 1
   nopreempt 
   authentication {
       auth_type PASS
       auth_pass 1111
   }
   virtual_ipaddress {
     172.25.254.100/24 dev ens33 label ens33:1
   }
}
(3).重启服务并进行测试

systemctl restart Keepalived.service

 先重启ka1服务,再重启ka2服务:

 (4).关闭ka1服务:

systemctl stop Keepalived.service

(5).再重启ka1服务:

抓包还是ka2,vip还在ka2,因为非抢占模式,即使优先级高的主机恢复,也不会抢占优先级低的主机,如果原来的主机down机,vip迁移至新的主机,后续也发生down机时,会将vip迁移会源主机。

2.1抢占延迟模式 preempt_delay

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

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

(1).ka1主机配置

编辑keepalived.conf配置:

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

vrrp_instance VI_1 {
   state BACKUP
   interface ens33
   virtual_router_id 100
   priority 100 #优先级高
   preempt_delay 5s 
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass 1111
   }
   virtual_ipaddress {
       172.25.254.100/24 dev ens33 label ens33:1
   }
}

(2).ka2主机配置

编辑keepalived.conf配置:

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

vrrp_instance VI_1 {
   state BACKUP
   interface ens33
   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 ens33 label ens33:1
   }
}

(3).测试结果

先重启ka2的服务,再重启ka1的服务:

等延迟时间过了才会抢占ka2的vip

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

3.1VIP单播配置
       默认keepalived主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量。在所有节点vrrp_instance语句块中设置对方主机的IP,建议设置为专用于对应心跳线网络的地址,而非使用业务网络。注意:启用 vrrp_strict 时,不能启用单播。

(1).k1配置:

unicast_src_ip 172.25.254.10     
    unicast_peer {
        172.25.254.20           
    }                           

(2).k2配置:

unicast_src_ip 172.25.254.20
    unicast_peer {
        172.25.254.10
    }

(3).测试单播效果:

[root@k1 ~]# tcpdump -i eth0 -nn src host 172.25.254.20 and dst 172.25.254.10
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
15:04:39.790162 IP 172.25.254.20 > 172.25.254.10: VRRPv2, Advertisement, vrid 100, prio 80, authtype simple, intvl 1s, length 20
15:04:40.791608 IP 172.25.254.20 > 172.25.254.10: VRRPv2, Advertisement, vrid 100, prio 80, authtype simple, intvl 1s, length 20
15:04:41.792787 IP 172.25.254.20 > 172.25.254.10: VRRPv2, Advertisement, vrid 100, prio 80, authtype simple, intvl 1s, length 20

4.1通知脚本配置

 当 keepalived 的状态变化时,可以自动触发脚本的执行,比如:发邮件通知用户,默认以用户 keepalived_script 身份执行脚本, 如果此用户不存在,以 root 执行脚本可以用下面指令指定脚本执行用户的身份。

(1).K1和K2上安装邮件发送工具:

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

(2).修改mail.rc配置文件:

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

(3).创建通知脚本,并添加可执行权限:

[root@K1 ~]# vim /etc/keepalived/mail.sh

#!/bin/bash
mail_dst="3283085081@qq.com"
send_message()
{
   mail_sub="$HOSTNAME to be $1 vip move"
   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

[root@K1 ~]# chmod +x /etc/keepalived/mail.sh

(4).在 vrrp_instance VI_1语句块的末尾加下面三行,重启服务:

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

    notify_master "/etc/keepalived/mail.sh master"
    notify_backup "/etc/keepalived/mail.sh backup"
    notify_fault "/etc/keepalived/mail.sh fault"

(5).测试:

5.1实现master/slave的keepalived双主架构:

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

(1).k1配置:

vrrp_instance VI_2 {
    state BACKUP                    #备
    interface eth0
    virtual_router_id 200
    priority 80                     
    advert_int 1
    #nopreempt
    #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
    }
}

(2).k2配置:

vrrp_instance VI_2 {
    state MASTER                  #主 ,
    interface eth0
    virtual_router_id 200
    priority 100                  
    advert_int 1
    #nopreempt
    #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.20
    unicast_peer {
        172.25.254.10
    }
}

(3).测试:可以看到两台服务器各有一个vip

6.1实现IPVS的高可用性

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

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

(2).使vip不对外响应,重载生效查看

[root@webserver1 ~]# 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_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
[root@webserver1 ~]# sysctl -p
[root@webserver1 ~]# sysctl --system

(3).k1和k2上安装ipvsadm软件

[root@k1 ~]# yum install ipvsadm -y

(4).修改k1和k2配置文件并重启服务

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

virtual_server 172.25.254.100 80 {     
    delay_loop 6
    lb_algo wrr
    lb_kind DR
    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
         }
     }
}

(5).查看是否自动生成lvs策略,如果没有检查配置文件

[root@k1 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.254.100:80 wrr
  -> 172.25.254.110:80            Route   1      0          0         
  -> 172.25.254.120:80            Route   1      0          1  

(6).测试:客户端访问,当K1故障时自动切换到k2,不会影响客户的体验

[root@client ~]# for i in {1..10}
> do 
> curl 172.25.254.100
> done
172.25.254.120
172.25.254.110
172.25.254.120
172.25.254.110
172.25.254.120
172.25.254.110
172.25.254.120
172.25.254.110
172.25.254.120
172.25.254.110

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

keepalived 利用 VRRP Script 技术,可以调用外部的辅助脚本进行资源监控,并根据监控的结果实现优先动态调整,从而实现其它应用的高可用性功能 。
       vrrp_script :自定义资源监控脚本, vrrp 实例根据脚本返回值,公共定义,可被多个实例调用,定 义在 vrrp 实例之外的独立配置块,一般放在 global_defs 设置块之后。 通常此脚本用于监控指定应用的状态。一旦发现应用的状态异常,则触发对 MASTER 节点的权重减至低于 SLAVE 节点,从而实现 VIP 切换到 SLAVE 节点。
       track_script :调用 vrrp_script 定义的脚本去监控资源,定义在 VRRP 实例之内,调用事先定义的 vrrp_script。

(1).定义脚本并添加可执行权限

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

#!/bin/bash
[ ! -f /mnt/liu ]

(2).修改配置文件并重启服务

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

vrrp_script check_file {              
    script "/etc/keepalived/test.sh"   
    interval 1                         
    weight -30                         
    fall 2                             
    rise 2                             
    timeout 2                          
}
    track_script {                   
        check_file
    }

(3).测试:

此时k1上有vipv

创建脚本,可以看到vip漂到了k2上

[root@k1 ~]# touch /mnt/liu
[root@k1 ~]# ls /mnt/
liu

8.1实现haproxy的高可用性

(1).k1和k2上安装haproxy服务

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

(2).开启k1和k2内核路由器功能

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

[root@k1 ~]# sysctl -p
net.ipv4.ip_nonlocal_bind = 1

(3).编写haproxy.cfg配置文件并重启服务

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

listen webcluster
    bind 172.25.254.100:80
    mode http
    balance roundrobin
    server web1 172.25.254.110:80 check inter 3 fall 2 rise 5
    server web2 172.25.254.120:80 check inter 3 fall 2 rise 5

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

(4).编写监测脚本

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

#!/bin/bash
killall -0 haproxy

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

(5).修改配置文件并重启服务

vrrp_script check_haproxy {
    script "/etc/keepalived/test.sh"
    interval 1
    weight -30
    fall 2
    rise 2
    timeout 2
}
    track_script {
        check_haproxy
    }

(6).测试:客户端访问,当一台服务器故障时自动切换到另一台服务器,不会影响客户的体验

[root@client ~]# for i in {1..10}
> do
> curl 172.25.254.100
> done
172.25.254.120
172.25.254.110
172.25.254.120
172.25.254.110
172.25.254.120
172.25.254.110
172.25.254.120
172.25.254.110
172.25.254.120
172.25.254.110

抓大放小 

  • 24
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值