引言

Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题。

一、Keepalived 概述

  • keepalived 软件起初是专为 LVS 负载均衡软件设计的,用来管理并监控 LVS集群中各个服务节点的状态,后来又加入了可以实现高可用的 VRRP 功能。因此,keepalived 除了能够管理 LVS集群外,还可以为其他服务(例如:Nginx、Haproxy、MySQL等)实现高可用。
  • keepalived 软件主要是通过 VRRP 协议实现高可用功能的。VRRP 是 Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障的问题,它能够保证当个别节点宕机时,整个网络可以不间断地运行。

所以,keepalived 一方面具有配置管理 LVS 的功能,同时还具有对 LVS 下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用

1、什么是Keepalived

Keepalived是一款专为LVS和HA设计的一款健康检查工具:

  • 支持故障自动切换
  • 支持节点健康状态检查
  • 官方地址:www.keepalived.org

2、Keepalived工作原理

  • Keepalived是一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题
  • 在一个LVS服务集群中通常有**主服务器(MASTER)和备份服务器(BACKUP)**两种角色的服务器,但是对外表现为个虚拟IP,主服务器会发送VRRP通告信息给备份服务器,当备份服务器收不到VRRP消息的时候,即主服务器异常的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。
  • 在Keepalived服务之间,只有作为主的服务器会一直发送VRRP广播包,告诉备它还活着,此时备不会抢占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性。接管速度最快可以小于1秒。

3、keepalived 体系主要模块及其作用

keepalived体系架构中主要有三个模块,分别是core、check和vrrp

  1. core模块:为keepalived的核心,负责主进程的启动、维护及全局配置文件的加载和解析。
  2. vrrp模块:是来实现VRRP协议的。
  3. check模块:负责健康检查,常见的方式有端口检查及URL检查。

4、keepalived 服务重要功能

4.1 管理 LVS 负载均衡软件

Keepalived可以通过读取自身的配置文件,实现通过更底层的接口直接管理LVS的配置以及控制服务的启动,停止功能。

4.2 支持故障自动切换(Failover)

  • Keepalived可以实现任意两台主机之间,例如Master和Backup主机之间的故障转移和自动切换,这个主机可以是普通的不能停机的业务服务器,也可以是LVS负载均衡,Nginx反向代理这样的服务器。
  • Keepalived高可用功能实现的简单原理为,两台主机同时安装好Keepalived软件并启动服务,开始正常工作时,由角色为Master的主机获得所有资源并对用户提供服务,角色为Backup的主机作为Master主机的热备;当角色为Master的主机失效或出现故障时,角色为Backup的主机将自动接管Master主机的所有工作,包括接管VIP资源及相应资源服务;而当角色为Master的主机故障修复后,又会自动接管回它原来处理的工作,角色为Backup的主机则同时释放Master主机失效时它接管的工作,此时,两台主机将恢复到最初启动时各自的原始角色及工作状态。

4.3 实现 LVS 集群中节点的健康检查(Health Checking)

Keepalived可以通过在自身的Keepalived.conf文件里配置LVS的节点IP和相关参数实现对LVS的直接管理;除此之外,当LVS集群中的某一个甚至是几个节点服务器同时发生故障无法提供服务时,Keepalived服务会自动将失效的节点服务器从LVS的正常转发队列中清除出去,并将请求调度到别的正常节点服务器上,从而保证最终用户的访问不受影响;当故障的节点服务器被修复以后,Keepalived服务又会自动地把它们加入到正常转发队列中,对客户提供服务。

4.4 实现 LVS 负载调度器、节点服务器的高可用性(HA)

一般企业集群需要满足的三个特点:负载均衡、健康检查、故障切换,使用 LVS + Keepalived 完全可以满足需求。

5、keepalived 高可用故障切换转移原理

keepalived 高可用服务对集群之间的故障切换转移,是通过 VRRP(虚拟路由器冗余协议)来实现的。
  在 keepalived 服务正常工作时,主(Master)节点会不断地向备(Backup)节点发送(多播的方式)心跳消息,用以告诉备节点自己还活看,当主节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主节点的心跳了,于是调用自身的接管程序,接管主节点的 IP 资源及服务。而当主节点恢复时,备节点又会释放主节点故障时自身接管的 IP 资源及服务,恢复到原来的备用角色。

6、VRRP通信原理

  • VRRP也就是虚拟路由冗余协议,它的出现就是为了解决静态路由的单点故障。
  • VRRP是通过一种竞选协议机制来将路由任务交给某台VRRP路由器的。
  • VRRP用IP多播的方式(默认多播地址(224.0.0.18))实现高可用之间通信。
  • 工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的资源。备节点可以有多个,通过优先级竞选,但一般Keepalived系统运维工作中都是一对。
  • VRRP使用了加密协议加密数据,但Keepalived官方目前还是推荐用明文的方式配置认证类型和密码。
     

二、keepalived脑裂及解决办法

1、keepalived脑裂

在高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整体、动作协调的HA系统,就分裂成为2个独立的个体。由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像“裂脑人”一样,争抢“共享资源”、争起“应用服务”,就会发生严重后果——或者共享资源被瓜分、2边“服务”都起不来了;或者2边“服务”都起来了,但同时读写“共享存储”,导致数据损坏(常见如数据库轮询着的联机日志出错)。

2、脑裂的原因

  • 高可用服务器对之间心跳线链路发生故障,导致无法正常通信。如心跳线坏了(包括断了,老化)。
  • 因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)。
  • 因心跳线间连接的设备故障(网卡及交换机)。
  • 因仲裁的机器出问题(采用仲裁的方案)。
  • 高可用服务器上开启了 iptables防火墙阻挡了心跳消息传输。
  • Keepalived配置里同一 VRRP实例如果 virtual_router_id两端参数配置不一致也会导致裂脑问题发生。
  • vrrp实例名字不一致、优先级一致。

3、应对策略

  • 添加冗余的心跳线,例如:双线条线(心跳线也HA),尽量减少“裂脑”发生几率
  • 启用磁盘锁。正在服务一方锁住共享磁盘,“裂脑”发生时,让对方完全“抢不走”共享磁盘资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的一方不主动“解锁”,另一方就永远得不到共享磁盘。现实中假如服务节点突然死机或崩溃,就不可能执行解锁命令。后备节点也就接管不了共享资源和应用服务。于是有人在HA中设计了“智能”锁。即:正在服务的一方只在发现心跳线全部断开(察觉不到对端)时才启用磁盘锁。平时就不上锁了。
  • 设置仲裁机制。例如设置参考IP(如网关IP),当心跳线完全断开时,2个节点都各自ping一下参考IP,不通则表明断点就出在本端。不仅“心跳”、还兼对外“服务”的本端网络链路断了,即使启动(或继续)应用服务也没有用了,那就主动放弃竞争,让能够ping通参考IP的一端去起服务。更保险一些,ping不通参考IP的一方干脆就自我重启,以彻底释放有可能还占用着的那些共享资源。
  • 利用脚本检测、报警
检测思路:正常情况下keepalived的VIP地址是在主节点上的,如果在从节点发现了VIP,就设置报警信息。脚本(在从节点上)如下:
 
 
vim split-brainc_check.sh
 
#!/bin/bash
 
# 检查脑裂的脚本,在备节点上进行部署
 
LB01_VIP=192.168.1.229
 
LB01_IP=192.168.1.129
 
LB02_IP=192.168.1.130
 
while true
 
do
 
  ping -c 2 -W 3 $LB01_VIP &>/dev/null
 
    if [ $? -eq 0 -a `ip add|grep "$LB01_VIP"|wc -l` -eq 1 ];then
 
        echo "ha is brain."
 
    else
 
        echo "ha is ok"
 
    fi
 
    sleep 5
 
done

三、LVS+Keepalived 高可用群集的搭建

keepalived lvs区别与联系 keepalived和lvs_keepalived lvs区别与联系

环境
主DR 服务器:192.168.154.19  ipvsadm、keepalived(热备) 虚拟IP:192.168.154.188  网卡ens33:0
备DR 服务器:192.168.154.20  ipvsadm、keepalived(热备) 虚拟IP:192.168.154.188  网卡ens33:0     
Web 服务器1:192.168.154.21
Web 服务器2:192.168.154.22
vip:192.168.154.188
客户端:192.168.154.100

1 、配置负载调度器(主:192.168.154.19)

(1)关闭防火墙关闭增强功能

systemctl stop firewalld
setenforce 0

keepalived lvs区别与联系 keepalived和lvs_linux_02

(2) 安装软件包

yum install -y ipvsadm keepalived

keepalived lvs区别与联系 keepalived和lvs_服务器_03

 (3)加载模块ip_vs并查看

modprobe ip_vs
cat /proc/net/ip_vs

keepalived lvs区别与联系 keepalived和lvs_linux_04

(4) 启动ipvsadm.service

[root@zyf-dr1 ~]# ipvsadm-save > /etc/sysconfig/ipvsadm
[root@zyf-dr1 ~]# systemctl start ipvsadm.service

keepalived lvs区别与联系 keepalived和lvs_linux_05

 (5)配置keepalived主配置文件

[root@zyf-dr1 ~]# cd /etc/keepalived/
[root@zyf-dr1 /etc/keepalived]#cp keepalived.conf keepalived.conf.bak
[root@zyf-dr1 /etc/keepalived]# ls
keepalived.conf  keepalived.conf.bak
[root@zyf-dr1 /etc/keepalived]# vim keepalived.conf
[root@zyf-dr1 /etc/keepalived]# sysctl -p
[root@zyf-dr1 /etc/keepalived]# vim /etc/sysctl.conf
[root@zyf-dr1 /etc/keepalived]# sysctl -p
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
[root@zyf-dr1 /etc/keepalived]# vim keepalived.conf
! Configuration File for keepalived

 global_defs {
      smtp_server 127.0.0.1
      router_id LVS_01
      vrrp_skip_check_adv_addr
#     vrrp_strict
      vrrp_garp_interval 0
      vrrp_gna_interval 0
  }

  vrrp_instance VI_1 {
      state MASTER
      interface ens33
      virtual_router_id 51
      priority 100
      advert_int 1
      authentication {
          auth_type PASS
          auth_pass 1111
      }
      virtual_ipaddress {
          192.168.154.188
      }
  }
    
 virtual_server 192.168.154.188 80 {
     delay_loop 6
      lb_algo rr
      lb_kind DR
      persistence_timeout 0
      protocol TCP

      real_server 192.168.154.21 80 {
          weight 1
          TCP_CHECK {
          connect_port 80
              connect_timeout 3
              nb_get_retry 3
              delay_before_retry 3
          }
      }

      real_server 192.168.154.22 80 {
          weight 1
          TCP_CHECK {
          connect_port 80
              connect_timeout 3
              nb_get_retry 3
              delay_before_retry 3
          }
      }
 }

(6)把配置文件远程复制给备用主机方便快捷

[root@zyf-dr1 /etc/keepalived]# scp keepalived.conf root@192.168.154.20:/etc/keepalived/
root@192.168.154.20's password: 
keepalived.conf                100% 1308     2.1MB/s   00:00    
[root@zyf-dr1 /etc/keepalived]#

(7)编辑虚拟网卡信息

[root@zyf-dr1 /etc/sysconfig/network-scripts]# vim ifcfg-ens33:0

DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.154.188
NETMASK=255.255.255.255

打开虚拟网卡并查看

keepalived lvs区别与联系 keepalived和lvs_linux_06

 (8) 开启keepalived服务并查看

[root@zyf-dr1 /etc/sysconfig/network-scripts]# systemctl start keepalived.service 
[root@zyf-dr1 /etc/sysconfig/network-scripts]# systemctl status keepalived.service

keepalived lvs区别与联系 keepalived和lvs_keepalived lvs区别与联系_07

 (9)设置ipvsadm规则并查看

[root@zyf-dr1 ~]# 
[root@zyf-dr1 ~]# ipvsadm -C
[root@zyf-dr1 ~]# ipvsadm -A -t 192.168.154.188:80 -s rr
[root@zyf-dr1 ~]# ipvsadm -a -t 192.168.154.188:80 -r 192.168.154.21:80 -g
[root@zyf-dr1 ~]# ipvsadm -a -t 192.168.154.188:80 -r 192.168.154.22:80 -g
[root@zyf-dr1 ~]# ipvsadm

keepalived lvs区别与联系 keepalived和lvs_服务器_08

 (10)调整 proc 响应参数,关闭Linux 内核的重定向参数响应

vim /etc/sysctl.conf
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0

keepalived lvs区别与联系 keepalived和lvs_linux_09

keepalived lvs区别与联系 keepalived和lvs_服务器_10

 重载

sysctl -p

2、配置负载调度器(备:192.168.154.20)

(1)关闭防火墙

systemctl stop firewalld
 setenforce 0

(2) 安装软件包

yum install -y ipvsadm keepalived

(3)加载模块ip_vs并查看

[root@localhost ~]#  modprobe ip_vs
[root@localhost ~]# cat /proc/net/ip_vs

keepalived lvs区别与联系 keepalived和lvs_IP_11

  (4) 启动ipvsadm.service

[root@localhost ~]# ipvsadm-save > /etc/sysconfig/ipvsadm
[root@localhost ~]# systemctl start ipvsadm.service

keepalived lvs区别与联系 keepalived和lvs_服务器_12

 (5) 配置keepalived主配置文件

[root@localhost network-scripts]# vim /etc/keepalived/keepalived.conf
[root@zyf-dr2 keepalived]# vim keepalived.conf
[root@zyf-dr2 keepalived]# cat keepalived.conf
! Configuration File for keepalived

 global_defs {
    notification_email {
      acassen@firewall.loc
      failover@firewall.loc
      sysadmin@firewall.loc
      }
      notification_email_from Alexandre.Cassen@firewall.loc
      smtp_server 127.0.0.1
      smtp_connetc_timeout 30
      router_id LVS_02
      vrrp_skip_check_adv_addr
      #vrrp_strict
      vrrp_garp_interval 0
      vrrp_gna_interval 0
  }
  
  vrrp_instance VI_1 {
      state MASTER
      interface ens33
      virtual_router_id 51
      priority 90
      advert_int 1
      authentication {
          auth_type PASS
          auth_pass 1111
      }
      virtual_ipaddress {
          192.168.154.188
      }
  }
  
 virtual_server 192.168.154.188 80 {
     delay_loop 6
      lb_algo rr
      lb_kind DR
      persistence_timeout 0
      protocol TCP
     
      real_server 192.168.154.21 80 {
          weight 1
          TCP_CHECK {
          connect_port 80
              connect_timeout 3
              nb_get_retry 3
              delay_before_retry 3
          }   
      }   
      
      real_server 192.168.154.22 80 {
          weight 1
          TCP_CHECK {
          connect_port 80
              connect_timeout 3
              nb_get_retry 3
              delay_before_retry 3
          }   
      }   
 }

(6)编辑虚拟网卡

[root@zyf-dr2 keepalived]# cd /etc/sysconfig/network-scripts/
[root@zyf-dr2 network-scripts]# ls
ifcfg-ens33    ifdown-Team      ifup-post
ifcfg-lo       ifdown-TeamPort  ifup-ppp
ifdown         ifdown-tunnel    ifup-routes
ifdown-bnep    ifup             ifup-sit
ifdown-eth     ifup-aliases     ifup-Team
ifdown-ib      ifup-bnep        ifup-TeamPort
ifdown-ippp    ifup-eth         ifup-tunnel
ifdown-ipv6    ifup-ib          ifup-wireless
ifdown-isdn    ifup-ippp        init.ipv6-global
ifdown-post    ifup-ipv6        network-functions
ifdown-ppp     ifup-isdn        network-functions-ipv6
ifdown-routes  ifup-plip
ifdown-sit     ifup-plusb
[root@zyf-dr2 network-scripts]# vim ifcfg-ens33:0

keepalived lvs区别与联系 keepalived和lvs_lvs_13

 (7)开启虚拟网卡重启网卡在查看

[root@zyf-dr2 network-scripts]# systemctl restart network
[root@zyf-dr2 network-scripts]# ifconfig

keepalived lvs区别与联系 keepalived和lvs_IP_14

(8)开启服务并查看

[root@zyf-dr2 network-scripts]# systemctl start keepalived.service 
[root@zyf-dr2 network-scripts]# systemctl status keepalived.service

keepalived lvs区别与联系 keepalived和lvs_服务器_15

(9)调整 proc 响应参数,关闭Linux 内核的重定向参数响应

vim /etc/sysctl.conf
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0

keepalived lvs区别与联系 keepalived和lvs_IP_16

 重载

[root@zyf-dr2 ~]# sysctl -p
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0

 3、配置web1服务器(Web 服务器1:192.168.154.21)

(1)关闭防火墙,关闭增强功能

[root@zyf-web1 ~]# systemctl stop firewalld
[root@zyf-web1 ~]# setenforce 0

(2) 安装并启动httpd服务

[root@zyf-web1 ~]# yum -y install httpd
[root@zyf-web1 ~]# systemctl start httpd

keepalived lvs区别与联系 keepalived和lvs_linux_17

 (3)编写web1网页的内容

[root@zyf-web1 ~]# echo 'hello user1' > /var/www/html/index.html

(4)编辑虚拟网卡lo:0

[root@zyf-web1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-lo:0

keepalived lvs区别与联系 keepalived和lvs_linux_18

重启网卡

systemctl restart network

查看 

keepalived lvs区别与联系 keepalived和lvs_lvs_19

(5)调整 proc 响应参数,关闭Linux 内核的重定向参数响应

vim /etc/sysctl.conf
sysctl -p

keepalived lvs区别与联系 keepalived和lvs_IP_20

 4、配置web2服务器(Web 服务器2:192.168.154.22)

(1)关闭防火墙,关闭增强功能

[root@zyf-web2 ~]# systemctl stop firewalld
[root@zyf-web2 ~]# setenforce 0

(2) 安装并启动httpd服务 

yum -y install httpd
systemctl start httpd

keepalived lvs区别与联系 keepalived和lvs_linux_21

(3)编写web1网页的内容

[root@zyf-web2 ~]# echo 'hello user2' > /var/www/html/index.html

(4)编辑虚拟网卡lo:0 

[root@zyf-web2 network-scripts]# vim ifcfg-lo:0

DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.154.188
NETMASK=255.255.255.255

 重启网卡 

systemctl restart network

(5)调整 proc 响应参数,关闭Linux 内核的重定向参数响应 

[root@zyf-web2 ~]# vim /etc/sysctl.conf
[root@zyf-web2 ~]# sysctl -p
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

keepalived lvs区别与联系 keepalived和lvs_lvs_22

 5、验证结果 

在客户端访问 http://192.168.154.188/

keepalived lvs区别与联系 keepalived和lvs_linux_23

keepalived lvs区别与联系 keepalived和lvs_lvs_24

  再在主服务器关闭 keepalived 服务后再测试, systemctl stop keepalived

keepalived lvs区别与联系 keepalived和lvs_keepalived lvs区别与联系_25

keepalived lvs区别与联系 keepalived和lvs_lvs_26

 开启keepalived

systemctl start keepalived

查看主备网卡信息

ip addr

keepalived lvs区别与联系 keepalived和lvs_lvs_27

 备网卡信息

keepalived lvs区别与联系 keepalived和lvs_linux_28

 关闭主keepalived服务

systemctl stop keepalived

keepalived lvs区别与联系 keepalived和lvs_服务器_29

 再次查看主备信息看到虚拟接口跳转到了备用主机上

主网卡信息

keepalived lvs区别与联系 keepalived和lvs_linux_30

  备网卡信息

keepalived lvs区别与联系 keepalived和lvs_keepalived lvs区别与联系_31

总结

本文主要叙述了

LVS+keepalived群集的工作原理

Keepalived体系主要模块及其作用

LVS+DR+keepalived的配置实验