Nginx R31 doc-18-High Availability Support for NGINX Plus in On-Premises Deployments

前言

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

我们为 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开源项目包括三个组件:

  • 用于Linux服务器的keepalived守护进程。

  • 用于管理虚拟路由器(虚拟IP地址或VIP)的虚拟路由器冗余协议(VRRP)的实现。

  • 用于确定服务(例如Web服务器、PHP后端或数据库服务器)是否处于运行状态的健康检查机制。

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

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

配置高可用性

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

  • 本地和远程节点的IP地址(其中一个将被配置为主节点,另一个将被配置为备用节点)
  • 用作集群终端点(浮动VIP)的一个额外的可用IP地址
    keepalived守护程序的配置记录在/etc/keepalived/keepalived.conf文件中。该文件中的配置块控制通知设置、要管理的VIP和用于测试依赖于VIP的服务的健康检查。以下是在CentOS 7机器上由nginx-ha-setup脚本创建的配置文件。请注意,这不是一个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"
}

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

  • HA设置中的每个节点都需要其自己的配置文件副本,具有适合节点角色(主要或备用)的优先级、unicast_src_ip和unicast_peer指令的值。
  • 优先级指令控制哪个主机成为主节点,下一节将进行解释。
  • 通知指令命名了分发中包含的通知脚本,该脚本可用于在发生状态转换或故

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

  • vrrp_instance VI_1块中的virtual_router_id指令的值是一个示例值;根据需要更改它以在您的环境中保持唯一。
  • 如果您在本地网络中运行多个keepalived实例(或其他VRRP实例),请为每个实例创建一个vrrp_instance块,并使用唯一名称(例如示例中的VI_1)和virtual_router_id编号。

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

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

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

  • 第一个节点的优先级(其基本优先级为101)设置为151。
  • 第二个节点的优先级(其基本优先级为100)设置为150。
    第一个节点具有更高的优先级(在此示例中为151)并成为主节点。

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:

  • 将virtual_ipaddress_excluded块添加到一个族的地址中。
vrrp_instance VI_1 {
    ...
    virtual_ipaddress_excluded {
        1234:5678:9abc:def::1
    }
    ...
}

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

  • 为IPv6地址添加另一个VRRP实例。

主节点上的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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,928评论 6 509
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,748评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,282评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,065评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,101评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,855评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,521评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,414评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,931评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,053评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,191评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,873评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,529评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,074评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,188评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,491评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,173评论 2 357

推荐阅读更多精彩内容