Nginx——Keepalived的原理与配置

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

摘要

Keepalived的作用是检测服务器的状态如果有一台web服务器宕机或工作出现故障Keepalived将检测到并将有故障的服务器从系统中剔除 同时使用其他服务器代替该服务器的工作当服务器工作正常后Keepalived自动将服务器加入到服务器群中 这些工作全部自动完成不需要人工干涉需要人工做的只是修复故障的服务器。

keepalived工作在IP/TCP协议栈的IP层TCP层及应用层工作原理基于VRRP协议。

  • 网络层(layer 3)Keepalived会定期向服务器群中的服务器发送一个ICMP的数据包既我们平时用的Ping程序, 如果发现某台服务的IP地址没有激活Keepalived便报告这台服务器失效并将它从服务器群中剔除。
  • 传输层(layer 4)Keepalived以TCP端口的状态来决定服务器工作正常与否如web server的服务端口一般是80 如果Keepalived检测到80端口没有启动则Keepalived将把这台服务器从服务器群中剔除。
  • 应用层(layer 5)只要针对应用上的一些探测方式如URL的get请求或者对nginx脚本检测等 可以根据用户自定义添加脚本针对特定的服务进行状态检测当检测结果与用户设定不一致则把这台服务器从服务器群中剔除。

一、VRRP协议与工作原理

VRRP(Virtual Router Redundancy Protocol)虚拟路由冗余协议是一种容错的主备模式的协议 当网络设备发生故障时可以不影响主机之间通信情况下进行设备切换并且相对用户时切换过程时透明的。

路由器开启VRRP功能后会根据优先级确定自己在备份组中的角色。优先级高的路由器成为主用路由器优先级低的成为备用路由器。 主用路由器拥有虚拟IP与虚拟MAC实现各种网络功能并发送VRRP通告报文通知备用路由器组内的其他路由器自己工作正常 备用路由器则启动定时器等待通告报文。抢占模式下当备用路由器收到VRRP通告报文后会将自己的优先级与通告报文中的优先级进行比较。 如果大于通告报文中的优先级则成为主用路由器否则将保持备用状态。非抢占模式下只要主用路由器不发生故障就算备用路由器的优先级再高 也始终保持备用状态。如果备用路由器的定时器超时后仍未收到主用路由器发送来的VRRP通告报文则认为主用路由器已经无法正常工作 备份组内的路由器根据优先级选举出主用路由器。

  • 一个VRRP路由器有唯一的标识VRID范围为0—255。该路由器对外表现为唯一的虚拟MAC地址地址的格式为00-00-5E-00-01-[VRID]。
  • 同一台路由器可以加入多个备份组在不同备份组中有不同的优先级使得该路由器可以在一个备份组中作为主用路由器在其他的备份组中作为备用路由器。
  • 提供了两种安全认证措施明文认证和IP头认证。

二、VRRP选举机制原理

  • 虚拟IP拥有者如果某台路由器的IP地址与虚拟路由器的VIP地址一致那么这台就会被选为主用路由器。
  • 优先级较高者如果没有虚拟IP拥有者优先级数值大的路由器会被选举出优先级范围0~255。
  • IP地址较大者如果优先级一样高IP地址数值大的路由器会被选举出。

三、keepalived配置解析

global_defs是对全局一些参数做出设置。

global_defs {
   notification_email {
   # 接受邮件地址
     sysadmin@firewall.loc
   }
   notification_email_from master@keepalived.com
   # 邮件头地址
   smtp_server 192.168.200.1
   # 邮件服务smtp地址
   smtp_connect_timeout 30
   # smtp连接超时时间
   router_id LVS_DEVEL
   # 本地机器的id可以为本地主机名
   vrrp_skip_check_adv_addr
   # 检查收到的通告中的所有地址会非常耗时设置此参数就不会检查收到过的主路由器的通告
   vrrp_strict
   # 严格遵守VRRP协议开启这个功能会在iptables中添加下面一条规则导致VIP ping不通
   # Chain INPUT (policy ACCEPT)
   # target     prot opt source               destination
   # DROP       all  --  0.0.0.0/0            172.30.100.200
   vrrp_garp_interval 0
   # 一个网卡上每组gratuitous arp消息之间的延迟时间默认为0
   vrrp_gna_interval 0
   # 一个网卡上每组na消息之间的延迟时间默认为0
   vrrp_iptables
   # 设置此项则不会开启任何iptables规则
   vrrp_mcast_group4 224.0.0.18
   # 主备间通告状态信息的组播地址通常为224网段
}

vrrp_script只是定义一个对集群服务的健康状态检测脚本 并根据监控的结果状态能实现优先动态调整这种方式在做高可用nginx或者haproxy时需要用到。

vrrp_script chk_nginx {
    script
    # 添加要定期执行的检测脚本它的退出代码将被记录在监视它的所有VRRP实例中
    interval 2
    # 两次脚本调用的间隔默认为1秒
    weight -20
    # 如果检测条件成立权重-20
}

vrrp_instance是虚拟路由实例的配置段 用来定义当前keepalived节点的运行角色为主或是备定义当前节点的优先级设置虚拟IP等信息。

vrrp_instance VI_1 {
# 定义虚拟路由器实例名称VI_1主备必须相同
    state MASTER
    # 定义此节点为MASTER
    interface eth0
    # 绑定为当前虚拟路由器使用的物理接口
    virtual_router_id 51
    # 设置虚拟路由id范围0~255主备必须相同
    priority 100
    # 设置此节点优先级
    advert_int 1
    # 设置主备节点间vrrp通告状态的时间间隔<br><br>    nopreempt
    authentication {
    # 设置主备间验证方式
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
    # 设置虚拟路由VIP
        172.30.200.1
    }
    track_script {
    # 添加监控脚本脚本名为vrrp_script中定义的脚本
        chk_nginx
    }
}

virtual_server中定义了LVS工作模式及调度算法等信息real_server则是定义后端的真实服务器。

virtual_server 172.30.200.1 80 {
# 定义虚拟主机IP与端口
    delay_loop 6
    # 健康状态检测时间间隔
    lb_algo rr
    # lvs调度算法
    lb_kind NAT
    # lvs工作类型
    persistence_timeout 50
    # lvs持久连接超时时间
    protocol TCP
    # 定义服务协议
    sorry_server 172.30.10.14 80
    # 当后端所有主机不可达时就会被定义这台主机只是为了展示sorry页面
    real_server 172.30.10.12 80 {
    # 配置后端主机
        weight 1
        # 调度权重
        HTTP_GET {
        # 应用层检测
            url {
              path /testurl/test.jsp
              # 定义被检测的URL
              status_code 200
              # 判断上述URL健康状态的响应码
              digest 640205b7b0fc66c1ea91c463fac6334d
              # 判断上述URL健康状态的内容的hash码
            }
            connect_timeout 3
            # 检测连接的超时时间
            nb_get_retry 3
            # 重试次数
            delay_before_retry 3
            # 重试前等待时间
        }
        TCP_CHECK {
             connect_ip 172.30.10.12
             # 选择要连接的IP地址。默认值为realserver IP
             connect_port 80
             # 选择要连接的端口。默认值为realserver PORT
             bindto 172.30.10.11
             # 用于发起连接的可选源地址
             bind_port 10000
             # 用于发起连接的可选源端口
             connect_timeout 3
             # 连接超时时间
        }
    }
    real_server 172.30.10.12 80 {
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

博文参考

https://keepalived.org/

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: nginx