2016-05-23 2 views
3

Скажем, у меня есть массив сервера memcache, клиент memcache будет следить за тем, чтобы запись кэша была только на одном сервере memcache, и все клиенты всегда будут запрашивать этот сервер для кеша вход ... правильно?Распределенный кеш с повторяющимися элементами кэша на другом хосте

Теперь Рассмотрит два сценария:
[1] веб-сервер которые получают много различного запрос (разные адреса), то запись кэша будет распространяться среди кэша памяти сервера и запроса будет вентилятор к кэшу памяти кластера.
В этом случае работает стратегия memcache для сохранения записи одного кэша на одном сервере.

[2] Веб-сервер получает много запросов для одного и того же ресурса, тогда весь запрос с веб-сервера будет приземляться на один сервер memcache, который нежелателен.

Что я ищу это распределенный кэш, в котором:
[1] Каждый веб-сервер может указать, какой кэш узел для использования в кэш материала.
[2] Если какой-либо веб-сервер делает недействительным кеш, тогда сервер кеша должен аннулировать его со всех узлов кэширования.
Может ли memcache выполнить эту процедуру?

PS: У меня нет много ресурсов для кэширования, но у меня есть небольшое количество ресурсов с большим количеством трафика, запрашивающим один ресурс одновременно.

ответ

1

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


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

 Смежные вопросы

  • Нет связанных вопросов^_^