2017-02-20 31 views
2
     <---> NGX CACHE - NODE A \ 
REQUESTS <---> LB <-->       <----> SHARED FS (NAS) 
         <---> NGX CACHE - NODE B/

我試圖完成這樣的事情,請求負載平衡之間的幾個節點應提供共享緩存內容時可用。 即使內容由其他節點之一存儲在緩存文件系統中,我們也會遇到隨機MISS結果。從日誌中我們可以看到,有時節點A將節點B標識爲HIT內容,但有時不會。負載平衡nginx代理中的共享緩存內容

根據文檔https://www.nginx.com/blog/nginx-caching-guide/,必需的keys_zone參數設置了一個共享內存區,用於存儲緩存鍵和元數據,以快速確定請求是HIT還是MISS,而無需轉到磁盤。

這是我們配置的相關部分:

  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緩存到nginx(https://www.nginx.com/resources/wiki/modules/sr_cache/)?

回答

2

Nginx無法在節點之間共享基於磁盤的緩存。將緩存放在共享磁盤上也是一個糟糕的主意,這是一個糟糕的設計。任何共享磁盤的網絡問題,由於網絡延遲而導致的高延遲以及分配鎖定可以顯着降低nginx性能。

將緩存留在本地磁盤上。如果您使用多個節點作爲負載平衡 - 您可以使用緩存分片。每個節點將接收部分請求並緩存它。如果您的目標是HA,則每個節點都應保持自己的完整緩存。

有關您可以在nginx網站上閱讀的所有這些案例的更多信息:關於sharding的https://www.nginx.com/blog/shared-caches-nginx-plus-cache-clusters-part-1/以及關於HA的https://www.nginx.com/blog/shared-caches-nginx-plus-cache-clusters-part-2/