keepalived + Nginx 实现高可用

一、高可用场景及解决方案

nginx 实现高可用的话,不能在进行以为添加服务器了,这样会导致无限循环,nginx的高可用集群需要通过keepalived 来进行实现,keepalived 他不需要独立运行在服务器上,而是切入式的,服务器上keepalived 可以互相通信。

keepalived + Nginx 实现高可用_第1张图片

二、keepalived

keepalived起初是为LVS设计的专门用来监控集群系统中各个服务节点的状态如果某个服务节点出现异常或者工作出现故障,keepalived将检测到,并将出现故障的服务节点从集群系统中剔除,而在故障节点恢复正常后,keepalived又可以自动将该服务节点重新加入集群中,这些工作全部自动完成。这部分功能类似于nginx 等反向代理的应用探活功能实现后端服务高可用。

后来又加入了VRRP的功能,VRRP(Virtual Router Redundancy Protocol),虚拟路由协议出现的目的是为了解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此keepalived一方面具有服务器状态检测和故障隔离功能,另一方面也有HA cluster功能;这个功能实现反向代理组件高可用

2.1 认识 keepalived

1 keepalived 介绍

keepalived + Nginx 实现高可用_第2张图片

keepalived 他不需要独立运行在服务器上,而是切入式的,服务器上keepalived 之间可以互相通信,keepalived 保活机制是基于服务器的存活,而非某个进程的保活,所有如果要进行对某个进程的保活操作可以通过编写脚本来进行配合keepalived 实现

2. keepalived 和 LVS 关系

LVS 是 Linux Virtual Server 的缩写 ,也就是 Linux 虚拟主机,在linux2.4 内核以后,已经完全内置了 LVS 的各个功能模块。它是工作在四层的负载均衡,类似于 Haproxy ,主要用于实现服务器基于的负载均衡。

他们都需要虚拟 IP ,思考一下,这俩东西到底是什么关系?

根据以上描述,一开始 keepalived 是 LVS 用来探活上游应用使用。后来引入了 VRRP 可以实现静态路由 (LVS)的高可用。

由此我们可以得出结论:

LVS 通过 ipvsadm 配置虚拟服务器,来实现反向代理和负载均衡功能。

Keepalived 用来帮 LVS 实现服务器探活功能。同时实现 LVS 实例的 冗余备份功能

二者使用相同的虚拟IP,且 keepalived 已经内置了 ipvsadm 的管理功能可以根据 keepalived 配置文件自动完成 lvs 配置 。

所有Keepalived 一方面具有配置管理 LVS 的功能,同时还具有对 LVS 下面节点进行健康检查的功能,另一方面实现系统网络服务的高可用功能。

keepalived 实现高可用示意图

keepalived + Nginx 实现高可用_第3张图片

3. VRRP工作原理

在显示的网络环境中,主机之间的通信都是通过配置静态路由(默认网关)完成的,而主机之间的路由器一旦出现故障,通信就会失败,因此,在这种通信模式中,路由器就成为一个单点故障,为了解决这个问题引入了 VRRP 协议;

VRRP 协议是一种主备模式的协议,通过VRRP 可以在网络发生故障时透明的进行设备切换而影响主机之间的数据通信,这其中涉及了两个概念:物理路由器和虚拟路由器

VRRP 可以将两台或多台物理路由器虚拟成一个虚拟路由(vhost vip ),这个路由器通过虚拟IP对外提供服务,而在虚拟路由器内部是多个物理路由器协同工作,同一时间只有一台物理路由器对外提供服务,这台物理服务器被称之为主路由器(处于MASTER角色)

一般情况下MASTER 由选举算法产生,他拥有对外服务器的虚拟IP ,通过各种网络功能。而其他无路由器不用有虚拟 IP,也不提供网络服务,仅仅接收 MASTER的 VRRP状态通告信息,这些路由器统称为备份路由器(处于BACKUP角色)。当主路由失效时,处于 BACKUP 角色的备份路由器将重写进行选举,产生一个新的路由器进入MASTER 角色继续提供对外服务器,整个过程对用户来说是完全透明的。

每个虚拟路由器都是有一个唯一的标识,成为 VRID一个VRID与一组IP地址构成一个虚拟路由器。在VRRP协议中,所有的报文都是通过 IP 多播模式发送的,而在一个虚拟路由器中,只有MASTER角色的路由器会一直发送VRRP数据包,BACKUP角色的路由器只接收MASTER 发送过来的报文信息,用来监控 MASTER 运行状态,因此不会发生 BACKUP 抢占的信息,除非他的优先级更高。而当MASTER不可用时,BACKUP也就无法收到MASTER发送过来的报文信息,于是认为MASTER 出现故障,接着多台BACKUP就会进行选举,优先级更高的BACKUP将会成为新的MASTER;

4. keepalived 的体系结构

keepalived 的体系结构整体上分为两层,即用户空间层和内核空间层

keepalived + Nginx 实现高可用_第4张图片

内核空间层包括 IPVSNETLINK 两个模块 :

IPVS模块是keepalived 引入的一个第三方模块,通过 IPVS可以实现基于 IP的负载均衡集群,而IPVS默认包含在LVS集群软件中,keepalived 最初就是为 LVS 提供服务的,由于 keepalived 可以实现对集群节点的状态检测,而IPVS可以实现负载均衡功能,隐藏,keepalived 建筑与第三方模块IPVS 就可以很方便的代建一套负载均衡集群,但是不是说keepalived 就是一个负载均衡软件。 NETLINK模块 主要用于实现一些高级路由框架和一些相关的网络功能,完成用户空间层 Netlink Reflector 模块发出的各种网络请求。

在用户空间层,keepalived 又分为四个部分:

  • Scheduler I/O Multiplexer: 一个 I/O复用分发调度器,他负责安排 keepalived所有内部的任务请求;

  • Memory Management :一个内存管理机制,这个框架提供了访问内存的一些通用访问;

  • Control Plane Keepalived 的控制面板,可以实现对配置进行编译和解析 (keepalived 的配置文件不是一次解析所有模块的配置,而是只有在用到某个模块时才会解析对应的配置 )

  • Core components:keepalived 的核心组件,包含了一系列的功能模块,主要有 WatchDog,Checkers、VRRP、stack 、IPVS warpper 和 Netlink Reflector ;

部分核心模块实现功能介绍:

WatchDog:针对被监视的目标设置一个计时器的阀值,WacthDog 会自己增加此计数值,然后等待被监视的目标周期性和重置该计数器。一旦被监控目标发现错误,就无法重置该计数器,WatchDog 就会检测到,于是采取对应的恢复措施,例如重启或关闭;keepalived 正式通过 WatchDog的运行机制来监控 Checkers 和 VRRP进程的;

Checkers :keepalived的最基础功能,也是最主要的功能,可实现对服务器运行状态检测和故障隔离

VRRP Stack:可以实现 HA集群中失效切换(Failover)功能,keepalived 通过 VRRP 功能结合 LVS 负载均衡软件即可部署一个高性能的负载均衡集群。

IPV S warpper :这是IPVS 功能的一个实现。IPVS wrapper 模块可以将设置好的IPVS 规则发送到内核空间并提交给 IPVS 模块最终实现 IPVS 模块的负载均衡功能;

Netlink Reflector :用来实现高可用集群中Failover 时虚拟IP的设置和切换,它的所有请求最后都发送内核空间的 NETLINK 模块来完成;

MASTER 和 BACKUP 角色选举策略

不使用 vrrp_script时:在keepalived集群中,其实并没有严格意义上的主备节点,虽然可以在配置文件中设置MASTER状态,但是这并不意味着此节点一直就是MASTER状态。控制节点角色的是配置文件中priority 值 ,但它并不控制所有节点的角色,另一个能改变角色的是在vrrp_script模块中设置的weight 值,一个节点在集群中的角色就是通过这两个值的大小决定的;在vrrp_script模块中,如果不设置weight的值,那么集群优先级的选择将有配置文件中的priority值决定。

使用 vrrp_script模块

weigth值为正数时在vrrp_script 指定的脚本如果检测成功,那么MASTER 节点的权值将是weight值和priority 值之和;如果检测失败,那么MASTER节点的权值保持为priority值,因此,切换策略为:

MASTER节点vrrp_script 脚本检测失败时,如果MASTER节点priority值小于BACKUP节点weight值与priority值之和,将发生主备切换;MASTER节点vrrp_script脚本检测成功时,如果MASTER节点weight值与priority之和大于BACKUP节点weight值与priority值之和,主节点依然为主节点,不发生切换;

weight值为负数时

在vrrp_script 中指定的脚本如果检测成功,那么MASTER节点的权值仍是priority值;如果检测失败,那么MASTER节点的权值将是priority值与weight值之差,隐藏,切换策略为:

MASTER节点vrrp_script 脚本检测失败时,如果MASTER节点priority值与weight值之差小于BACKUP节点priority值,将发生主备切换;

MASTER节点vrrp_script脚本检测成功时,如果MASTER节点priority值大于BACKUP节点priority值时,主节点依然为主节点,不发生切换。

5. keepalived 的保活机制

keepalived 的保活机制的通过 ip 飘逸进行实现,也就是会有一个 vhost ip 也就是 vip ,如果使用时一个真实ip 那么在网络分区会可能出现冲突问题,就是两个不同的机柜之间,会通信的问题,如果更换真实ip 那么就会导致ip 冲突问题 。

keepalived 的实现,不是真实ip的切换,而是虚拟出一个ip ,这个ip 不固定在某台服务器上,会先确定一个master 服务器上,当用户访问时会访问这个 虚拟ip 。因为一个网卡是可以配置多个ip的,一台服务器可以有多个网卡的。

keepalived 之间会互相通信,当 backup 和 master 主机通信是发现ping不通,则会将虚拟ip 飘逸到 backup 保证服务器正常访问操作,并且 master 重新上线之后则会变成 backup 进行待命操作 。

2.2 keepalived 的配置文件

keepalived只有一个配置文件keepalived.conf,里面主要包括以下几个配置区域,分别是global_defs(全局定义块)、vrrp_sync_group、vrrp_instance和virtual_server。

1 global_defs

  1. email 通知。作用:有故障,发送邮件报警。

  1. Lvs 负载均衡器标识(lvs_id)。在一个网络内,它应该是唯一的。

  1. 花括号 "{}" 。用来分隔定义 ,隐藏必须成对出现。如果写漏了,keepalived 运行时,不会得到预期的结果。由于定义块内存在嵌套关系,因此很容易遗漏结尾处的花括号,这个点需要注意。

global_defs {            
   notification_email {  #指定keepalived在发生切换时需要发送email到的对象,一行一个
    [email protected]
   }
   notification_email_from [email protected] #指定发件人
   smtp_server localhost #指定smtp服务器地址
   smtp_connect_timeout 30 #指定smtp连接超时时间 (Simple Network Management Protocol)
   router_id LVS_DEVEL #运行keepalived机器的一个标识 主机标识,用于邮件通知
}

2 vrrp_sync_group

vrrp_sync_group 作用:确定失败切换(FailOver)包含的路由实例个数。即在有2个负载均衡的场景,一旦某个负载均衡器失效,需要自动切换到另一个负载均衡器的实例哪些?实例组group {} 至少包含一个vrrp 实例 。

vrrp_sync_group VG_1{ # 监控多个网段的实例 
  group {
    VI_1 # 实例名
    VI_2 
    ...... 
  }

  notify_master /path/xx.sh # 指定当前切换到 master时,执行的脚本 
  netify_backup /path/xx.sh # 指定当前切换 backup ,指定的脚本 
  notify_fault "path/xx.sh VG_1" # 故障时执行的脚本 
  notify /path/xx.sh 
  smtp_alert # 使用 global_defs 中提供的邮件地址和smtp 服务器发送邮件通知
  
} 

3 vrrp_instance

vrrp_instance,实例名出自实例组group 所包含的哪些名字 。

VRRP实例段主要用来配置节点角色(主从),实例绑定端口,节点间验证机制,集群服务IP

vrrp_instance:是VRRP实例的标识,后跟VRRP实例名称;


vrrp_script chk_nginx {
      # script:自己写的监测脚本。
  script "/usr/local/keepalived-1.3.4/nginx_check.sh"
      #  interval 2:每2s监测一次
  interval 2
      #  weight -20:监测失败,则相应的vrrp_instance的优先级会减少20个点
  weight -20

} 

vrrp_instance VI_1 {
  state BACKUP #指定那个为master,那个为 backup,如果设置了nopreempt 这个值不起作用,主备priority 决定
    
  interface eth0  # 设置实例绑定的网卡
  dont_track_primary # 忽略vrrp的interface 错误(默认不设置)
  track_interface {  # 设置额外的监控,里面那个网卡出现问题都会切换 
    eth0
    eth1 
  }
  mcast_src_ip # 发送多播包的地址,如果不设置默认使用绑定网口的primary ip 
  garp_master_delay # 在切换到master 状态后,延迟进行gratuitous ARP 请求 
  virtual_router_id 50 # VPID 标记 
  priority 99 # 优先级,高优先级竞选为master
  advert_int 1 #检测间隔,,默认 1秒 
  nopreempt # 设置为不抢占 注:这个配置只能在backup主机上,而且这个主机优先级要比另外一台高
  preempt_delay # 抢占延时,默认5分钟
  debug # bebug级别 
  authentication { # 设置认知
    auth_type PASS # 认证方式 
    auth_pass 1111 # 认证密码 
  }
  virtual_ipaddress { #设置 vip 也就是虚拟ip
    192.168.101.130 
  }
}

4 virtual_server 定义块

虚拟服务器 virtual_server定义块,虚拟服务器定义是 keepalived 框架最重要的一个项目了,是keepalived.conf 必不可少的部分。该部分是用来管理LVS的,是实现keepalived 和 LVS 相结合的模块。ipvsadm命令可以实现的管理在这里都可以通过参数配置实现,注意 real_server 是被包含在 viyual_server 模块中的,是子模块 。

LVS配置段以virtual_server为开始标识,此段分为两部分:real_server段和健康检测段。

# :设置虚拟服务器开始的标识,后跟虚拟IP地址空格符服务端口;
virtual_server 192.168.101.130 23 {  # VIP 地址,要和 vrrp_instance模块中 virtual_ipaddress 地址一致

  delay loop 6 #健康检查时间间隔
  lb_algo rr # lvs调度算法 rr | wrr | lc | wlc | lblc | sh | dh 
  lb_kind DR # 负载均衡转发规则 NAT | DR | RUN 
  persistence_timeout 5 #会话保持时间 
  protocol TCP # 使用的协议 
  persistence_granularity  # lvs 会话保持粒度 
  virtualhost  # 检测的web服务器的虚拟主机 (host:头)
  sorry_server  # 备用机,所有realserver失效后启用
    # real_server段开始的标识,用来指定real server节点,后跟real server的真实IP地址和端口(有空格)
    real_server 192.168.101.128 23 { # RS的真实IP地址
    weigth 1 # 默认为 1,0
    inhibit_on_failure #在服务器健康检测失效时,将其设为0 ,而不是直接从 ipvs 中删除 
    notify_up  |  # 在检测到 server up 后执行脚本 
    notify_down  |  # 在检测到server down 后执行脚本 

    TCP_CHECK { # 常用
      connect_timeout 3 # 连接超时时间 
      nb_get_retry 3 # 重连次数 
      delay_before_retry 3 # 重连间隔时间 
      connect_port 23 # 健康检查的端口的端口 
      bindto 
    }
    # 再通过HTTP_GET/SSL_GET做健康检测时,指定的web服务器的虚拟主机地址;
    HTTP_GET | SSL_GET { # 不常用,这两个二选一

      url{ # 检测url,可以指定多个
        path / 
        digest  #检查后的摘要信息
        status_code 200 #检查的返回状态码
      }
      connect_port 
      bindto 
      connect_timeout 5 
      nb_get_retry 3 
      delay_before_retry 2 
    }

    SMTP_CHECK{ # 不常用
      host{
        connect_ip 
        connect_port  # 默认检查25端口
        bindto 
      }
      connect_timeout 5 
      retry 3 
      delay_before_retry 2 
      helo_name  |  # smtp helo 请求命令参数 ,可选 
    }

    MISC_CHECK{ # 不常用
      misc_path  |  # 外部脚本路径
      misc_timeout # 脚本执行超时时间
      misc_dynamic # 如设置该项,则退出状态码会用来动态调整服务器的权重,返回 0 正常 , 不修改; 返回1, 
      # 检查失败,权重改为0 ,返回2-255,正常,权重设置为:返回状态码 -2 
    }
  }
}

5 生产环境配置文件实例

 [root@LB2 ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
        notification_email {
                [email protected]
        }
        notification_email_from [email protected]
                smtp_server 10.0.0.1
                smtp_connect_timeout 30
                router_id LVS_2
}

vrrp_instance VI_1 {
        state BACKUP
                interface eth0
                virtual_router_id 55
                priority 100
                advert_int 1
                authentication {
                        auth_type PASS
                                auth_pass 1111
                }
        virtual_ipaddress {
                192.168.220.110/24
        }


virtual_server 192.168.220.110 80 {
        delay_loop 6
        lb_algo wrr
        lb_kind DR
        nat_mask 255.255.255.0
        persistence_timeout 300
        protocol TCP
}

real_server 192.168.220.129 80 {
        weight 1
        TCP_CHECK {
                        connect_timeout 8
                        nb_get_retry 3
                        delay_before_retry 3
                        connect_port 80
                }
}


real_server 192.168.220.138 80 {
        weight 1
        TCP_CHECK {
                        connect_timeout 8
                        nb_get_retry 3
                        delay_before_retry 3
                        connect_port 80
                }
}
}
[root@LB2 ~]# 

6 整体配置文件

[root@localhost ~]# cat /usr/local/keepalived/etc/keepalived/keepalived.conf
! Configuration File for keepalived
 
global_defs {                    #全局配置
    notification_email {        #指定keepalived在发生切换时需要发送email到的对象,一行一个
        [email protected]    #指定收件人邮箱
        [email protected]
        [email protected]
    }
    notification_email_from [email protected] #指定发件人
    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_sync_group VG_1{                #监控多个网段的实例
    group {
        inside_network                #实例名
        outside_network
    }
    notify_master /path/xx.sh        #指定当切换到master时,执行的脚本
    netify_backup /path/xx.sh        #指定当切换到backup时,执行的脚本
    notify_fault "path/xx.sh VG_1"     #故障时执行的脚本
    notify /path/xx.sh
    smtp_alert                         #使用global_defs中提供的邮件地址和smtp服务器发送邮件通知
}
 
vrrp_instance inside_network {
    state BACKUP             #指定那个为master,那个为backup,如果设置了nopreempt这个值不起作用,主备考priority决定
    interface eth0             #设置实例绑定的网卡
    dont_track_primary         #忽略vrrp的interface错误(默认不设置)
    track_interface{         #设置额外的监控,里面那个网卡出现问题都会切换
        eth0
        eth1
    }
    mcast_src_ip            #发送多播包的地址,如果不设置默认使用绑定网卡的primary ip
    garp_master_delay        #在切换到master状态后,延迟进行gratuitous ARP请求
    virtual_router_id 50    #VPID标记
    priority 99                #优先级,高优先级竞选为master
    advert_int 1            #检查间隔,默认1秒
    nopreempt                #设置为不抢占 注:这个配置只能设置在backup主机上,而且这个主机优先级要比另外一台高
    preempt_delay            #抢占延时,默认5分钟
    debug                    #debug级别
    authentication {        #设置认证
        auth_type PASS        #认证方式,类型主要有PASS、AH 两种
        auth_pass 111111    #认证密码
    }
    virtual_ipaddress {        #设置vip
        192.168.36.200
    }
}
 
vrrp_instance VI_1 {        #虚拟路由的标识符
    state MASTER            #状态只有MASTER和BACKUP两种,并且要大写,MASTER为工作状态,BACKUP是备用状态
    interface eth0            #通信所使用的网络接口
    lvs_sync_daemon_inteface eth0  #这个默认没有,相当于心跳线接口,DR模式用的和上面的接口一样,也可以用机器上的其他网卡eth1,用来防止脑裂。
    virtual_router_id 51    #虚拟路由的ID号,是虚拟路由MAC的最后一位地址
    priority 100            #此节点的优先级,主节点的优先级需要比其他节点高
    advert_int 1            #通告的间隔时间
    nopreempt                #设置为不抢占 注:这个配置只能设置在backup主机上,而且这个主机优先级要比另外一台高
    preempt_delay            #抢占延时,默认5分钟
    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
    persistence_granularity  #lvs会话保持粒度
 
    real_server 192.168.201.100 443 { #真实服务器,包括IP和端口号
        weight 1                    #默认为1,0为失效
        inhibit_on_failure            #在服务器健康检查失效时,将其设为0,而不是直接从ipvs中删除
        notify_up  |  #在检测到server up后执行脚本
        notify_down  |  #在检测到server down后执行脚本
 
        TCP_CHECK {                    #通过tcpcheck判断RealServer的健康状态
            connect_timeout 3        #连接超时时间
            nb_get_retry 3            #重连次数
            delay_before_retry 3    #重连间隔时间
            connect_port 23            健康检查的端口的端口
            bindto   
        }
           
        HTTP_GET | SSL_GET {        #健康检测方式,可选有 SSL_GET、TCP_CHECK、HTTP_GET
            url {                    #检查url,可以指定多个
              path /                #检查的url路径
              digest ff20ad2481f97b1754ef3e12ecd3a9cc  #需要检查到的内容。检查后的摘要信息。
              status_code 200        #检查的返回状态码
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3        #连接超时时间
            nb_get_retry 3            #检测尝试几次
            delay_before_retry 3    #检测的时间间隔
        }
    }
}

2.3 keepalived 安装

官网 : https://www.keepalived.org/download.html#

    • 安装

可以将文件先拷贝到 /tools目录

通过 ./configure --prefix==/usr/localo/keepalived --sysconf=/etc 执行安装,并指定安装路径。

如遇报错提示

configure: error:
!!! OpenSSL is not properly installed on your system. !!!
!!! Can not include OpenSSL headers files. !!!

需要安装

yum install openssl-devel

如果出现错误提示

*** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.

需要安装

  yum -y install libnl libnl-devel

最后需要进行编译

 make && make install  

还可以通过 yum 的方式安装 yum install keepalived ,如果是 yum 安装,配置文件在 /etc/keepalived/keepalived.conf

    • 配置

注意:需要将多台keepalived的服务器组成一个集群的话,需要他们的实例名进行统一。

keepalived 主要是检测进程是否存在,它不会检测nginx的服务器,而是检测整个服务器是否存活的状态,高级的用法可以写一个sh 脚本进行检测 nginx的存活状态,当nginx宕机之后,将整个服务器进行关闭即可。

keepalived是主机级别或者说进程级别的检查,都可以通过上述方法实现,socket 是操作系统最底层的。

    • master
! Configuration File for keepalived

global_defs {

   smtp_server localhost
   smtp_connect_timeout 30
   router_id LSV2
   vrrp_skip_check_adv_addr
   vrrp_garp_interval 0
   vrrp_gna_interval 0

}
# 检测存活脚本 
vrrp_script nginx_check {
    script "/script_file/nginx_check.sh"
    interval 1
}

vrrp_instance TEST_Nginx {
    state MASTER
    interface ens33
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.101.130 
    }
    track_script {
        nginx_check
    }
    
    notify_master /script_file/master.sh
    notify_backup /script_file/backup.sh
    notify_fault /script_file/fault.sh
    notify_stop /script_file/stop.sh
}

    • salve
! Configuration File for keepalived

global_defs {

   smtp_server localhost
   smtp_connect_timeout 30
   router_id LSV1
   vrrp_skip_check_adv_addr
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

# 检测存活脚本 
vrrp_script nginx_check {
    script "/script_file/nginx_check.sh"
    interval 1
}

vrrp_instance TEST_Nginx {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.101.130 
    }
    
        track_script {
            nginx_check
    }
    
    notify_master /script_file/master.sh
    notify_backup /script_file/backup.sh
    notify_fault /script_file/fault.sh
    notify_stop /script_file/stop.sh
}

    • 编写脚本

    • 日志脚本

首先我们将所有的脚本放到一个文件夹中 script_file

这个脚本将 Keepalived 日志脚本(将每次工作过程输出到日志上)

cd /script_file
cat master.sh
ip=$(hostname -I | awk '{print $1}')
dt=$(date+'%Y%m%d %H:%M:%S')
echo"$0--${ip}--${dt}">> /tmp/kp.log


cat backup.sh
ip=$(hostname -I | awk '{print $1}')
dt=$(date+'%Y%m%d %H:%M:%S')
echo"$0--${ip}--${dt}">> /tmp/kp.log


cat fault.sh
ip=$(ip addr|grep inet| grep 192.168 |awk '{print $2}')
dt=$(date +'%Y%m%d %H:%M:%S')
echo"$0--${ip}--${dt}">> /tmp/kp.log


cat stop.sh
ip=$(ip addr|grep inet| grep 192.168| awk '{print $2}')
dt=$(date +'%Y%m%d %H:%M:%S')
echo"$0--${ip}--${dt}">> /tmp/kp.log
    • 检查nginx脚本
cat nginx_check.sh
#!/bin/bash
result=`pidof nginx`
if [ ! -z "${result}" ];
then
  exit 0
else
  exit 1
fi
[root@server1 ~]# cat /usr/local/sbin/check_ng.sh
#!/bin/bash
#时间变量,用于记录日志
d=`date --date today +%Y%m%d_%H:%M:%S`
#计算nginx进程数量
n=`ps -C nginx --no-heading|wc -l`
#如果进程为0,则启动nginx,并且再次检测nginx进程数量,
#如果还为0,说明nginx无法启动,此时需要关闭keepalived
if [ $n -eq "0" ]; then
/etc/init.d/nginx start
n2=`ps -C nginx --no-heading|wc -l`
if [ $n2 -eq "0" ]; then
echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log

编写完脚本后我们对这些脚本加 x 权限,并启动 Keepalived

cd /script_file/ && chmod +x *.sh
systemctl restart keepalived.service

你可能感兴趣的:(nginx,运维,服务器)