Масштабирование Memcached: группировка ключей

Поскольку рекомендуется сгруппировать связанные ключи, которые часто извлекаются вместе (с помощью multiGet) на одном сервере для оптимальной производительности, у меня есть пара вопросов относительно неявной механики, используемой клиентскими функциями, созданными для этого.

Я видел два разных подхода для обслуживания того, что, как я полагаю, является одной и той же целью с использованием libmemcache (в частности, php-memcached). Первый и наиболее очевидный подход — использовать getByKey/setByKey для сопоставления ключей с серверами, а второй — использовать параметр OPT_PREFIX_KEY (в документации по php есть простой пример в разделе memcached::_construct), который, согласно документации, «используется для создания« домена »для ваших ключей предметов». Предупреждение второго подхода заключается в том, что его можно установить только для каждого экземпляра, что может быть как хорошо, так и плохо.

Так что, если я полностью не ошибаюсь, и эти два подхода на самом деле не служат одной и той же цели; это какое-то явное преимущество для того, чтобы идти с подходом по сравнению с другим?

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

Спасибо!


person Adam    schedule 13.08.2011    source источник


Ответы (1)


Если эти ключи действительно почти всегда извлекаются вместе, вы, вероятно, захотите кэшировать их вместе в одной паре ключ/значение, например, путем сортировки и объединения ключей и хранения значений, сериализованных в виде словаря в формате JSON или аналогичном.

Возвращаясь к вашему вопросу:

  • OPT_PREFIX_KEY почти не имеет ничего общего с группировкой значений по ключу, он просто добавляет префикс ко всем ключам, используемым этим конкретным клиентом, так что «1» становится «foo1» и распределяется путем последовательного хеширования с использованием этого нового значения без какой-либо группировки по «foo».
  • getByKey/setByKey максимально приближен к тому, что вы хотите, поскольку он может передавать разные ключи libketama (используется для выбора сервера) и серверу memcached. Если вы укажете один и тот же первый ключ и разные вторые ключи, они окажутся на одном сервере memcached, но не будут перезаписывать друг друга.

Преждевременная оптимизация — корень всех зол

person Ivan Blinkov    schedule 18.05.2012