Имеет ли смысл динамически добавлять частные IP-адреса экземпляров EC2 к настройке CACHE LOCACTION для Django в среде Elastic Beanstalk с NGINX?

Я использую Elastic Beanstalk с балансировкой нагрузки и установил минимальное количество экземпляров 2. Таким образом, у меня есть два экземпляра с двумя разными частными IP-адресами.

Я пытаюсь добиться того, чтобы динамически добавлять места кэширования Memcached в настройки Django CACHES на основе экземпляров EC2, которые существуют в окружении.

Мой основной вопрос

Поскольку Elastic Beanstalk использует NGINX (в моем случае), нужно ли мне динамически добавлять IP-адреса экземпляров в местоположение CACHES Django? Или настройки 'LOCATION': '127.0.0.1:11211', будет достаточно для всех запущенных EC2 экземпляров?

Вторичный вопрос Централизует ли NGINX кэш для всех запущенных экземпляров?

Моя первичная конфигурация NGINX:

(staging) [ec2-user@ip-172-31-9-242 conf.d]$ cat elasticbeanstalk/00_application.conf 
location / {
    proxy_pass          http://127.0.0.1:8000;
    proxy_http_version  1.1;

    proxy_set_header    Connection          $connection_upgrade;
    proxy_set_header    Upgrade             $http_upgrade;
    proxy_set_header    Host                $host;
    proxy_set_header    X-Real-IP           $remote_addr;
    proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
}

В документации Django говорится, что один и тот же кэш может быть общим для нескольких серверов - Memcached caching:

Одной из замечательных особенностей Memcached является возможность совместного использования кэша на нескольких серверах. Это означает, что вы можете запустить демоны Memcached на нескольких машинах, и программа будет рассматривать группу машин как единый кэш, без необходимости дублировать значения кэша на каждой машине. машине. Чтобы воспользоваться преимуществами этой функции, включите все адреса серверов в поле адреса серверов в LOCATION, либо в виде строки с запятой или точкой с запятой. строку, либо в виде списка.

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
        'LOCATION': [
            '172.19.26.240:11211',
            '172.19.26.242:11211',
        ]
    }
}

Я создал класс, использующий boto3 для получения списка экземпляров EC2:

class MemcachedLocations(object):

    MEMCACHED_PORT = "11211"
    ACCESS_KEY = os.environ.get('AWS_S3_ACCESS_KEY_ID')
    SECRET_KEY = os.environ.get('AWS_S3_SECRET_KEY_ID')
    REGION = 'us-west-2'

    @cached_property
    def get(self):

        client = boto3.client('ec2', region_name=self.REGION, aws_access_key_id=self.ACCESS_KEY,
                              aws_secret_access_key=self.SECRET_KEY)

        response = client.describe_instances()

        private_ips_list = []
        for reservation in response['Reservations']:
            for instance in reservation['Instances']:
                private_ip = instance['PrivateIpAddress']
                private_ip = f"{private_ip}:{self.MEMCACHED_PORT}"
                private_ips_list.append(private_ip)

        return private_ips_list

При развертывании работает как ожидалось:

>>> from django.conf import settings
>>> settings.CACHES
{'default': 
    {'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
     'LOCATION': ['172.##.##.###:11211', '172.##.##.###:11211']
    }
}

но когда я тестирую его в SSH:

from django.core.cache import cache
cache.set('ping', 'pong', 600)
cache.get('ping')
>>> Returns None but should return 'pong' if working properly

Список: Я уже знаю о AWS Elasticache. Я уже знаю, как его успешно реализовать. Я бы хотел не использовать его, если это возможно.

Вернуться на верх