HA Cluster:keepalived

HA Cluster

  • 集群类型:LB(lvs/nginx(http/upstream, stream/upstream))、HA、HP

  • 系统可用性的公式:A=MTBF/(MTBF+MTTR)

    • 系统故障:

      • 硬件故障:设计缺陷、wear out、自然灾害
      • 软件故障:设计缺陷
    • 提升系统高用性的解决方案之降低MTTR:

      • 解决方案:冗余(redundant)
        active/passive(主备),active/active(双主)
    • 在资源级别定义优先级,定义对资源的倾向性

    • Failover:故障切换,即某资源的主节点故障时,将资源转移至其它节点的操作;

    • Failback:故障移回,即某资源的主节点故障后重新修改上线后,将转移至其它节点的资源重新切回的过程;

  • HA Cluster实现方案:

    • vrrp协议的实现

      • keepalived
    • ais:完备HA集群

      • RHCS(cman)
      • heartbeat
      • corosync

keepalived

  • vrrp协议:Virtual Redundant Routing Protocol

    • 术语:

      • 虚拟路由器:Virtual Router:由一个Master路由器和多个Backup路由器组成。主机将虚拟路由器当作默认网关。
      • 虚拟路由器标识:VRID(0-255):有相同VRID的一组物理路由器构成一个虚拟路由器。用来标识路由器
      • 物理路由器:
        master:主设备 #虚拟路由器中承担报文转发任务的路由器。
        backup:备用设备 #master路由器出现故障时,能够代替master路由器工作的路由器。
        priority:优先级 #指的是物理节点的优先级,vrrp根据优先级来确定虚拟路由器中每台路由器的地位。

      • VIP:Virtual IP #虚拟路由器的IP地址。一个虚拟路由器可以拥有一个或多个IP地址。

      • VMAC:Virutal MAC 一个虚拟路由器拥有一个虚拟MAC地址。虚拟MAC地址的格式为(00-00-5e-00-01-VRID)。通常情况下,虚拟路由器回应ARP请求使用的是虚拟MAC地址,只有虚拟路由器做特殊配置的时候,才回应接口的真实MAC地址。

      • 非抢占式:只有对方故障了,才可以抢; #如果Backup路由器工作在非抢占方式下,则只要master路由器没有出现故障,backup路由器即使随后被配置了更高的优先级也不会成为master路由器。

      • 抢占式:只要对方的优先级比自己的低,就抢; #如果backup路由器工作在抢占方式下,当它收到vrrp报文后,会将自己的优先级与通告报文中的优先级进行比较。如果自己的优先级比当前的master路由器的优先级高,就会主动抢占成为master路由器;否则,将保持backup状态。

    • 选举:比较优先级

    • 通告:心跳,优先级等;周期性;
      采用组播方式发送心跳,并且对信息进行认证

    • 认证:

      • 无认证
        简单字符认证
        MD5
    • 工作模式:

      • 主/备:单虚拟路由器;
        主/主:主/备(虚拟路由器1),备/主(虚拟路由器2)
  • keepalived:

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

      • 基于vrrp协议完成地址流动;
      • 为ipvs集群节点生成ipvs规则(在配置文件中预先定义);
      • 为ipvs集群的各RS做健康状态检测;基于检测结果完成节点管理;
      • 基于脚本调用接口通过执行脚本完成脚本中定义的功能,进而影响集群事务;
    • 组件:

      • 核心组件:
        vrrp stack
        ipvs wrapper
        checkers
      • 控制组件:
        配置文件分析器
        IO复用器
        内存管理组件
  • HA Cluster的配置前提:

    1. 各节点时间必须同步;
      ntp, chrony
    2. 确保iptables及selinux不会成为阻碍;
    3. 各节点之间可通过主机名互相通信(对keepalived并非必须);建议使用/etc/hosts文件实现;
    4. 确保各节点的用于集群服务的接口支持MULTICAST通信;
      D类:224-239;
    5. 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信;(并非必须)
  • keepalived安装配置:

    • 程序环境:

      • 主配置文件:/etc/keepalived/keepalived.conf
      • 主程序文件:/usr/sbin/keepalived
      • Unit File:keepalived.service
      • Unit File的环境配置文件:/etc/sysconfig/keepalived
    • 配置文件组件部分:

      • GLOBAL CONFIGURATION

        • Global definitions
        • Static routes/addresses
      • VRRPD CONFIGURATION

        • VRRP synchronization group(s):vrrp同步组;把两个虚拟路由器定义成一个同步组就能确保这两个必须把vip放在同一个节点上;
          nat服务集群时要求使用此功能;
        • VRRP instance(s):每个vrrp instance即一个vrrp路由器;
        • VRRP脚本
      • LVS CONFIGURATION

        • Virtual server group(s)
        • Virtual server(s):ipvs集群的vs和rs;
    • 配置语法:

      • 配置虚拟路由器:

        vrrp_instance <STRING> {
              ....
          }
        • state MASTER|BACKUP:当前节点在此虚拟路由器上的初始状态;只能有一个是MASTER,余下的都应该为BACKUP;
        • interface IFACE_NAME:绑定为当前虚拟路由器使用的物理接口;
        • virtual_router_id VRID:当前虚拟路由器的惟一标识,范围是0-255;
        • priority 100:当前主机在此虚拟路径器中的优先级;范围1-254;
        • advert_int 1:vrrp通告的时间间隔;主备间通告时间检查的时间间隔,单位为s,默认1s

        • 设置认证

          authentication {
            auth_type AH|PASS
            auth_pass <PASSWORD>
          }
        • 设置VIP即虚拟IP地址

          virtual_ipaddress {            
            <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
            192.168.200.17/24 dev eth1
            192.168.200.18/24 dev eth2 label eth2:1
          }
        • 配置要监控的网络接口,一旦接口出现故障,则转为FAULT状态;

          track_interface {
            eth0
            eth1
            ...
          }
        • nopreempt:定义工作模式为非抢占模式;
        • preempt_delay 300:抢占式模式下,节点上线后触发新选举操作的延迟时长;

        • 定义通知脚本:

          • notify_master |:当前节点成为主节点时触发的脚本;
          • notify_backup |:当前节点转为备节点时触发的脚本;
          • notify_fault |:当前节点转为“失败”状态时触发的脚本;

          • notify |:通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知;

    • 单主配置示例:

      ! Configuration File for keepalived
      
        global_defs {
            notification_email {
                root@localhost
            }
            notification_email_from keepalived@localhost
            smtp_server 127.0.0.1
            smtp_connect_timeout 30
            router_id node1
            vrrp_mcast_group4 224.0.100.19
        }
      
        vrrp_instance VI_1 {
            state BACKUP
            interface eno16777736
            virtual_router_id 14
            priority 98
            advert_int 1
            authentication {
                auth_type PASS
                auth_pass 571f97b2
            }
            virtual_ipaddress {
                10.1.0.91/16 dev eno16777736
            }
        }
    • 双主模型示例:

      ! Configuration File for keepalived
      
        global_defs {
            notification_email {
                root@localhost
            }
            notification_email_from keepalived@localhost
            smtp_server 127.0.0.1
            smtp_connect_timeout 30
            router_id node1
            vrrp_mcast_group4 224.0.100.19
        }
      
        vrrp_instance VI_1 {
            state MASTER
            interface eno16777736
            virtual_router_id 14
            priority 100
            advert_int 1
            authentication {
                auth_type PASS
                auth_pass 571f97b2
            }
            virtual_ipaddress {
                10.1.0.91/16 dev eno16777736
            }
        }
      
        vrrp_instance VI_2 {
            state BACKUP
            interface eno16777736
            virtual_router_id 15
            priority 98
            advert_int 1
            authentication {
                auth_type PASS
                auth_pass 578f07b2
            }
            virtual_ipaddress {
                10.1.0.92/16 dev eno16777736
            }
        }
    • 示例通知脚本:

      #!/bin/bash
        #
        contact='root@localhost'
      
        notify() {
            local mailsubject="$(hostname) to be $1, vip floating"
            local 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
      • 脚本的调用方法:

        notify_master "/etc/keepalived/notify.sh master"
        notify_backup "/etc/keepalived/notify.sh backup"
        notify_fault "/etc/keepalived/notify.sh fault"
  • 虚拟服务器配置:

    virtual_server IP port | virtual_server fwmark int 
      {
          ...
          real_server {
              ...
          }
          ...
      }
    • 常用参数:

      delay_loop <INT>:服务轮询的时间间隔;
      lb_algo rr|wrr|lc|wlc|lblc|sh|dh:定义调度方法;
      lb_kind NAT|DR|TUN:集群的类型;
      persistence_timeout <INT>:持久连接时长;
      protocol TCP:服务协议,仅支持TCP;
      sorry_server <IPADDR> <PORT>:备用服务器地址;
      real_server <IPADDR> <PORT>
      {
         weight <INT>
         notify_up <STRING>|<QUOTED-STRING>
         notify_down <STRING>|<QUOTED-STRING>
         HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... }:定义当前主机的健康状态检测方法;
      }
    • HTTP_GET|SSL_GET:应用层检测

      HTTP_GET|SSL_GET {
        url {
            path <URL_PATH>:定义要监控的URL;
            status_code <INT>:判断上述检测机制为健康状态的响应码;
            digest <STRING>:判断上述检测机制为健康状态的响应的内容的校验码; #示例:~]# curl -s  http://172.16.250.173 | md5sum
      
        }
        nb_get_retry <INT>:重试次数;
        delay_before_retry <INT>:重试之前的延迟时长;
        connect_ip <IP ADDRESS>:向当前RS的哪个IP地址发起健康状态检测请求
        connect_port <PORT>:向当前RS的哪个PORT发起健康状态检测请求
        bindto <IP ADDRESS>:发出健康状态检测请求时使用的源地址;
        bind_port <PORT>:发出健康状态检测请求时使用的源端口;
        connect_timeout <INTEGER>:连接请求的超时时长;
      }
      TCP_CHECK {
        connect_ip <IP ADDRESS>:向当前RS的哪个IP地址发起健康状态检测请求
        connect_port <PORT>:向当前RS的哪个PORT发起健康状态检测请求
        bindto <IP ADDRESS>:发出健康状态检测请求时使用的源地址;
        bind_port <PORT>:发出健康状态检测请求时使用的源端口;
        connect_timeout <INTEGER>:连接请求的超时时长;
      }
  • 高可用的ipvs集群示例:

    ! Configuration File for keepalived
    
      global_defs {
          notification_email {
              root@localhost
          }
          notification_email_from keepalived@localhost
          smtp_server 127.0.0.1
          smtp_connect_timeout 30
          router_id node1
          vrrp_mcast_group4 224.0.100.19
      }
    
      vrrp_instance VI_1 {
          state MASTER
          interface eno16777736
          virtual_router_id 14
          priority 100
          advert_int 1
          authentication {
              auth_type PASS
              auth_pass 571f97b2
          }
          virtual_ipaddress {
              10.1.0.93/16 dev eno16777736
          }
          notify_master "/etc/keepalived/notify.sh master"
          notify_backup "/etc/keepalived/notify.sh backup"
          notify_fault "/etc/keepalived/notify.sh fault"
      }
    
      virtual_server 10.1.0.93 80 {
          delay_loop 3
          lb_algo rr
          lb_kind DR
          protocol TCP
    
          sorry_server 127.0.0.1 80
    
          real_server 10.1.0.69 80 {
              weight 1
              HTTP_GET {
              url {
                  path /
                  status_code 200
              }
              connect_timeout 1
              nb_get_retry 3
              delay_before_retry 1
              }
          }
          real_server 10.1.0.71 80 {
              weight 1
              HTTP_GET {
              url {
                  path /
                  status_code 200
              }
              connect_timeout 1
              nb_get_retry 3
              delay_before_retry 1
              }
          }
      }
    • TCP_CHECK使用示例:

      TCP_CHECK {
        nb_get_retry 3
        delay_before_retry 2
        connect_timeout 3
      }
  • keepalived如果要是高可用其他应用,需调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整;

    • 脚本的作用:

      • 当地址转移到这个节点的时候,将nginx启动;
      • 当不能启动时,还可以将IP地址转移出去,降低优先级,促使其他节点配置此IP地址。
    • 分两步:(1) 先定义一个脚本;(2) 调用此脚本;

      vrrp_script <SCRIPT_NAME> {
        script ""
        interval INT     #此脚本每个多长时间执行一次
        weight -INT     #万一失败了,当前节点的权重减一个数,减过的权重小于备用节点;
      }
      
      track_script {
        SCRIPT_NAME_1
        SCRIPT_NAME_2
        ...
      }
    • 示例:高可用nginx服务

      ! Configuration File for keepalived
      
      global_defs {
        notification_email {
            root@localhost
        }
        notification_email_from keepalived@localhost
        smtp_server 127.0.0.1
        smtp_connect_timeout 30
        router_id node1
        vrrp_mcast_group4 224.0.100.19
      }
      
      vrrp_script chk_down {
        script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
        interval 1
        weight -5
      }
      
      vrrp_script chk_nginx {
        script "killall -0 nginx && exit 0 || exit 1"
        interval 1
        weight -5
        fall 2
        rise 1
      }
      
      vrrp_instance VI_1 {
        state MASTER
        interface eno16777736
        virtual_router_id 14
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 571f97b2
        }
        virtual_ipaddress {
            10.1.0.93/16 dev eno16777736
        }
        track_script {
            chk_down
            chk_nginx
        }
        notify_master "/etc/keepalived/notify.sh master"
        notify_backup "/etc/keepalived/notify.sh backup"
        notify_fault "/etc/keepalived/notify.sh fault"
      }

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

(0)
ss
上一篇 2017-06-26
下一篇 2017-06-27

相关推荐

  • RPM包管理——运维必备技能之一

    软件运行环境: API:Application Programming Interface     POSIX :Portable OS 程序源代码 –> 预处理 –> 编译 –> 汇编 –> 链接     …

    Linux干货 2016-08-21
  • 磁盘管理及文件系统

    磁盘及文件系统管理初步与进阶(重点内容) 磁盘分区及文件系统 linux系统管理 磁盘分区及文件系统管理:分区工具 linux磁盘及文件系统管理 整个操作系统的硬件组成部分,最底层是硬件设备,计算能力得以运行的最根本的基础。 计算机的五大基本部件:cpu,运算器,控制器被整合到一起,由一个硬件部件来提供。 存储器(主存rom可编址的存储单元)。主板上有cpu…

    Linux干货 2016-08-30
  • 文本编辑器vim概述与应用示例

    文本编辑器vim概述与应用示例 文本编辑器概述 vim编辑器是一种易用、功能强大的文本编辑器,可以基于三种不同的模式对文本进行编辑,包括编辑模式、输入模式和末行模式。 编辑模式 模式转换 i 表示在光标所在处插入 a 表示在光标后方插入 o 表示在光标所在处的下一行插入 O 表示在光标所在处的上一行插入 I 表示在光标所在行的行首插入 A 表示在光标所在行的…

    Linux干货 2017-08-06
  • HAProxy基于Keepalived做高可用并简单实现Web站点的动静分离

    HAProxy简介   HAProxy 是一个免费的,非常快速和可靠的解决方案,提供 高可用性, 负载均衡和代理对TCP和HTTP的应用程序。它特别适用于非常大流量网站。多年来,它已成为标准开源的负载均衡,现在随最主流的Linux发行版,并且通常默认的云平台部署。 实验描述 1、本实验主要是在前端放置两台通过Keepalived做了高可用的HAProxy反向…

    Linux干货 2016-04-16
  • 第二天作业

    1、echo 查闪烁,下划,颜色    echo -e "\033[31;5;1m*******\033[0m\n \033[32;5;1m*****\033[0m\n  \033[33;5;1m***\033[0m\n   \033[34;5;1m*\033[0m" 2、scr…

    Linux干货 2016-07-26
  • Linux操作系统发展史

    内容摘要:Linux操作系统的诞生,Linux 的发展,Linux的特性决定其迅猛发展,Linux的应用领域与发展前景 关键词:Linux的发展  前景   1.  Linux操作系统的诞生 在1981年到1991年十年间,微软公司的MS-DOS系统一直主宰操作系统的市场,其价格十分昂贵,另一个操作系统UNIX的经销商为了高利润…

    Linux干货 2016-10-14