Назад | Перейти на главную страницу

Кеширование (memcache / redis) и несколько серверов - лучшая стратегия

Мы рассматриваем лучшую стратегию использования кеша (memcache или redis на основе) в нашем приложении (Symfony2). Он будет развернут на нескольких (пока 3) отдельных машинах с балансировкой нагрузки и отдельными реплицированными базами данных + одно общее общее хранилище. Также есть четвертый сервер, который используется в основном для клиентов и рассылки массовых рассылок. Обратите внимание, что кеш будет часто не только использоваться, но и обновляться из-за частого изменения данных.

Пока у нас есть три попытки:

  1. мы размещаем единый кеш на четвертой машине и делимся им по всему домену. Плохая сторона в том, что когда эта машина выходит из строя, все выходит из строя.

  2. мы размещаем отдельные кеши на нескольких машинах, у каждой свой кеш. Обратной стороной является то, что мы должны зарезервировать больше вычислительных мощностей для выполнения избыточных задач.

  3. одна машина восстанавливает кеш, а затем распространяет его на отдельные машины (обратная сторона такая же, как в первом случае).

Как лучше всего с этим справиться?

Если я хорошо прочитал опубликованную информацию, memcache поддерживает репликацию данных на нескольких серверах с помощью демона, называемого repcached. Я должен добавить, что никогда не использовал memcache.

я использовал redis, и я знаю, что он поддерживает установки Master-Slave.

В обоих случаях вам может потребоваться установить демон на всех машинах и реплицировать данные в режиме главный-подчиненный. Затем вы должны настроить задержку обновления, чтобы получить согласованную реплику для вашей установки.

Причины включают:

  • нет необходимости настраивать выделенный механизм репликации, ваш демон справится с задачей
  • если какая-либо из машин выйдет из строя, установка продолжит работать без проблем, другие машины просто потеряют связь с отказавшей и разделят нагрузку. После этого вы сможете переключить любой из трех оставшихся узлов в мастеринг на время.

На стороне приложения вы можете захотеть подключиться к одному экземпляру вашего демона для чтения и записи (обычно к главному), и пусть ведомые устройства будут лениво реплицировать данные.

Это позволило бы снизить производительность, потому что кеш всегда может напрямую обращаться к горячим данным. Эта настройка также обеспечит приличную доступность (допуская X время «пропущенных данных» из-за сбоя, где вы можете настроить X по своему усмотрению). Вы также можете сбалансировать нагрузку на запись DNS в кэше, чтобы экземпляры приложения всегда находили доступный кеш.

Если вы выберете redisобязательно включите оба режима сохранения данных (RDB и AOF).