Имеет ли смысл динамически добавлять частные 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. Я уже знаю, как его успешно реализовать. Я бы хотел не использовать его, если это возможно.