<---> NGX CACHE - NODE A \
REQUESTS <---> LB <--> <----> SHARED FS (NAS)
<---> NGX CACHE - NODE B /
我正在尝试完成这样的事情,请求在几个节点之间进行负载平衡,这些节点应该在可用时提供共享的缓存内容。 即使内容由其他节点之一存储在缓存文件系统中,我们也会遇到随机MISS结果。我们从日志中可以看到,有时节点A标识为节点B缓存的HIT内容,但有时却没有。
根据文档https://www.nginx.com/blog/nginx-caching-guide/,强制keys_zone参数设置共享内存区域,用于存储缓存密钥和元数据,以快速确定请求是HIT还是MISS,而无需转到磁盘。 / p>
这是我们配置的相关部分:
proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=my_zone:10m max_size=10g inactive=60m use_temp_path=off;
: : :
location ~* ^/api/rdPage.aspx {
resolver 10.0.0.1;
add_header X-Cache-Status $upstream_cache_status;
proxy_cache_bypass $http_pragma;
proxy_cache_key "$proxy_host$uri$request_body";
proxy_cache_valid 200 10m;
proxy_ignore_headers Cache-Control Expires Set-Cookie;
proxy_cache_methods POST;
proxy_cache_min_uses 0;
proxy_cache my_zone;
# WITH PROXY LB SERVER
proxy_pass http://api-server/rdPage.aspx$is_args$args;
proxy_headers_hash_bucket_size 128;
proxy_connect_timeout 15;
proxy_send_timeout 15;
proxy_read_timeout 1800;
}
keys_zone“共享”内存区域如何适用于多个节点?如果它在内存中,它如何共享?任何替代方案都没有将自定义模块(如SR Cache)添加到nginx(https://www.nginx.com/resources/wiki/modules/sr_cache/)?
答案 0 :(得分:2)
Nginx无法在节点之间共享基于磁盘的缓存。将缓存放在共享磁盘上也是一个坏主意,这是一个糟糕的设计。任何共享磁盘的网络问题,任何由于网络延迟导致的高延迟和分配锁定累积都会大大降低nginx的性能。
将缓存留在本地磁盘上。如果使用多个节点作为负载平衡 - 可以使用缓存分片。每个节点将接收部分请求并对其进行缓存。如果您的目标是HA,则每个节点都应保留自己的完整缓存。
有关您可以在nginx网站上阅读的所有这些案例的更多信息:https://www.nginx.com/blog/shared-caches-nginx-plus-cache-clusters-part-1/关于分片和https://www.nginx.com/blog/shared-caches-nginx-plus-cache-clusters-part-2/有关HA的信息。