• KeepAlived(三):vrrp实例故障转移(keepalived+haproxy)


    keepalived使用脚本进行健康检查时的相关配置项。例如keepalived+haproxy实现haproxy的高可用。

    keepalived分为vrrp实例的心跳检查和后端服务的健康检查。如果要配置后端服务,则后端服务只能是LVS。但vrrp能独立于lvs存在,例如keepalive结合haproxy、mysql等服务实现它们的高可用。

    1. vrrp实例的心跳检查(lvs,haproxy,mysql...)
      • (1).除了LVS,vrrp只能通过脚本来实现vrrp的健康检查,并通过vrrp实例脚本结束keepalived进程来中断该实例的心跳通告。此时virtual server部分的配置需省略。
      • (2).对于LVS,无需使用任何脚本,因为所有keepalived节点会同时对后端服务进行健康检查,并同时从LVS规则中剔除下线的服务。如果所有后端服务都不健康,那就没有必要切换keepalived。
    2. 后端RS的健康检查(只能是LVS)
      • (1).一般采用TCP_CHECK、HTTP_GET、SSL_GET进行健康检查。
      • (2).但也能自写脚本进行后端服务的健康检查,这种模式称为MISC_CHECK。

    以下是从man keepalived中截取的通过脚本进行心跳检查、健康检查时的相关配置选项。man介绍的比较简单,更详细的配置说明可参考:https://github.com/acassen/keepalived/blob/master/doc/keepalived.conf.SYNOPSIS

    VRRP script(s)
        # 定义一个vrrp脚本,后续vrrp组或vrrp实例要执行某脚本时,需要从此处引用
        # 注意,所有vrrp实例都会监控脚本的退出状态码
        vrrp_script <SCRIPT_NAME> {
           script <STRING>|<QUOTED-STRING> # 要执行的命令或脚本路径
           interval <INTEGER>              # 脚本调用时间间隔,默认1秒
           timeout <INTEGER>               # 脚本执行等待超时时长,超过该时长,表示脚本执行失败
           weight <INTEGER:-254..254>      # 根据该权重值调整vrrp实例优先级值,默认值为0
           rise <INTEGER>                  # 需要成功多少次,vrrp才进行角色状态切换(从fault切换为正常)
           fall <INTEGER>                  # 需要失败多少次,vrrp才进行角色状态切换(从正常切换为fault)
           user USERNAME [GROUPNAME]       # 脚本执行身份,group默认同username
           init_fail                       # 假定脚本初始化时就处于失败状态
        }
    
    VRRP synchronization group(s)
        # 分别表示切换为主/备/出错(例如监控的eth0坏了)时所执行的脚本。
        # 要为脚本传递参数时,使用引号包围整个脚本和参数
        notify_master /path/to_master.sh [username [groupname]]
        notify_backup /path/to_backup.sh [username [groupname]]
        notify_fault "/path/fault.sh VG_1" [username [groupname]]
    
        # notify表示只要状态切换都会调用的脚本,且该脚本是在以上三个脚本执行之后再调用的,
        # keepalived会自动传递四个参数,因此不要手动为脚本传递参数。
        # $1 = "GROUP"|"INSTANCE"
        # $2 = vrrp组名称或vrrp实例名
        # $3 = 切换的目标状态(MASTER/BACKUP/FAULT)
        # $4 = 优先级数值(priority value)
        notify /path/notify.sh [username [groupname]]
    
    
    VRRP instance(s)部分
    
        # 监控接口,当某接口down掉时,切换为fault状态
        track_interface {
          eth0
          eth1
          eth2 weight <-254..254>
          ...
        }
    
        # 监控脚本,即执行vrrp_script定义的脚本
        track_script {
            <SCRIPT_NAME>
            <SCRIPT_NAME> weight <-254..254>
        }
    
        # notify_master/backup/fault/stop分别表示切换为主、备、出错(例如监控的eth0坏了)、vrrp停止时所执行的脚本
        # 要为脚本传递参数时,使用引号包围整个脚本和参数
        notify_master <STRING>|<QUOTED-STRING> [username [groupname]]
        notify_backup <STRING>|<QUOTED-STRING> [username [groupname]]
        notify_fault <STRING>|<QUOTED-STRING> [username [groupname]]
        notify_stop <STRING>|<QUOTED-STRING> [username [groupname]]   # executed when stopping vrrp
    
        # notify表示只要状态切换都会调用的脚本,并且该脚本是在以上三个脚本执行之后再调用的
        notify <STRING>|<QUOTED-STRING> [username [groupname]]
    
    
    
    Virtual server(s)部分
    
        # 投票被选举成功或失败时执行的脚本
        quorum_up <STRING>|<QUOTED-STRING>
        quorum_down <STRING>|<QUOTED-STRING>
    
        real_server <IPADDR> <PORT>
           {
               # 当健康检查的后端rs上线、下线时执行的脚本
               notify_up <STRING>|<QUOTED-STRING>
               notify_down <STRING>|<QUOTED-STRING>
    
               # MISC健康检查类型,该类型通过自定义脚本来检查后端健康状况
               MISC_CHECK
               {
                   # 执行哪个脚本来判断后端是否健康
                   misc_path <STRING>|<QUOTED-STRING>
                   # Script execution timeout
                   misc_timeout <INT>
    
                   # 指定一个随机延迟时间,防止同时检查所有后端,指定为0时表示禁止该功能。
                   # 默认启动该功能,默认最大间隔为delay_loop的值。
                   warmup <INT>
    
                   # 如果指定该选项,则根据健康检查脚本的退出状态码动态调整权重值
                   # 退出状态码为:
                   # 0:表示检查成功,不做任何权重修改
                   # 1:表示检查失败
                   # 2-255:表示检查成功,但权重值减2,例如(状态码为255,则设置权重为253)
                   misc_dynamic
    
                   # 指定运行后端健康检查脚本的身份,不指定group时将默认使用username
                   user USERNAME [GROUPNAME]
               }
           }
        }
    

    例如,在keepalived+haproxy时。

    vrrp_script check_haproxy {
            script"/etc/keepalived/chk_haproxy.sh"
            interval 2
            weight 2
        }
    
    global_defs {
            router_id haproxy1
        }
    
    vrrp_instanceVI_1 {
            state MASTER
            interface eth0
            virtual_router_id 150
            priority 50
            advert_int 1
            authentication {
                auth_type PASS
                auth_pass 1111
            }
    
    virtual_ipaddress{
            192.168.1.201
        }
    track_script {
            check_haproxy
        }
    }
    

    其中check_haproxy的脚本/etc/keepalived/chk_haproxy.sh内容如下:

    #!/bin/bash
    
    if ! killall -0 haproxy &>/dev/null;then
        serivce haproxy restart
        sleep 1
        if ! killall -0 haproxy &>/dev/null;then
            service keepalived stop
        fi
    fi
    

    另外一种方式,直接在vrrp_script处定义要执行的命令,而不是使用一个额外的脚本来监控对象。例如:

    
    vrrp_script check_haproxy {
            script "killall -0 haproxy"  # 此行改变
            interval 2
            weight 2
        }
     
    global_defs {
            router_id haproxy1
        }
     
    vrrp_instanceVI_1 {
            state MASTER
            interface eth0
            virtual_router_id 150
            priority 50
            advert_int 1
            authentication {
                auth_type PASS
                auth_pass 1111
            }
     
    virtual_ipaddress{
            192.168.1.201
        }
    track_script {
            check_haproxy
        }
    }
    

    上面的vrrp_script配置中,每两秒检查一次haproxy进程是否存在,连续检查fall <int>次数后都不存在就进入fault状态,由于没有指定fall <int>,所以一次检查失败就进入fault。

    其实通过脚本控制比较复杂,因为要考虑脚本的返回值(不是退出状态码)。当然,如果直接像前面示例一样在脚本中直接进行restart、stop等操作也是可以的。

  • 相关阅读:
    C# MVC解决跨站请求伪造(appscan)
    .net中关于Url传参问题
    二月项目完成小结
    sql 获取时间
    ajax提交form表单
    C# 视图遍历List数组
    C#遍历指定文件夹中的所有文件
    C#关于文件的操作
    .net 文件上传到服务器【转】
    Server.MapPath获取各级目录【转】
  • 原文地址:https://www.cnblogs.com/f-ck-need-u/p/8566233.html
Copyright © 2020-2023  润新知