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

Я пытаюсь выполнить что-то вроде этого, запросы сбалансированы по нагрузке между несколькими узлами, которые должны обслуживать общий кешированный контент, когда он доступен. Мы испытываем случайные результаты MISS, хотя содержимое хранилось в файловой системе кэша одним из других узлов. Из журналов видно, что иногда узел A идентифицирует содержимое HIT, кэшируемое узлом B, но иногда это не так.Содержимое общего кэша в балансировке нагрузки nginx proxy

В соответствии с документацией 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 Cache, в nginx (https://www.nginx.com/resources/wiki/modules/sr_cache/)?

ответ

2

Nginx не может обмениваться дисковым кэшем между узлами. Размещение кеша на общем диске - тоже плохая идея, это плохой дизайн. Любые сетевые проблемы с общим диском, любые задержки с высокой задержкой и задержкой распределения могут значительно снизить производительность nginx.

Оставить кеш на локальном диске. Если вы используете несколько узлов в качестве балансировки нагрузки, вы можете использовать кеширование. Каждый узел будет получать часть запросов и кэшировать его. Если вы нацелены на HA, каждый узел должен хранить собственный кеш.

Подробнее о всех этих случаях вы можете прочитать на сайте nginx: https://www.nginx.com/blog/shared-caches-nginx-plus-cache-clusters-part-1/ о sharding и https://www.nginx.com/blog/shared-caches-nginx-plus-cache-clusters-part-2/ о HA.