HA Cluster 之 vrrp (keepalived)

 

0x00 前言

传统的集群方案( 如 lvs ) 在 director 处容易出现单点故障,为了解决此问题,可在 Director 处设立 冗余。当一个出现故障时,另一个可取而代之。
活动节点不但要自己提供服务,而且还将自己的活动信息以固定频率周期性的同步给备用节点, 备用节点在一个或指定的周期内没能收到心跳信息时会取而代之。

  • 衡量系统可用的指标:
    A=MTFB/(MTBF+MTTR)
    95%, 99%, …, 99.999%,99.9999%;

  • HA Cluster实现方案:

    • vrrp协议的实现 :
      keepalived
    • ais:完备HA集群 :
      RHCS(cman)
      heartbeat
      corosync

0x01 VRRP 协议

VRRP 简介

  • VRRP : Virtual Router Redundancy Protocol (虚拟路由冗余协议), 是由IETF提出的解决局域网中配置静态网关出现单点失效现象的路由协议.

  • VRRP广泛应用在边缘网络中

  • VRRP设计目标:
    支持特定情况下IP数据流量失败转移不会引起混乱,允许主机使用单路由器,以及及时在实际第一跳路由器使用失败的情形下仍能够维护路由器间的连通性。

VRRP 工作原理

  1. 路由器开启VRRP功能后,会根据优先级确定自己在备份组中的角色。优先级高的路由器成为主用路由器,优先级低的成为备用路由器。主用路由器定期发送VRRP通告报文,通知备份组内的其他路由器自己工作正常;备用路由器则启动定时器等待通告报文的到来。
  2. VRRP在不同的主用抢占方式下,主用角色的替换方式不同

    • 抢占方式下,当主用路由器收到VRRP通告报文后,会将自己的优先级与通告报文中的优先级进行比较。如果大于通告报文中的优先级,则成为主用路由器;否则将保持备用状态。
    • 非抢占方式下,只要主用路由器没有出现故障,备份组中的路由器始终保持主用或备用状态,备份组中的路由器即使随后被配置了更高的优先级也不会成为主用路由器。
  3. 如果备用路由器的定时器超时后仍未收到主用路由器发送来的VRRP通告报文,则认为主用路由器已经无法正常工作,此时备用路由器会认为自己是主用路由器,并对外发送VRRP通告报文。备份组内的路由器根据优先级选举出主用路由器,承担报文的转发功能。

VRRP负载分担方式的特点

  1. 每个备份组都包括一个主用路由器和若干个备用路由器。
  2. 各备份组的主用路由器可以不相同
  3. 同一台路由器可以加入多个备份组,在不同备份组中有不同的优先级,使得该路由器可以在一个备份组中作为主用路由器,在其他的备份组中作为备用路由器。

VRRP 中的一些术语

  • VR: Virtual Router 虚拟路由器
  • VRID 虚拟路由器标识:0-255)
  • 物理路由器:
    master:主设备
    backup:备用设备
    priority:优先级
  • VIP:Virtual IP
  • VMAC:Virutal MAC (00-00-5e-00-01-VRID) (一般是固定的)

VRRP 的控制报文机制—— VRRP通告:(advertisement)。
它使用IP多播数据包进行封装,组地址为224.0.0.18,发布范围只限于同一局域网内。

VRRP在安全方面:可以采用简单字符认证,或MD5 认证( 8 位); 也可以使用无认证方式。

0x02 keepalived 功用:

keepalived : vrrp协议的软件实现,原生设计的目的为了高可用ipvs服务:

  1. vrrp 协议的软件实现,完成地址流动
  2. 根据 读取配置文件 为 unix主机内核 生成 ipvs 规则, 提供了 高可用ipvs服务
  3. 为ipvs集群的各RS做健康状态检测;
  4. 基于脚本调用接口通过执行脚本完成脚本中定义的功能,进而影响集群事务;

0x03 keepalived 配置

HA Cluster 的配置前提:

  1. 各节点时间必须同步
    ntp, chony
  2. 确保iptables, selinux 不成为阻碍。
    iptables -F && setenforce 0
  3. 各节点之间可通过主机名互相通信 (对KA并非必须);
    建议使用 /etc/hosts 文件实现解析; (不要用DNS 解析)
  4. 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信;(并非必须)

配置文件组件部分:

  • GLOBAL CONFIGURATION
    Global definitions
    Static routes/addresses
  • VRRPD CONFIGURATION
    VRRP synchronization group(s):vrrp同步组;
    VRRP instance(s):每个vrrp instance相当于一个vrrp路由器;
  • LVS CONFIGURATION
    Virtual server group(s)
    Virtual server(s):ipvs集群的vs和rs;

配置文件解析:

! Configuration File for keepalived

###    GLOBAL CONFIGURATION     ###

global_defs {

    ##  定义通知接收邮箱 ##
   notification_email {
     root@localhost        
   }
   #- - - - - -#
   notification_email_from  keepalived@localhost       # 通知发送邮箱     
   smtp_server 127.0.0.1                  # 邮箱server
   smtp_connect_timeout 30
   router_id node1                        # 定义 router_id
   vrrp_mcast_group4 224.0.100.19         # 组播域
}

###   VRRPD CONFIGURATION   ###

    ### vrrp_script ###
vrrp_script  script_name {  
    script " killall -0 nginx && exit || exit 1"

    interval 1   # 间隔时间
    weight -5 
}

vrrp_script script_name2 {
    ...
    }
   ### vrrp_instance ###
vrrp_instance KA_1 {
    state MASTER                        # 主备状态  MASTER | BACKUP
    interface ens32                     # 定义 网卡接口
    virtual_router_id 51                # 虚拟路由 id
    priority 100                        # 优先级
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass qweqwe                # 指定 密码
    }

    ## 定义 virtual_ipaddress ##
    virtual_ipaddress {
        172.18.9.111/16 
    }

    track_script {        # 调用下面的脚本
        # script_name 
    }
    ##  调用通知脚本 ##  脚本见附录
    notify_master "/etc/keepalived/notify.sh  master"
    notify_backup "/etc/keepalived/notify.sh  backup"
    notify_fault "/etc/keepalived/notify.sh   fault"

}

vrrp_instance KA_2 {

    ...
}



###   LVS CONFIGURATION   ###


virtual_server 192.168.200.100 443 {
    delay_loop 6                         # 服务轮询的时间间隔
    lb_algo rr                           # 定义调度方法: rr|wrr|lc|wlc|lblc|sh|dh
    lb_kind NAT                          # 集群的类型 NAT | DR | TUN
    nat_mask 255.255.255.0               # 只限于 NAT 类型使用
    persistence_timeout 50               # 持久连接时长
    protocol TCP                         # 服务协议,仅支持TCP
    # sorry_server <IPADDR> <PORT>       # 备用服务器地址

    ##  real_server <IPADDR> <PORT>
    real_server 192.168.201.100 443 {
        weight 1                         # 定义 weight
        SSL_GET {                        # 应用层检测  HTTP_GET|SSL_GET
            url {
              path /                     # 定义要监控的 URL_PATH
              # status_code <INT>        # 判断上述检测机制为健康状态的响应码;           
              digest ff20ad2481f97b1754ef3e12ecd3a9cc  # 判断上述检测机制为健康状态的响应的内容的校验码
            }
            url {
            ...
            }

            connect_timeout 3           # 连接请求的超时时长
            nb_get_retry 3              # 重试次数
            delay_before_retry 3        # 重试之前的延迟时长
            #connect_ip <IP ADDRESS>    # 向当前RS的哪个IP地址发起健康状态检测请求
            #connect_port <PORT>        # 向当前RS的哪个PORT发起健康状态检测请求
            #bindto <IP ADDRESS>        # 发出健康状态检测请求时使用的源地址;
            #bind_port <PORT>           # 发出健康状态检测请求时使用的源端口;
        }

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

附:邮件通知脚本

#!/bin/bash
#
contact='root@localhost'

notify() {
    mailsubject="$(hostname) to be $1, vip floating"
    mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
    echo "$mailbody" | mail -s "$mailsubject" $contact
}

case $1 in
master)
    notify master
    ;;
backup)
    notify backup
    ;;
fault)
    notify fault
    ;;
*)
    echo "Usage: $(basename $0) {master|backup|fault}"
    exit 1
    ;;
esac

原创文章,作者:Yanglibin,如若转载,请注明出处:http://www.178linux.com/75916

(0)
YanglibinYanglibin
上一篇 2017-05-16 08:42
下一篇 2017-05-16 19:01

相关推荐

  • 第六周作业-Vim总结

                    Vim总结 vim功能比较多,这里我不总结vim多窗口,只对基本常用的介绍. 一.模式说明 vim和记事本或WORD不一样,不是一打开后就可以输入文字,此时它处于正常模…

    Linux干货 2017-01-16
  • 设计模式(三)建造者模式Builder(创建型)

    1. 概述        在软件开发的过程中,当遇到一个“复杂的对象”的创建工作,该对象由一定各个部分的子对象用一定的算法构成,由于需求的变化,复杂对象的各个部分经常面临剧烈的变化,但将它们组合在一起的算法相对稳定。        例子1:买肯德基     &…

    Linux干货 2015-06-25
  • 设计模式 ( 十六 ) 观察者模式Observer(对象行为型)

    1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力。当对象们连接在一起时,它们就可以相互提供服务和信息。 通常来说,当某个对象的状态发生改变时,你仍然需要对象之间能互相通信。但是出于各种原因,你也许并不愿意因为代码环境的改变而对代码做大的修改。也许,你只想根据你的具体应用环境而改进通信代码。或者,你只想简单的重新构造通信代码来避免类和类…

    Linux干货 2015-07-24
  • 马哥教育网络第21期-第八周课程练习

    1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。   网桥从一个局域网接收MAC帧,拆封、校对、校验之后,按另一个局域网的格式重新组装,发往它的物理层。由于网桥是链路层设备,因此不处理数据链路层以上层次协议所加的报头。   集线器的主要功能是对接收到的信号进行再生整形放大,以扩大网络的传输距离,同时把所有节点…

    Linux干货 2016-10-24
  • AIDE入侵检测

    AIDE

    当一个入侵者进入了你的系统并且种植了木马,通常会想 办法来隐蔽这个木马(除了木马自身的一些隐蔽特性外, 他会尽量给你检查系统的过程设置障碍),通常入侵者会 修改一些文件,比如管理员通常用ps -aux来查看系统进 程,那么入侵者很可能用自己经过修改的ps程序来替换掉 你系统上的ps程序,以使用ps命令查不到正在运行的木马 程序。如果入侵者发现管理员正在运行crontab作业,也 有可能替换掉crontab程序等等。所以由此可以看出对于 系统文件或是关键文件的检查是很必要的。目前就系统完 整性检查的工具用的比较多的有两款:Tripwire和AIDE ,前者是一款商业软件,后者是一款免费的但功能也很强 大的工具

    2018-01-08
  • 文本处理工具(练习+作业)

    文本处理工具(cut,sort,uniq)练习 1、找出ifconfig命令结果中本机的所有IPv4地址 [root@localhost ~]# ifconfig | tr -cs '[:digit:].' '\n'| sort -t. -k3 |tail -5 2、查出分区空间使用率的最大百分比值 [root@loc…

    Linux干货 2016-08-07