Nginx R31 doc-18-High Availabili

2024-05-28  本文已影响0人  老马啸西风2020

前言

大家好,我是老马。很高兴遇到你。

我们为 java 开发者实现了 java 版本的 nginx

https://github.com/houbb/nginx4j

如果你想知道 servlet 如何处理的,可以参考我的另一个项目:

手写从零实现简易版 tomcat minicat

手写 nginx 系列

如果你对 nginx 原理感兴趣,可以阅读:

从零手写实现 nginx-01-为什么不能有 java 版本的 nginx?

从零手写实现 nginx-02-nginx 的核心能力

从零手写实现 nginx-03-nginx 基于 Netty 实现

从零手写实现 nginx-04-基于 netty http 出入参优化处理

从零手写实现 nginx-05-MIME类型(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展类型)

从零手写实现 nginx-06-文件夹自动索引

从零手写实现 nginx-07-大文件下载

从零手写实现 nginx-08-范围查询

从零手写实现 nginx-09-文件压缩

从零手写实现 nginx-10-sendfile 零拷贝

从零手写实现 nginx-11-file+range 合并

从零手写实现 nginx-12-keep-alive 连接复用

在本地部署中为NGINX Plus启用高可用性支持

在本地部署中启用NGINX Plus实例的高可用性,配置基于keepalived和VRRP的主备对解决方案。

本文介绍了如何使用基于keepalived的解决方案配置NGINX Plus实例的高可用性。

基于keepalived的高可用性支持

NGINX Plus R6及更高版本支持基于keepalived的高可用性(HA)设置,可快速且轻松地配置成主备对。

keepalived开源项目包括三个组件:

VRRP确保始终存在主节点。备用节点会监听来自主节点的VRRP广告包。如果备用节点在三倍于配置的广告间隔的时间内未收到广告包,则备用节点将接管主节点的角色,并将配置的VIP分配给自己。

如果主节点上的服务未通过配置的健康检查的次数检查到故障,keepalived将将虚拟IP地址从主节点重新分配给备用(被动)节点。

配置高可用性

在两个节点上以root用户身份运行nginx-ha-setup脚本(该脚本在nginx-ha-keepalived软件包中分发,必须额外安装除基本NGINX Plus软件包外)。该脚本将配置一个高可用性的NGINX Plus环境,其中一个节点作为主节点,另一个节点作为备用节点。它会提示输入以下数据:

global_defs {
    vrrp_version 3
}

vrrp_script chk_manual_failover {
    script   "/usr/libexec/keepalived/nginx-ha-manual-failover"
    interval 10
    weight   50
}

vrrp_script chk_nginx_service {
    script   "/usr/libexec/keepalived/nginx-ha-check"
    interval 3
    weight   50
}

vrrp_instance VI_1 {
    interface                  eth0
    priority                   101
    virtual_router_id          51
    advert_int                 1
    accept
    garp_master_refresh        5
    garp_master_refresh_repeat 1
    unicast_src_ip             192.168.100.100

    unicast_peer {
        192.168.100.101
    }

    virtual_ipaddress {
        192.168.100.150
    }

    track_script {
        chk_nginx_service
        chk_manual_failover
    }

    notify "/usr/libexec/keepalived/nginx-ha-notify"
}

要描述整个配置超出了本文的范围,但值得注意的一些项目包括:

障时生成syslog消息(或其他通知)。

使用健康检查脚本控制哪台服务器是主服务器

keepalived中没有fencing机制。如果对在一对中的两个节点都不了解,则每个节点都会假定自己是主节点并将VIP分配给自己。为了防止这种情况发生,配置文件定义了一种称为chk_nginx_service的脚本执行机制,该机制定期运行脚本以检查NGINX Plus是否正常运行,并根据脚本的返回代码调整本地节点的优先级。代码0(零)表示正确操作,代码1(或任何非零代码)表示错误。

在脚本样本配置中,将weight指令设置为50,这意味着当检查脚本成功运行(并且暗示返回代码为0)时:

interval指令指定了检查脚本执行的频率,单位为秒(在示例配置文件中为3秒)。请注意,如果达到超时(默认情况下,超时与检查间隔相同),则检查失败。

rise和fall指令(在示例配置文件中未使用)指定了脚本必须成功或失败多少次才能采取行动。

nginx-ha-keepalived软件包中提供的nginx-ha-check脚本检查NGINX Plus是否正常运行。我们建议根据您的本地设置创建适当的附加脚本。

显示节点状态

要查看给定VIP的当前主节点是哪个节点,请对在其中定义VRRP实例的接口运行ip addr show命令(在以下命令中,在centos7-1和centos7-2节点上的eth0接口):

centos7-1 $ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state
     UP qlen 1000
    link/ether 52:54:00:33:a5:a5 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.100/24 brd 192.168.122.255 scope global dynamic eth0
       valid_lft 3071sec preferred_lft 3071sec
    inet 192.168.100.150/32 scope global eth0
       valid_lft forever preferred_lft forever
centos7-2 $ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state
     UP qlen 1000
    link/ether 52:54:00:33:a5:87 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.101/24 brd 192.168.122.255 scope global eth0
       valid_lft forever preferred_lft forever

在此输出中,centos7-1的第二个inet行表示它是主节点 - 定义的VIP(192.168.100.150)已分配给它。其他inet行显示了主节点的真实IP地址(192.168.100.100)和备用节点的IP地址(192.168.100.101)。

节点的当前状态记录在本地/var/run/nginx-ha-keepalived.state文件中。您可以使用cat命令显示它:

centos7-1 $ cat /var/run/nginx-ha-keepalived.state
STATE=MASTER
centos7-2 $ cat /var/run/nginx-ha-keepalived.state
STATE=BACKUP

在nginx-ha-keepalived软件包的1.1及更高版本中,可以使用以下命令将VRRP扩展统计信息和数据转储到文件系统:

centos7-1 $ service keepalived dump

此命令向运行的keepalived进程发送信号,以将当前状态写入/tmp/keepalived.stats和/tmp/keepalived.data。

强制状态更改

要强制主节点成为备用节点,请在主节点上运行以下命令:

service keepalived stop

随着其关闭,keepalived会向备用节点发送优先级为0的VRRP数据包,这会导致备用节点接管VIP。

如果您的集群使用nginx-ha-keepalived软件包的版本1.1,则可以使用以下更简单的方法来强制状态更改:

touch /var/run/keepalived-manual-failover

此命令将创建一个文件,该文件由vrrp_script chk_manual_failover块中定义的脚本检查。如果文件存在,则keepalived会降低主节点的优先级,从而导致备用节点接管VIP。

添加更多虚拟IP地址

由nginx-ha-setup脚本创建的配置非常基本,并且使单个IP地址具有高可用性。

要使多个IP地址具有高可用性:

将每个新的IP地址添加到两个节点上的/etc/keepalived/keepalived.conf文件中的virtual_ipaddress块中:

virtual_ipaddress {
    192.168.100.150
    192.168.100.200
}

virtual_ipaddress块中的语法复制了ip实用程序的语法。

在两个节点上运行service keepalived reload命令以重新加载keepalived服务:

centos7-1 $ service keepalived reload
centos7-2 $ service keepalived reload

IPv4和IPv6的双栈配置

在keepalived版本1.2.20及更高版本(以及nginx-ha-keepalived软件包的版本1.1及更高版本)中,keepalived不再支持在一个VRRP实例(virtual_ipaddress块)中混合使用IPv4和IPv6地址,因为这违反了VRRP标准。

有两种配置双栈HA与VRRP:

vrrp_instance VI_1 {
    ...
    virtual_ipaddress_excluded {
        1234:5678:9abc:def::1
    }
    ...
}

这些地址从VRRP广告中排除,但仍由keepalived管理,并在状态更改时添加或删除。

主节点上的IPv6地址的VRRP配置为:

vrrp_instance VI_2 {
    ...
    virtual_ipaddress {
        1234:5678:9abc:def::1
    }
    ...
}

请注意,VRRP实例可以同时使用相同的virtual_router_id,因为VRRP IPv4和IPv6实例完全独立于彼此。

故障排除keepalived和VRRP

keepalived守护程序使用syslog工具进行记录。在基于CentOS、RHEL和SLES的系统中,输出通常写入到/var/log/messages中,而在基于Ubuntu和Debian的系统中,它写入到/var/log/syslog中。日志条目记录了事件,如keepalived守护程序的启动和状态转换。

以下是一些示例条目,显示了keepalived守护程序的启动和节点将VRRP实例转换为主状态(为了便于阅读,每行中的centos7-1主机名已在第一次出现后被删除):

Feb 27 14:42:04 centos7-1 systemd: Starting LVS and VRRP High Availability Monitor...
Feb 27 14:42:04 Keepalived [19242]: Starting Keepalived v1.2.15 (02/26,2015)
Feb 27 14:42:04 Keepalived [19243]: Starting VRRP child process, pid=19244
Feb 27 14:42:04 Keepalived_vrrp [19244]: Registering Kernel netlink reflector
Feb 27 14:42:04 Keepalived_vrrp [19244]: Registering Kernel netlink command channel
Feb 27 14:42:04 Keepalived_vrrp [19244]: Registering gratuitous ARP shared channel
Feb 27 14:42:05 systemd: Started LVS and VRRP High Availability Monitor.
Feb 27 14:42:05 Keepalived_vrrp [19244]: Opening file '/etc/keepalived/keepalived.conf '.
Feb 27 14:42:05 Keepalived_vrrp [19244]: Truncating auth_pass to 8 characters
Feb 27 14:42:05 Keepalived_vrrp [19244]: Configuration is using: 64631 Bytes
Feb 27 14:42:05 Keepalived_vrrp [19244

]: Using LinkWatch kernel netlink reflector...
Feb 27 14:42:05 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) Entering BACKUP STATE
Feb 27 14:42:05 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) forcing a new MASTER election
Feb 27 14:42:06 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) Transition to MASTER STATE
Feb 27 14:42:08 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) Entering MASTER STATE
Feb 27 14:42:08 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) setting protocol VIPs.
Feb 27 14:42:08 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.100.150

如果系统日志未说明问题的来源,则可以使用tcpdump命令运行以下参数来显示本地网络上发送的VRRP广告:

tcpdump -vvv -ni eth0 proto vrrp

如果您在本地网络上有多个VRRP实例,并且想要过滤输出以仅包含对特定服务的节点和其对等方之间的流量,请包含host参数,并在keepalived.conf文件中的unicast_peer块中定义对等方的IP地址,如以下示例所示:

centos7-1 $ tcpdump -vvv -ni eth0 proto vrrp and host 192.168.100.101

以上是一些有用的调试信息。

上一篇下一篇

猜你喜欢

热点阅读