Распределенный кэш. Часть 2.
https://t.me/faangmasterПервая часть тут.
Co-located кэш-сервера vs. отдельные кэш-сервера
Кэш сервера могут находится на отдельном железе (на отдельных серверах) от самого приложения

Это позволяет отдельно масштабировать приложение и кэш.
Или на том же железе, что и само приложение

Такой подход позволяет сократить расходы, но при падении сервера мы сразу теряем и инстанс приложения и инстанс кэша.
Cache client и Cache Server list
Для доступа к данным в кэше на стороне приложения имеется клиент (Cache Client). Это библиотека или процесс, который может получить доступ к данным в распределенном кэше. Он должен знать или уметь вычислять на каком сервере находятся нужные данные. Для этого нам, как минимум, нужно знать список серверов и поддерживать его в актуальном состоянии. Этот список можно держать на стороне Cache Client

В таком случае нам нужно поддерживать в актуальном состоянии этот конфигурационный файл на каждом Cache Client. Поэтому при каждом изменении конфигурации кэш серверов нам нужно запушить на клиента это обновление конфигурации.
Второй вариант - центральное хранилище такой конфигурации

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

Шардинг
Т.к. данные в кэше нужно распределить на несколько серверов, то их нужно как-то разбить на части. Для этого можно использовать шардинг.
Наш кэш должен поддержить, как минимум, две основные операции:
put(key, value)
get(key)
Чтобы это сделать, нам первым делом нужно понять с каким из кэш серверов нам нужно взаимодействовать. Для этого можно использовать Consistent Hashing или похожие алгоритмы. Т.е. мы организуем наши кэш сервера в hash-ring, и на основе hash(key) мы вначале вычислим ближайший по часовой стрелке кэш-сервер hash(cache server name/ip).

И уже на полученном кэш сервере выполнить операцию над данными в кэше.
Следующая часть: Распределенный кэш. Часть 3.