Memcache - отличный распределенный кеш. Чтобы понять, где хранится значение, рекомендуется подумать о кластере memcache как о хэш-карте, причем каждый memcached-процесс является ровно одним отверстием для голубей в хэш-карте (конечно, каждый memcached также является «внутренним» хэш-картами, но это не так важно для этого момента). Например, Memcache клиент определяет узел кэша памяти с помощью этого псевдокода:
index = hash(key) mod len(servers)
value = servers[index].get(key)
Это как клиент всегда может найти правильный сервер. В нем также подчеркивается, насколько важна хэш-функция и как сгенерированы ключи - плохая хеш-функция может не равномерно распределять ключи по разным серверам .... Хэш-функция по умолчанию должна работать хорошо практически в любой практической ситуации.
Теперь вы вызываете вопрос [2] о том, что запросы на ресурсы неслучайны, особенно в пользу одного или нескольких серверов. Если это так, то верно, что соответствующие узлы, вероятно, получат намного больше запросов, но это относительно. По моему опыту, memcache сможет обрабатывать значительно больше запросов в секунду, чем ваш веб-сервер. It easily handles 100's of thousands of requests per second on old hardware. Таким образом, если у вас нет 10-100x больше веб-серверов, чем серверов memcache, у вас вряд ли будут проблемы. Даже тогда вы, вероятно, можете решить проблему, обновив отдельные узлы, чтобы иметь больше процессоров или более мощные процессоры.
Но давайте предположим, в худшем случае - вы можете добиться этого с помощью кэша памяти:
- Установите каждый в качестве кэша памяти одного сервера (т.е.не как распределенный кэш)
- В вашем веб-сервере, вы теперь ответственны за управление связи с каждым из этих серверов
- Вы также ответственны за определение который Memcached процесс пройти каждый ключ/значение, достижение цель 1
- Если веб-сервер обнаруживает недействительность кэша, он должен перебирает сервера недействительности этого кэша на каждый, таким образом, достижение цели 2
Я лично есть оговорки по этому поводу - вы, по спецификации, отключение распределенный аспект вашего кеша, а распределение - это ключевой функции и преимущества услуги. Кроме того, ваш код приложения начнет нуждаться в том, чтобы знать о отдельных серверах кеша, чтобы иметь возможность обрабатывать каждый по-разному, что нежелательно в архитектуре и вводит большое количество новых точек конфигурации.
Идея любого распределенного кеша заключается в удалении права собственности на местоположение (*) с клиента. Из-за этого распределенные кэши и БД не позволяют клиенту указывать сервер, на котором записаны данные.
Таким образом, если ваша система не ожидает 100 000 000 или более запросов в секунду, сомнительно, что эта конкретная проблема будет на практике. Если да, масштабируйте оборудование. Если это не сработает, тогда вы будете писать свою собственную логику распределения, дублирование, очистку и уровень управления поверх memcache. И я бы сделал это, если действительно, действительно необходимо. Там в old saying in software development:
Есть только два жестких вещей в области компьютерных наук: Аннулирование кэша и называния вещей.
--Phil Karlton
(*) Некоторые распределенные кэши повторяющихся записей для повышения производительности и (дополнительно) устойчивость при отказе сервера, поэтому данные могут быть на нескольких серверах одновременно