使用NGINX Plus缓存集群实现共享缓存(第2部分)

NGINX | 2017年2月09日

编者:本文是高容量、高可用性缓存系列文章的第2部分:

如何使用NGINX或NGINX Plus构建大容量、高可用的缓存集群?本文介绍如何使用两台或更多NGINX或NGINX Plus缓存服务器创建高可用缓存集群。(除非另有说明,本文所述方法同样适用于NGINX Open Source和NGINX Plus,但为简洁起见,下文仅使用NGINX Plus这一名称。)

回顾:分片缓存解决方案

本系列的第一部分介绍了一种用于创建超大型分片缓存集群的模式。

对Web缓存服务器上的缓存进行分片,可创建容错配置,使每项资产仅缓存在一台服务器上

当需要创建可按需扩展的超大容量缓存时,此模式非常有效。由于每项资源仅缓存在一台服务器上,因此无法实现完全容错;但一致性哈希负载均衡可确保在某台服务器发生故障时,只有该服务器负责的缓存内容会失效。

创建高可用缓存集群

如果首要目标是不惜一切代价尽量减少向源服务器发出的请求,那么缓存分片解决方案并非合适的选择。您可以改为谨慎配置主、辅助NGINX Plus实例,以满足需求:

采用高可用性配置的缓存集群可在主缓存服务器与辅助缓存服务器之间自动故障转移,从而最大限度地降低源服务器的负载。

主NGINX Plus实例接收所有流量,并将请求转发到辅助实例。辅助实例从源服务器检索并缓存内容;主实例也会缓存辅助实例返回的响应,并将其返回给客户端。

两台设备的缓存均已完全填充,并会根据配置的超时设置刷新缓存。

配置主缓存服务器

将主缓存服务器配置为把所有请求转发到辅助服务器,并缓存响应。根据上游组中backup参数对server指令的设置,当辅助服务器发生故障时,主服务器会将请求直接转发到源服务器:

proxy_cache_path /tmp/mycache keys_zone=mycache:10m;
server {
    status_zone mycache;          # for NGINX Plus extended status

    listen 80;

    proxy_cache mycache;
    proxy_cache_valid 200 15s;

    location / {
        proxy_pass http://secondary;
    }
}

upstream secondary {
    zone secondary 128k;          # for NGINX Plus extended status

    server 192.168.56.11;         # secondary
    server 192.168.56.12 backup;  # origin
}

配置辅助缓存服务器

配置辅助缓存服务器,使其将请求转发到源服务器并缓存响应。

proxy_cache_path /tmp/mycache keys_zone=mycache:10m;
server {
    status_zone mycache;          # for NGINX Plus extended status

    listen 80;

    proxy_cache mycache;
    proxy_cache_valid 200 15s;

    location / {
        proxy_pass http://origin;
    }
}

upstream origin {
    zone origin 128k;            # for NGINX Plus extended status

    server 192.168.56.12;        # origin
}

配置高可用性

最后,需要配置高可用性(HA),以便主服务器发生故障时由辅助服务器接管传入流量;主服务器随后恢复后,将重新接管流量。

在此示例中,我们使用NGINX Plus的主动-被动HA解决方案。对外公布的虚拟IP地址为192.168.56.20,主缓存服务器充当集群中的HA主节点。如果使用NGINX Open Source,可以手动安装和配置keepalived或其他HA解决方案。

故障转移场景

回顾一下,我们希望创建一个高可用缓存集群,即使某台缓存服务器发生故障,也能继续运行。无论缓存服务器发生故障,还是恢复后需要刷新过期内容,我们都不希望增加源服务器的负载。

假设主服务器发生故障,此时NGINX Plus HA解决方案会将外部IP地址转移到备用服务器。

当缓存集群中的主缓存服务器发生故障时,辅助缓存服务器会直接接收并处理客户端请求,从而提供高可用性缓存。

辅助缓存服务器拥有完整缓存,并继续正常运行。源服务器不会承受额外负载。

当主缓存服务器恢复并开始接收客户端流量时,其缓存将处于过期状态,且许多条目已失效。主缓存服务器将从辅助缓存服务器刷新本地缓存;由于辅助服务器上的缓存已是最新状态,因此不会增加源服务器的流量。

现在,假设辅助缓存服务器发生故障。主缓存服务器会检测到该故障(使用作为HA解决方案一部分配置的运行状况检查),并将流量直接转发到备份服务器(即源服务器)。

当缓存集群中的辅助缓存服务器发生故障时,主缓存服务器会绕过该服务器,将客户端请求直接转发到源服务器,从而提供高可用缓存。

主服务器拥有完整缓存,并继续正常运行。同样,源服务器不会承受额外负载。

辅助服务器恢复后,其缓存将已过期。不过,只有当主服务器的缓存过期时,辅助服务器才会收到来自主服务器的请求,此时辅助服务器上的副本也已过期。虽然辅助服务器需要向源服务器请求内容,但这不会增加向源服务器发出请求的频率,也不会对源服务器造成不利影响。

测试故障转移行为

为测试HA解决方案,我们将源服务器配置为记录请求,并返回每个请求的当前时间。这意味着源服务器的响应每秒都会变化:

access_log /var/log/nginx/access.log;
location / {
    return 200 "It's now $time_localn";
}

主缓存服务器和辅助缓存服务器已配置为缓存状态码为200的响应,缓存时间为15秒。因此,缓存通常每15或16秒更新一次。

proxy_cache_valid 200 15s;

验证缓存行为

我们每秒向缓存集群的高可用虚拟IP地址发送一次HTTP请求。在主服务器和辅助服务器上的缓存过期,并从源服务器刷新响应之前,响应内容不会发生变化。此过程每15或16秒发生一次。

$ while sleep 1 ; do curl http://192.168.56.20/ ; done
It's now 9/Feb/2017:06:35:03 -0800
It's now 9/Feb/2017:06:35:03 -0800
It's now 9/Feb/2017:06:35:03 -0800
It's now 9/Feb/2017:06:35:19 -0800
It's now 9/Feb/2017:06:35:19 -0800
^C

还可以检查源服务器上的日志,确认它每隔15或16秒才收到一次请求。

验证故障转移

可以通过停止主服务器或辅助服务器来验证故障转移是否正常工作,例如停止nginx进程。恒定负载测试会继续运行,响应也会持续被缓存。

检查源服务器上的访问日志可以确认,无论哪台缓存服务器发生故障或恢复,源服务器始终只会每隔 15 至 16 秒收到一次请求。

缓存更新时间

在稳定状态下,缓存内容通常每15至16秒更新一次。内容会在15秒后过期,而收到下一个请求前最多会延迟1秒,随后触发缓存更新。

有时,缓存的更新速度看起来会较慢(内容变化的间隔最长可达30秒)。如果主缓存服务器上的内容已过期,而主服务器从辅助服务器检索到的缓存内容也即将过期,就会出现这种情况。如果这造成问题,可以在辅助服务器上配置更短的缓存超时时间。

总结

按照本文所述方式,在两个或更多NGINX缓存服务器之间构建分层缓存,可以有效创建高可用缓存集群,最大限度地降低源服务器的负载,避免源服务器在某个缓存服务器发生故障或恢复时遭遇流量激增。

缓存的总容量受限于单台缓存服务器的容量。本系列的第一部分介绍了另一种分片缓存模式,将缓存划分到缓存服务器集群中。在这种情况下,总容量等于所有缓存服务器的容量之和,但内容不会进行复制,因此无法在缓存服务器发生故障时防止源服务器流量激增。

在自己的服务器上试用高可用性缓存,立即开始30天免费试用,或联系我们,讨论您的用例。


分享

关于作者

相关博客文章

NGINX Plus R26 正式发布
NGINX | 2022/02/15

NGINX Plus R26 正式发布

NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
NGINX | 2022/02/10

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击

gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
NGINX | 2021/09/13

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划

了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。

NGINX Plus R19 正式发布
NGINX | 2019/09/03

NGINX Plus R19 正式发布

NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。

NGINX现已正式加入F5
NGINX | 2019/05/09

NGINX现已正式加入F5

NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。

使用NGINX和NGINX Plus实现高性能缓存
NGINX | 2016/08/24

使用NGINX和NGINX Plus实现高性能缓存

我将介绍NGINX在内容缓存和性能方面的工作原理,并分享一些控制NGINX内容缓存方式的技巧。