1. VRRP协议

1.1 VRRP协议概述

  • VRRP协议的出现是为了解决静态路由的单点故障,它是通过一种竞选机制来将路由任务交给某个vrrp路由器的
  • 在VRRP物理结构中,有多个物理的VRRP路由器,其中有一台称为“master”(主节点路由器),其他的都是“backup”(备节点路由器)
    • master和backup的身份,是通过他妈的优先级来定义竞选的
  • 在VRRP虚拟结构中,虚拟路由都是通过“MAC+VRID”的形式来标识的,如“00-00-5E-00-01-{VRID}”
    • 只有master节点才会发送VRRP广告包(vrrp advertisement message)
    • 当master节点宕掉的时候,backup中优先级最高的VRRP设备会抢占并升级为master

1.2 VRRP的术语

  • 虚拟路由器

    • 由一个Master路由器和多个Backup路由器组成,主机将虚拟路由器当做默认网关(将Master和Backup看做一个整体)
  • VRID
    • 虚拟路由器的标识,有相同的VRID的一组路由器构成一个虚拟路由器
  • Master路由器
    • 虚拟路由器中承担报文转发任务的路由器
  • Backup路由器
    • 虚拟路由器中备份节点路由器
  • 虚拟IP地址
    • 虚拟路由器的IP地址,一个虚拟路由器可以拥有一个或多个IP地址
  • VIP
    • IP地址拥有者,接口IP地址与虚拟IP地址相同的路由器被称为IP地址拥有者
  • VMAC
    • 虚拟MAC地址,一个虚拟路由器拥有一个虚拟MAC地址,通常情况下,虚拟路由器回应ARP请求使用的是虚拟MAC地址
  • 优先级
    • VRRP根据优先级来确定虚拟路由器中每台路由器的地位
  • 非抢占式
    • 如果backup路由器工作在此模式下,则若Master路由器没有出现故障,backup即使随后被配置了更高的优先级也不会成为Master
  • 抢占式
    • 如果backup路由器工作在抢占方式下,当它收到VRRP报文后,会将主机的优先级与通告报文中的优先级进行比较,
    • 如果主机的优先级比当前的Master路由器的优先级高,就会主动抢占成为Master路由器,否则,将保持Backup状态

1.3 VRRP的工作过程

  • 虚拟路由器中的路由器根据优先级选举出Master

    • Master路由器通过发送免费ARP报文,将主机的虚拟MAC地址通知给它连接的设备或者主机,从而承担报文转发任务
  • Master路由器周期性发送VRRP报文,以公布其配置信息(优先级等)和工作状况
  • 如果Master路由器出现故障,虚拟路由器中的Backup路由器将根据优先级重新选举出新的Master
  • 虚拟路由器状态切换时,Master路由器由一台设备切换为另一台设备
    • 新的Master路由器发送一个携带虚拟路由器的MAC地址和虚拟IP地址信息的免费ARP报文,以更新与它连接的主机中的ARP相关的信息
    • 网路中的主机感知不到Master路由器已经切换为另外一台设备
  • Backup路由器的优先级高于Master路由器时,由Backup路由器的工作方式(抢占方式和非抢占方式)决定是否重新选举Master
  • 为了保证Master路由器和Backup路由器能够协调工作,VRRP需要实现以下功能
    • Master路由器的选举
    • Master路由器状态的通告
    • 为了提高安全性,VRRP还提供了认证功能

1.4 Master路由器的选举

  • VRRP根据优先级来确定虚拟路由器中每台路由器的角色(Master路由器或Backup路由器),优先级越高,则越有可能成为Master路由器
  • 初始创建的路由器在Backup状态,通过VRRP报文获知虚拟路由器中其他成员的优先级
    • 如果VRRP报文中Master路由器的优先级高于自己的优先级,则路由器保持在Backup状态
    • 如果VRRP报文中Master路由器的优先级低于自己的优先级
      • 采用抢占工作方式的路由器将抢占成为Master状态,周期性的发送VRRP报文
      • 采用非抢占式工作方式的路由器仍保持Backup状态
    • 如果在一定时间内没有收到VRRP报文,则路由器切换为Master状态
  • VRRP优先级的取值范围为0到255(数值越大优先级越高),可配置的范围是1到254
    • 优先级0为系统保留给路由器放弃Master位置时候使用,255则是系统保留给IP地址拥有者使用
    • 当路由器为IP地址拥有者时,其优先级始终为255,因此当虚拟路由器内存在IP地址拥有者时,只要其工作正常,则为Master路由器

1.5 Master路由器状态的通告

  • Master路由器周期性发送VRRP报文,在虚拟路由器中公布其配置信息(优先级等)和工作状况

    • Backup路由器通过接收到VRRP报文的情况来判断Master路由器是否工作正常
  • Master路由器主动放弃Master地位(如Master路由器退出虚拟路由器)时
    • 会发送优先级为0的VRRP报文,致使Backup路由器快速切换变成Master路由器,这个切换时间称为Skew time
    • 计算方式为(256-Backup路由器的优先级)/256,单位为秒
  • 当Master路由器因故障不能发送VRRP报文时,Backup路由器并不能立即知道其工作状况
    • Backup路由器等待一段时间后,如果还没接收到VRRP报文,那么会认为Master路由器无法正常工作,而把自己升级为Master路由器,周期性发送VRRP报文,如果此时多个Backup路由器竞争Master路由器的位置,将通过优先级来选举Master路由器,Backup路由器默认等待的时间称为Master_Down_Interval,取值为:(3*VRRP报文的发送时间间隔)+Skewtime,单位为秒
  • 说明
    • 在性能不够稳定的网络中,Backup路由器可能因为网络堵塞而在Master_Down_Interval期间没有收到Master路由器的报文而主动抢占为Master位置,如果此时原Master路由器的报文又到达了,就会出现虚拟路由器的成员频繁的进行Master抢占现象,为了缓解这种现象的发生,特制定了延迟等待定时器,它可以使得Backup路由器在等待了Master_Down_Interval后,再等待延迟等待时间,如在此期间仍然没有收到VRRP报文,此时Backup路由器才会切换为Master路由器,对外发送VRRP报文

1.6 认证方式

1)无认证

  • 不进行任何VRRP报文的合法性认证,不提供安全性保障

2)简单字符认证

  • 在一个有可能受到安全威胁的网络中,可以将认证方式设置为简单字符认证(一般就采用这种认证)
  • 发送VRRP报文的路由器将认证字填入到报文中,而收到VRRP报文的路由器会将收到的VRRP报文中的认证字和本地配置的认证字进行比较,如果认证字相同,则认为接受到的报文是合法的VRRP报文,否则认为接收到的报文是一个非法报文

3)MD5认证

  • 在一个非常不安全的网络中,可以将认证方式设置为MD5认证
  • 发送VRRP报文的路由器利用认证字和MD5算法对VRRP报文进行加密,加密后的报文保存在Authentication Header(认证头)中,收到VRRP报文的路由器会利用认证字解密报文,检查该报文的合法性

2. keepalived

2.1 keepalived概述

1)keepalived的功能

  • 对后端RealServer进行健康状况检查,支持4层、5层和7层协议进行健康检查
  • 对负载均衡器进行高可用,防止Director单点故障

2)keepalived的运作

  • 通过VRRP(Virtual Router Redundancy Protocol)虚拟路由冗余协议来实现故障转移。
  • keepalived正常工作时,主节点(master)会不断的发送心跳信息给备节点(backup)
    • 当备节点在一定时间内没有收到主节点的心跳信息时,备节点会认为主节点宕了,就会接管主节点上的资源,并继续向外提供服务保证其可用性
    • 当主节点恢复时,备节点会自动让出资源并再次自动成为备节点

3)keepalived监控LVS

  • 使用keepalived监控、高可用LVS集群时(keepalived+lvs),并不需要在Director上使用ipvsadm额外配置ipvs规则。
  • 因为keepalived中集合了管理ipvs规则的组件(ipvs wrapper),可以直接在keepalived的配置文件中配置ipvs相关规则,在解析配置文件时会通过特定的组件将规则发送给到内核中的ipvs模块。

2.2 keepalived软件结构

1)VRRP协议

  • vrrp协议在Linux主机上以守护进程方式的实现,原生设计目的是为了高可用ipvs服务
  • 能够根据配置文件生成ipvs规则,并对各RS的健康做检测
    • vrrp_script
    • vrrp_track
  • 基于vrrp协议完成地址滚动
  • 为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)
  • 基于脚本调用接口通过执行脚本完成脚本中定义的功能,进而影响集群事务

2)keepalived的组件

  • keepalived服务启动时,将产生三个相关进程,一个父进程和两个子进程

    • 主进程:Watchdog看门狗主进程
    • 子进程1:VRRP Child
    • 子进程2:Healthchecking Child
  • 两个子进程都会开启本地套接字Unix Domain Socket
    • 当keepalived服务启动后,父进程会通过unix domain socket每隔5秒发送一个hello消息给子进程
    • 如果父进程无法发送消息给子进程,将认为子进程出现问题,于是会重启子进程
  • 核心组件

    • Watchdog

      • 看门狗,负责fork和监控子进程,对Checkers和vrrp stack进行监控
    • Checkers
      • 负责RealServer的健康状况检查,并在LVS的拓扑中移除、添加RealServer
      • 它支持layer4/5/7层的协议检查,该组件使用独立的子进程负责,但被父进程监控
    • VRRP Stack
      • 提供Director的故障转移功能从而实现Director的高可用
      • 该组件可独立提供功能,无需LVS的支持,该组件使用独立的子进程负责,但被父进程监控
    • System Call
      • 提供读取自定义脚本的功能,该组件在使用时,将临时产生一个子进程来执行任务
    • IPVS wrapper
      • 负责将配置文件中的IPVS相关规则发送到内核的ipvs模块
    • Netlink Reflector
      • 用来设定、监控vrrp的ip地址
  • IO复用器
  • 内存管理
  • 配置文件分析器

3)工作模型

  • 主备:单虚拟路由器
  • 主主:主/备(虚拟路由器1)+ 备/主(虚拟路由器2)

3. keepalived的配置和使用

3.1 使用前的配置

  • 各节点时间要同步
  • 确保iptables和selinux不会成为阻碍
  • 确保各节点的用于集群服务的接口支持MULTICAST通信
    • 开启网卡的多播功能:ip link set multicast on dev ens33
    • D类地址:224-239(多播地址的范围)
  • 各节点之间可通过主机名互相通信(可选)
    • 节点的名称设定与hosts文件中解析的主机名都要保持一致
    • uname -n 获得的主机,与解析的主机名要相同
  • 各节点之间基于密钥认证的方式通过ssh互相通信(可选)

3.2 程序环境

  • 主程序文件

    • /usr/sbin/keepalived
  • Unit file
    • /usr/lib/systemd/system/keepalived.service
    • Unix file 的配置文件:/etc/sysconfig/keepalived
  • 配置文件
    • /etc/keepalived/keepalived.conf

3.3 配置文件概述

# 全局配置(全局配置有Global definitions和Static routes/address,全局定义和静态路由)
# GLOBAL CONFIGURATION:
global_defs # Block id
{
...
} # 配置vrrp实例(VRRP实例和VRRP同步组)
# VRRPD CONFIGURATION:
vrrp instance # 虚拟路由器,VRRP实例
vrrp_instance NAME {
...
}
vrrp synchronization group # VRRP同步组
vrrp_sync_group NAME {
...
}
# ipvs的相关配置
# LVS CONFIGURATION:
# 集群服务,服务内的RS
Virtual server groups
Virtual server #ipvs集群的vs和rs
  • 如果多个实例同进同退,那么就要把他们配置成一个同步组(高可用LVS的NAT模式时)

    • 如下图所示,当vip1在网卡1上时,vip2必须要在网卡2上,所以vip1和vip2必须同进同退
    • vip1在哪个节点上,vip2就应该在哪个节点上

3.4 配置文件详解

1)全局配置

### 全局配置 ###
global_defs { # 全局部分定义邮件报警系统,可以不用定义
    notification_email { # 定义邮件发送目标,收件人邮箱地址                
acassen@firewall.loc
failover@firewall.loc
    }
    notification_email_from hgzerowzh@qq.com # 定义发件人邮箱地址
    smtp_server 192.168.200.1 # 定义邮件发送服务器IP,本地发送写localhost
    smtp_connect_timeout 30 # 定义邮件服务器建立连接的超时时长
    router_id c7_node_03 # 标识keepalived服务器的字符串,物理节点的标识符;建议使用主机名 vrrp_skip_check_adv_addr # 如果通告与接收的上一个通告来自相同的master路由器,则不执行检查
!vrrp_strict # 严格遵守VRRP协议,这一项最好关闭(加感叹号),若不关闭,可用vip无法被ping通
vrrp_garp_interval 0.001 # 在一个接口发送的两个免费ARP之间的延迟,可以精确到毫秒级(默认是0)
    vrrp_mcast_group4 225.0.0.18 # IPV4多播地址,默认224.0.0.18,要改一改
# 可以在多播地址上抓包来看vrrp报文:tcpdump -i ens33 -nn host 224.0.0.18
}

2)vrrp实例配置

### VRRP实例配置 ###
vrrp_instance NAME {
state MASTER # 定义实例的角色状态是master还是backup,在当前VRRP实例中此节点的初始状态
interface eth0 # 定义vrrp绑定的接口,即接收或发送心跳通告的接口,即HA监测接口
virtual_router_id 51 # 虚拟路由标识(VRID),同一实例该数值必须相同,即master和backup中该值要相同
# 同一网卡上的不同vrrp实例,该值一定不能相同,取值范围为0-255,默认为51
priority 100 # 该vrrp实例中本机的keepalived的优先级,优先级最高的为master(可用范围0-255)
         # 该选项的优先级高于state选项,
# 即若state指定的是backup,但这里设置的值最高,则仍为master
advert_int 1 # 心跳信息发送和接收时间间隔,单位为秒     authentication { # 认证方式,同一实例中这个配置必须完全一样才可通过认证,只建议使用PASS认证
     auth_type PASS # 使用简单字符认证的方式
     auth_pass 1111 # 最多支持8字符,超过8字符将只取前8字符
    }     virtual_ipaddress { # 设置的VIP,当master出现故障后,VIP会故障转移到backup
     # 这些vip默认配置在interface指定的接口别名上,可使用dev选项来指定配置接口
     # 使用ip add的方式添加,若要被ifconfig查看,在IP地址后加上label即可
     192.168.200.16 label eth0:1
     192.168.200.17
     192.168.200.19/24 dev eth1
     # 格式:<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
    }     # 使用非抢占模式
    nopreempt   
         
    # 使用延迟抢占模式
    preempt_delay TIME     
}

3)定义通知脚本

  • 定义格式:可以通过notify参数来实现master和backup的切换,且可以附加执行通知脚本

    vrrp_instance {
    ...
    notify_master <STRING>|<QUOTED-STRING> # 当切换到master模式时,执行此脚本
    notify_backup <STRING>|<QUOTED-STRING> # 当切换到backup模式时,执行此脚本
    notify_fault <STRING>|<QUOTED-STRING> # 当切换到fault模式时,执行此脚本
    notify <STRING>|<QUOTED-STRING>
    }
  • 定义示例
    vrrp_instance {
    ...
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
    }
  • 脚本示例
    #!/bin/bash
    # Author: hgzerowzh
    # Description: An notify script
    #
    contact='root@localhost' notify() {
            mailsubject="$(hostname) to be $1: vip floating"
            mailbody="$(date +'%F %H:%M:%S'): vrrp transition, $(hostname) changed to be $1"
            echo $mailbody | mail -s "$mailsubject" $contact
    } case $1 in
    master)
    notify master
    exit 0
    ;;
    backup)
    notify backup
    exit 0
    ;;
    fault)
    notify fault
    exit 0
    ;;
    *)
    echo "Usage: $(basename $0) {master|backup|fault}"
    exit 1
    ;;
    esac

3.5 双主配置示例

1)配置图示

 2)配置示例

### node1:###
    vrrp_instance VI_1 {
            state MASTER
            interface eno16777736
            virtual_router_id 101
            priority 100
            advert_int 1
            authentication {
                    auth_type PASS
                    auth_pass ZPNnTQ6F
            }
            virtual_ipaddress {
                    172.16.100.9/16
            }
    }
    vrrp_instance VI_2 {
            state BACKUP
            interface eno16777736
            virtual_router_id 102
            priority 99
            advert_int 1
            authentication {
                    auth_type PASS
                    auth_pass IWyijM5Q
            }
            virtual_ipaddress {
                    172.16.100.10/16
            }
    }                                
            
### node2:###
    vrrp_instance VI_1 {
            state BACKUP
            interface eno16777736
            virtual_router_id 101
            priority 99
            advert_int 1
            authentication {
                    auth_type PASS
                    auth_pass ZPNnTQ6F
            }
            virtual_ipaddress {
                    172.16.100.9/16
            }
    }
    vrrp_instance VI_2 {
            state MASTER
            interface eno16777736
            virtual_router_id 102
            priority 100
            advert_int 1
            authentication {
                    auth_type PASS
                    auth_pass IWyijM5Q
            }
            virtual_ipaddress {
                    172.16.100.10/16
            }
    }    

4. keepalived中配置ipvs

4.1 ipvs配置语法格式

1)定义Virtual Server

virutal_server  vip  port  {  # 虚拟服务地址和端口,使用空格分隔,其中地址为VIP
       ...
} virtual_server fwmark int { # 可以使用防火墙标记来定义
        ...
}
        
### 常用的参数 ###
delay_loop <INT> # 对后端主机做检测,每隔多长时间发一次请求
lb_algo rr|wrr|lc|wlc|lblc|sh|dh # 调度算法
lb_kind NAT|DR|TUN # 集群类型
persistence_timeout <INT> # 持久连接时长
protocol TCP # 1.3.0版本之前只支持TCP
sorry_server <IPADDR> <PORT>         # 当所有的RS都挂掉,则使用这里定义的主机提供服务     

2)定义Real Server & 健康状态检测

real_server <IPADDR> <PORT>  {
    ### 常用的参数 ###
    weight <INT> # 权重
    notify_up <STRING>|<QUOTED-STRING> # 上线脚本
    notify_down <STRING>|<QUOTED-STRING> # 下线脚本
    ...     ### 健康状态检测机制(web应用层检测)
    HTTP_GET|SSL_GET
    {
         # 检测参数
         url {
                 path <STRING> # 对哪个url做检测,使用path指明url
                 status_code <INT> # 要获得什么响应码才算正确
                 digest <STRING> # 获取内容的校验码跟所期望的一样
         }
         nb_get_retry <INT> # get请求的重试次数
         delay_before_retry <INT> # 两次重试之间的时间间隔
         connect_timeout <INTEGER> # 连接超时时长,默认为5s
         warmup <INT> # 健康状态检测延迟
    }
    
    ### 传输层健康状态检测(tcp协议层)
    TCP_CHECK
    {
         # 检测参数
         connect_timeout <INTEGER> # 每次发起连接时的超时时间
         
         nb_get_retry <INT> # get请求的重试次数
         delay_before_retry <INT> # 两次重试之间的时间间隔
         connect_timeout <INTEGER> # 连接超时时长,默认为5s
         warmup <INT> # 健康状态检测延迟
         
         # 其它参数
         connect_ip <IP ADDRESS> # 向哪个地址的哪个端口做检测
         connect_port <PORT>
         bindto <IP ADDRESS> # 自己使用固定的地址当源地址发请求
         bind_port <PORT>
    }
}

4.2 keepalived + LVS(NAT)

1)主节点的配置

! Configuration File for keepalived

global_defs {
notification_email {
492540654@qq.com
2469822904@qq.com
}
notification_email_from hgzero@localhost
smtp_server localhost
smtp_connect_timeout 30
router_id c7_node_03
vrrp_skip_check_adv_addr
! vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
vrrp_mcast_group4 225.0.0.18
} vrrp_instance VI_1 {
state MASTER
interface ens37
virtual_router_id 66
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass niba
}
virtual_ipaddress {
172.168.1.99/24 # 这个虚拟ip是流动网关地址
}
} vrrp_instance VI_2 {
state MASTER
interface ens33
virtual_router_id 67
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass taba
}
virtual_ipaddress {
10.0.0.11/24 # 这个虚拟ip是外网访问的浮动ip
}
} # 将VI_1和VI_2做成一个同步组,在这个节点上,VI_1和VI_2同进退
vrrp_sync_group VG_1 {
group {
VI_1
VI_2
}
} # 虚拟服务地址和端口,使用空格分隔,其中地址为外网VIP
virtual_server 10.0.0.11 80 {
delay_loop 2 # 健康检查时间间隔
lb_algo rr # 定义负载均衡LB的算法,这里使用的是rr轮询调度算法
lb_kind NAT # lvs的模型,有NAT、DR、TUN三种
! persistence_timeout 3 # 持久会话保持时长
protocol TCP # 监控服务的协议类型,1.3.0版本之前只支持tcp,之后还支持udp real_server 172.168.1.101 80 { # 定义后端的real_server部分,地址和端口使用空格分隔
weight 1 # lvs权重
HTTP_GET { # 监控状况检查的检查方式,常见的有HTTP_GET、SSL_GET、TCP_CHECK、MISC_CHECK
url {
path / # 指定http_get健康状况检查的路径,例如检查index.html是否正常
         status_code 200
         # 健康状况需要状态码,可以是status_code、digest、或者digest+status_code
         # digest值用keepalived的genhash命令生成,一般使用status_code即可
         # curl -s http://172.168.0.6 | md5sum
         # genhash -s 172.168.0.6 -p 80 -u /index.html
}
connect_timeout 2
nb_get_retry 3
delay_before_retry 1
}
} real_server 172.168.1.102 80 {
weight 1
HTTP_GET {
url {
path /
         status_code 200
}
connect_timeout 2 # 表示3秒无响应就超时,即此realserver不健康,需重试连接
nb_get_retry 3 # 表示重试3次,3次之后都超时就是宕机,防止误伤(nb=number)
delay_before_retry 1 # 重试的时间间隔
} # 时间如果太久,应改小
}
}

2)备节点的配置

! Configuration File for keepalived

global_defs {
notification_email {
492540654@qq.com
2469822904@qq.com
}
notification_email_from hgzero@localhost
smtp_server localhost
smtp_connect_timeout 30
router_id c7_node_04
vrrp_skip_check_adv_addr
! vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
vrrp_mcast_group4 225.0.0.18 } vrrp_instance VI_1 {
state BACKUP
interface ens37
virtual_router_id 66
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass niba
}
virtual_ipaddress {
172.168.1.99/24
}
} vrrp_instance VI_2 {
state BACKUP
interface ens33
virtual_router_id 67
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass taba
}
virtual_ipaddress {
10.0.0.11/24
}
} vrrp_sync_group VG_1 {
group {
        VI_1
        VI_2
}        
} virtual_server 10.0.0.11 80 {
delay_loop 2
lb_algo rr
lb_kind NAT
! persistence_timeout 3
protocol TCP real_server 172.168.1.101 80 {
weight 1
HTTP_GET {
url {
path /
         status_code 200
}
connect_timeout 2
nb_get_retry 3
delay_before_retry 1
}
} real_server 172.168.1.102 80 {
weight 1
HTTP_GET {
url {
path /
         status_code 200
}
connect_timeout 2
nb_get_retry 3
delay_before_retry 1
}
}
}

4.3 keepalived + LVS(DR)

1)主节点的配置

! Configuration File for keepalived

global_defs {
notification_email {
492540654@qq.com
2469822904@qq.com
}
notification_email_from hgzero@localhost
smtp_server localhost
smtp_connect_timeout 30
router_id c7_node_03
vrrp_skip_check_adv_addr
! vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
vrrp_mcast_group4 225.0.0.16
} vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 66
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass niba
}
virtual_ipaddress {
10.0.0.10
}
} virtual_server 10.0.0.10 80 {
delay_loop 2
lb_algo wrr
lb_kind DR
! persistence_timeout 3
protocol TCP real_server 10.0.0.205 80 {
weight 2
HTTP_GET {
url {
path /
         status_code 200
}
connect_timeout 2
nb_get_retry 3
delay_before_retry 1
}
} real_server 10.0.0.206 80 {
weight 1
HTTP_GET {
url {
path /
         status_code 200
}
connect_timeout 2
nb_get_retry 3
delay_before_retry 1
}
}
}

2)备节点的配置

! Configuration File for keepalived

global_defs {
notification_email {
492540654@qq.com
2469822904@qq.com
}
notification_email_from hgzero@localhost
smtp_server localhost
smtp_connect_timeout 30
router_id c7_node_04
vrrp_skip_check_adv_addr
! vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
vrrp_mcast_group4 225.0.0.16
} vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 66
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass niba
}
virtual_ipaddress {
10.0.0.10
}
} virtual_server 10.0.0.10 80 {
delay_loop 2
lb_algo wrr
lb_kind DR
! persistence_timeout 3
protocol TCP real_server 10.0.0.205 80 {
weight 2
HTTP_GET {
url {
path /
         status_code 200
}
connect_timeout 2
nb_get_retry 3
delay_before_retry 1
}
} real_server 10.0.0.206 80 {
weight 1
HTTP_GET {
url {
path /
         status_code 200
}
connect_timeout 2
nb_get_retry 3
delay_before_retry 1
}
}
}

3)在DR模式中各个Real Server上的自定义脚本

  • 要在每个Real Server上执行此脚本
#!/bin/bash

vip=10.0.0.10
mask='255.255.255.255' case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig lo:0 $vip netmask $mask broadcast $vip up
route add -host $vip dev lo:0
;;
stop)
ifconfig lo:0 down
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
;;
*)
echo "Usage $(basename $0) start|stop"
exit 1
;;
esac

5. keepalived高可用nginx

5.1 keepalived高可用其他服务

1)原理

  • keepalived调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整

2)步骤

  • 定义一个脚本

    vrrp_script  <SCRIPT_NAME> {   # 脚本名,后面要基于脚本名来进行调用
            script "/script.sh" # 执行的命令或脚本
            interval INT # 每隔多少时间,这个监控脚本要执行一次
            weight -INT # 万一失败了,当前节点的权重要减去多少,一般来讲讲,减去后的值要小于备用节点
    }
  • 调用此脚本
    # 在某个vrrp的示例中去调用脚本实例
    track_script {
            SCRIPT_NAME_1
            SCRIPT_NAME_2
            ...
    }

5.2 keepalived高可用nginx

1)配置keepalived.conf文件

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
} # 如果想要调整某个keepalived主机,只需要在keepalived目录下创建一个down文件
# 通过监测这个文件的存在与否,即可将该节点权重降低,从而可以去配置调整它
# 如果不想让它降权了,就将down文件删除
vrrp_script chk_down {
# 如果这个文件存在就错误退出,否则就正常退出
    script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
# 注意,这里最好将脚本写入shell文件中,然后在这里调用shell脚本文件,注意用全路径
        interval 1
        weight -5 # 一旦上面的文件存在(错误退出),就将这个节点降权
        fall 1
        rise 1
} vrrp_script chk_nginx {
    script "killall -0 nginx && exit 0 || exit 1" # 这里killall -0表示检测nginx进程是否存在
# 注意,这里最好将脚本写入shell文件中,然后在这里调用shell脚本文件,注意用全路径
    interval 1 # 每隔一秒检测一次上面的脚本是否能成功执行
    weight -5 # 如果脚本执行失败就将权重-2
    fall 3 # 如果失败3次失败,才确认为失败
    rise 3 # 需要成功的次数,如果3次检查都成功,那么就立即将减去的权重加回去
} vrrp_instance VI_1 {
    state MASTER
    interface eno16777736
    virtual_router_id 14
    priority 100
    advert_int 1
    authentication {
            auth_type PASS
            auth_pass 571f97b2 # 如果有多个vrrp实例,这里的密码一定不能相同
    }
    vritual_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"
}

2)定义notify脚本

#!/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)
        # 当当前节点变成主节点的时候,就启用nginx服务
        systemctl start nginx.service
        notify master
        ;;
backup)
        # 当当前节点变成备用节点的时候,要启用nginx,防止备节点也被降权,导致vip没有被转移
        systemctl start nginx.service  
notify backup
        ;;
fault)
        # 当当前节点出错时,就停掉nginx服务(但是如果做nginx的双主,即使fault也不能停掉nginx)
        systemctl stop nginx.service
        notify fault
        ;;
*)
        echo "Usage: $(basename $0) { master|backup|fault}"
        exit 1
        ;;
esac

3)其他相关

# 监控关注的网络接口
    track_interface {
            IFACE_NAME_1
     IFACE_NAME_2
    } # 在nginx上配置反向代理:
    upstream websrvs {
            server 192.168.10.11:80;
            server 192.168.10.12:80;
    }
    location / {
            proxy_pass http:/websrvs;
    }

Keepalived服务详解的更多相关文章

  1. winxp计算机管理中服务详解

    winxp计算机管理中服务详解01 http://blog.sina.com.cn/s/blog_60f923b50100efy9.html http://blog.sina.com.cn/s/blo ...

  2. Android中Service(服务)详解

    http://blog.csdn.net/ryantang03/article/details/7770939 Android中Service(服务)详解 标签: serviceandroidappl ...

  3. WCF中队列服务详解

    WCF中队列服务详解 一.引言 在前面的WCF服务中,它都要求服务与客户端两端都必须启动并且运行,从而实现彼此间的交互.然而,还有相当多的情况希望一个面向服务的应用中拥有离线交互的能力.WCF通过服务 ...

  4. 【转】SSH服务详解

    [转]SSH服务详解 第1章 SSH服务 1.1 SSH服务协议说明 SSH 是 Secure Shell Protocol 的简写,由 IETF 网络工作小组(Network Working Gro ...

  5. (转)SSH服务详解

    SSH服务详解 原文:http://www.cnblogs.com/clsn/p/7711494.html 第1章 SSH服务1.1 SSH服务协议说明SSH 是 Secure Shell Proto ...

  6. HTTPD之二————HTTPD服务详解————httpd的配置文件常见设置

    HTTPD之二----HTTPD服务详解----httpd的配置文件常见设置 HTTP服务器应用 http服务器程序 httpd apache nginx lighttpd 应用程序服务器 IIS,a ...

  7. angular-ngSanitize模块-$sanitize服务详解

    本篇主要讲解angular中的$sanitize这个服务.此服务依赖于ngSanitize模块. 要学习这个服务,先要了解另一个指令: ng-bing-html. 顾名思义,ng-bind-html和 ...

  8. Java从入门到精通——数据库篇Oracle 11g服务详解

    装上Oracle之后大家都会感觉到我们的电脑慢了下来,如何提高计算机的速度呢?我们应该打开必要的服务,关闭没有用的服务.下面是Oracle服务的详解: Oracle ORCL VSS Writer S ...

  9. windows 7 系统进程服务详解

    windows 7已经发布有段时间了,相信很多网友都已经换上了传说中非常完美的win7系统.win7不仅继承而且还超越了vista的美观界面,性能优化方面也下足了功力.还拥有强大的win xp兼容性, ...

随机推荐

  1. 1 Spark概述

     第1章 Spark概述 1.1 什么是Spark Spark是一种快速.通用.可扩展的大数据分析引擎,2009年诞生于加州大学伯克利分校AMPLab,2010年开源,2013年6月成为Apache孵 ...

  2. PowerJob 在线日志饱受好评的秘诀:小但实用的分布式日志系统

    本文适合有 Java 基础知识的人群 作者:HelloGitHub-Salieri HelloGitHub 推出的<讲解开源项目>系列. 项目地址: https://github.com/ ...

  3. arduino智能循迹小车代码(三个循迹模块)

    #include <Servo.h>int leftMotor1 = 3;int leftMotor2 = 5;int rightMotor1 = 6;int rightMotor2 = ...

  4. 使用手机安装Windows系统------DriveDroid

    今天给大家推荐的软件是: DriveDroid 1.说来都是无奈,前一段时间,重装系统结果按完之后进不去系统,然后手贱又把U启动盘给弄坏了 2.本来想这下需要去找同学借个电脑了,然后就想手机可不可以啊 ...

  5. [PKUWC2018]Minimax 题解

    根据题意,若一个点有子节点,则给出权值:否则可以从子节点转移得来. 若没有子节点,则直接给出权值: 若只有一个子节点,则概率情况与该子节点完全相同: 若有两个子节点,则需要从两个子节点中进行转移. 如 ...

  6. el-dialog“闪动”解决办法

    问题描述:el-dialog关闭的时候总是出现两次弹窗 解决思路:既然是el-dialog产生的那就直接杀掉el-dialog 代码实践:在el-dialog上添加上一个v-if,值就是用闭窗的值,促 ...

  7. 不要盲目使用新技术,说的就是你,JWT!

    其实我更想聊标题的前半部分,后半部分只是拉出来做典型的. 简历上写上一句,"热衷于学习新技术",孬管是不是真的,至少加分项是可以有的. 再看看标题,我是来搞笑的? 学习与使用,两回 ...

  8. Android中_TextView属性的XML详解 包括单行显示等等。

    <pre name="code" class="html">属性名称 描述 android:autoLink 设置是否当文本为URL链接/email ...

  9. ES6--Array.prototype.fill 替换数组

    Array.prototype.fill

  10. android studio配置so和assets目录

    so配置: 1. 建立src/main/libs/armeabi目录,so文件放入armeabi目录 2.配置build.gradle android { defaultConfig{ XXXXXX ...