keepalived服务器


一、什么是高可用

通过前面课程的学习,我们知道LVS、Nginx、HaProxy可以实现很多种不同类型的分发,我们还知道,集群系统存在的作用就是为了解决单点故障的问题。

LVS、Nginx集群的单点故障问题

这个单点故障主要体现在两个方面

  • 分发器宕机怎么处理?
  • 假如负载均衡服务器挂掉了,那么所有的服务也会跟着瘫痪。
  • 一种方法是人为监控,发现主分发器宕机后,立马登录备分发器,并给它分配虚ip。
  • 另一种办法是用软件来替代人来监控,自动登录备分发器,分配虚ip。

  • 数据服务器宕机怎么处理? 分发器可以自动判断数据服务器的存活状态,不对宕机服务器要数据。

二、Keepalived介绍

Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件。   

原理

keepalived一般是2个节点运行keepalived,一台是主节点(MASTE),一台是备节点(BACKUP),对外表现都是一个虚拟IP。

主节点会发送特定的消息给备节点,如果备节点收不到这个特定消息时,说明主节点就宕机了,此时备节点就会接管虚拟IP进行服务提供,这就实现了高可用。

Keepalived高可用服务对之间的故障切换转移,是通过VRRP协议(Virtual Router Redundancy Protocol 中文虚拟路由器冗余协议)来实现的。

在Keepalived服务正常工作时,主Master节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备Backup节点自己还活着,当主Master节点发生故障时,就无法发送心跳消息了,备节点也就因此无法继续检测到来自主Master节点的心跳了,进而调用自身的接管程序,接管主Master节点的IP资源及服务。而当主Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。

Keepalived核心功能

1.管理LVS

2.对LVS节点做健康检查(基于端口和URL)

3.实现VRRP高可用功能

keepalived使用架构图

在这里插入图片描述 将keepalived和nginx部署在一台服务器。

keepalived高可用故障切换转移

keepalived是基于VRRP协议来实现高可用的,有两种模式,一种是抢占模式(默认使用),另一种是非抢占模。

当使用抢占模式的时候,这是一种竞选机制进行通信,主节点优先级大于备节点优先级。当主节点宕机的时候,可以切到备节点进行提供服务,主节点恢复还会切换回主节点。

使用非抢占模时,当主节点宕机的时候,可以切到备节点进行提供服务。是当主节点恢复时,vip不会漂移回主节点上,只有当备节点发生故障时,vip才会飘移回主节点。

keepalived默认是抢占模式,需要加上nopreempt参数才能开启非抢占模式,非抢占模式需要所有节点都是backup状态,但是优先级还是有区分,而且优先级高的节点才需要配置非抢占模式,优先级低的不需要配置非抢占模式。

抢占模式原理如下

  1. keepalived正常工作的时候,MASTER主节点会向BACKUP备节点不断的发送特定消息(多播心跳消息),就是一种健康检查机制,告诉备节点“我还活着,虚拟IP我来管就行了!”。

  2. 当主节点发生故障出现宕机情况的时候,无法向备节点发送心跳信息,备节点无法收到主节点的健康检查心跳信息,这个时候,备节点终于转正了,机会来了,就接管虚拟IP进行服务提供。

  3. 当主节点故障恢复后,又不断的发送心跳给备节点,告知“我现在活着呢,我来管虚拟IP”,备节点就会释放主节点宕机时所接管的IP资源以及服务,默默的做回一个备胎。

keepalived是使用C语言编写的路由热备软件,该项目主要目标是为linux系统提供简单高效的负载均衡及高可用解决方案。keepalived由一组检查器,根据服务器的健康状况动态的维护和管理服务器池,另外keepalived通过vrrp协议实现高可用架构,vrrp是路由灾备的实现基础。通过前面的课程我们知道,在lvs中只解决了真实服务器的单点故障,但是如果分发器也就是lvs主机发生故障的话,整个集群系统都会崩溃,所以我们需要keepalived来实现集群系统的高可用。我们可以部署两台或更多的分发器,仅有一台调度器做为主服务器,其它的做为备用,当主调度器发生故障时,keepalived可以自动将备用调度器升级为主调度器,从而实现整个集群系统的高负载,高可用。

三、vrrp协议

vrrp协议是为了静态路由环境下防止单点故障而设计的主从灾备协议,在主设备发生故障时业务自动切换至从设备,而这一切对于用户而言是透明的。vrrp将两台或多台设备虚拟成一个设备,对外仅提供一个虚拟的IP地址,这些设备在同一时刻仅有一台设备可有拥有该IP地址,而拥有该IP地址的设备就是主设备,其它的就是备用设备。主设备会不断发送自己的状态信息给备用设备,当备用设备接收不到主设备的状态信息时,多个备用设备会根据自身的优先级选择出新的主设备,并拥有所有的业务功能。vrrp协议需要为每个路由设备定义一个虚拟路由ID(VRID)以及优先,所有主备路由设备的VRID必须一样,这样才会被视为同一组设备,而优先级最高的设备就是主路由设备,VRID和优先级的范围为0-255之间的整数,数值越大优先级越高,如果优先级相等,则会对比IP地址,地址越大优先级越高

keepalived安装部署

安装keepalived

# CentOS7
yum install -y keepalived

# Ubuntu
apt install -y keepalived

查看keepalived版本

[root@keepalived /etc/keepalived]#  keepalived -v
Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2

更改keepalived配置

cd /etc/keepalived
vim keepalived.conf

主要修改分配的虚拟ip地址等配置。

启动keepalived

systemctl start keepalived.service
或者
service keepalived start`
**其他相关命令**
1)重启:
systemctl restart keepalived
2)停止:
systemctl stop keepalived
3)状态:
systemctl status keepalived
4)开机重启:
systemctl enable keepalived

查看keepalived状态

$ systemctl status keepalived

查看keepalived进程

$ ps -ef | grep keepalived

查看ip列表

$ ip add show

配置文件说明

[root@lvs1 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {                   #全局配置
    notification_email {        #指定keepalived在发生切换时需要发送email到的对象,一行一个
        acassen@firewall.loc    #指定收件人邮箱
        failover@firewall.loc
        sysadmin@firewall.loc
    }
    notification_email_from Alexandre.Cassen@firewall.loc #指定发件人
    smtp_server 192.168.200.1   #指定smtp服务器地址
    smtp_connect_timeout 30     #指定smtp连接超时时间
    router_id LVS_DEVEL         #此处注意router_id为负载均衡标识,在局域网内应该是唯一的。
    vrrp_skip_check_adv_addr
    vrrp_strict
    vrrp_garp_interval 0
    vrrp_gna_interval 0
}
vrrp_instance VI_1 {        #虚拟路由的标识符
    state MASTER            #状态只有MASTER和BACKUP两种,并且要大写,MASTER为工作状态,BACKUP是备用状态
    interface eth0          #通信所使用的网络接口
  virtual_router_id 51  #虚拟路由的ID号,是虚拟路由MAC的最后一位地址
  priority 100          #此节点的优先级,主节点的优先级需要比其他节点高
  advert_int 1          #通告的间隔时间
  authentication {      #认证配置
                auth_type PASS      #认证方式
        auth_pass 1111      #认证密码
    }
    virtual_ipaddress {     #虚拟ip地址,可以有多个地址,每个地址占一行,不需要子网掩码,同时这个ip 必须与我们在lvs 客户端设定的vip 相一致!
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}

virtual_server 192.168.200.100 443 { #集群所使用的VIP和端口
    delay_loop 6                    #健康检查间隔,单位为秒
    lb_algo rr                      #lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh
    nat_mask 255.255.255.0          #VIP掩码
    lb_kind NAT                     #负载均衡转发规则。一般包括DR,NAT,TUN 3种
    persistence_timeout 50          #会话保持时间,会话保持,就是把用户请求转发给同一个服务器,不然刚在1上提交完帐号密码,就跳转到另一台服务器2上了
    protocol TCP                    #转发协议,有TCP和UDP两种,一般用TCP,没用过UDP
    real_server 192.168.200.100 443 { #真实服务器,包括IP和端口号
        weight 1                    #权重
        TCP_CHECK {                 #通过tcpcheck判断RealServer的健康状态
            connect_timeout 3       #连接超时时间
            nb_get_retry 3          #重连次数
            delay_before_retry 3    #重连间隔时间
            connect_port 23         #健康检查的端口的端口
            bindto <ip>  
        }

        HTTP_GET  {     #健康检测方式,可选有 SSL_GET、TCP_CHECK、HTTP_GET
            url {                   #检查url,可以指定多个
              path /        #检查的url路径
              digest ff20ad2481f97b1754ef3e12ecd3a9cc  #需要检查到的内容。检查后的摘要信息。
            }
            url {
              path /mrtg
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            url {
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }

            connect_timeout 3       #连接超时时间
            nb_get_retry 3          #检测尝试几次
            delay_before_retry 3    #检测的时间间隔
        }
    }
}

访问

配置好keepalived启动后,我们就可以通过192.168.8.100这个VIP进行服务的访问。

keepalived高可用配置文件详解

主节点

vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   # notification_email { # 邮件通知,一般不用
   #   test1@163.com
   #   test2@163.com
   # }
   # notification_email_from test@163.com
   router_id hostname1 # 标识本节点的字符串,设置为hostname即可
}

vrrp_instance VI_1 {
    state MASTER    # 标识主节点服务(只有MASTER和BACKUP两种,大写)
    interface ens33      # VIP板顶的网卡接口
    virtual_router_id 51  # 虚拟路由id,和备节点保持一致
    priority 100        # 优先级,高于备节点的即可。
    # nopreempt         # 禁止MASTER宕机恢复后抢占服务
    # smtp_alert        # 激活故障时发送邮件告警
    mcast_src_ip 192.168.8.60   # 本机IP地址
    advert_int 1    # MASTER和BACKUP节点之间的同步检查时间间隔,单位为秒
    authentication {    # 验证类型和验证密码
        auth_type PASS  # PAAS(默认),HA
        auth_pass 1234  # MASTER和BACKUP使用相同明文才可以互通
    }
    virtual_ipaddress { # 虚拟IP地址池,可以多个IP
        192.168.8.100 # 虚拟IP1(VIP)
        192.168.8.110 # 虚拟IP2(VIP)
    }
}

备节点

除了注释#内容以外,其他都和主节点保持一致。

vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   router_id hostname2 # 标识本节点的字符串,设置为hostname即可
}

vrrp_instance VI_1 {
    state BACKUP    # 标识主节点服务(只有MASTER和BACKUP两种,大写)
    interface ens33
    virtual_router_id 51
    priority 99    # 优先级,低于主节点的即可。
    mcast_src_ip 192.168.8.70   # 本机IP地址
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    virtual_ipaddress {
        192.168.8.100
        192.168.8.110
    }
}

Keepalived高可用裂脑

什么是裂脑?

由于某些原因,导致两台高可用服务器对在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权,而此时的两台高可用服务器对都还活着并在正常运行,这样就会导致同一个IP或服务在两端同时存在而发生冲突,最严重的是两台主机占用同一个VIP地址,当用户写入数据时可能会分别写入到两端,这可能会导致服务器两端的数据不一致或造成数据丢失,这种情况就被称为裂脑。

裂脑的原因

1)高可用服务器对之间心跳线链路故障,导致无法正常通信。

2)高可用服务器对上开启了iptables防火墙阻挡了心跳消息传输。

3)高可用服务器对上心跳网卡地址等信息配置不正确,导致发送心跳失败。

4)keepalived配置问题。

解决裂脑的常见方案

1)同时使用串行电缆和以太网电缆连接,同时用两条心跳线路

2)当检测到裂脑时强行关闭一个心跳节点(这个功能需特殊设备支持,如Stonith 、fence)。相当于备节点接收不到心跳消息,发送关机命令通过单独的线路关闭主节点的电源。 fence和Stonith设备其实就是一个智能电源。