Как PHP memcached определяет, на каком узле в кластере хранить ключ?

У меня есть некоторые данные, которые я хочу сохранить в memcached (используя клиент PHP libmemcached: https://www.php.net/manual/en/intro.memcached.php). Это то, что очень часто встречается в моем веб-приложении.

Чтобы уменьшить объем трафика на один узел memcached, я добавляю случайное число от 1 до 10 в конец ключа в надежде, что клиент не будет хранить все ключи на одном узле.

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

Кто-нибудь знает, как это делается?


person Zachary Wright    schedule 03.06.2020    source источник


Ответы (1)


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

Это важно, потому что, если 2 сервера взаимодействуют с несколькими серверами memcached, они должны надежно выбирать один и тот же сервер для одного и того же ключа. Random — это плохо, потому что это означает, что клиент может попытаться get() с другого сервера, на котором был сохранен элемент.

Если у вас 15 узлов и больше половины элементов хранилось в 1 узле, вы либо: 1. Крайне не повезло, либо 2. Что-то настроено неправильно, и некоторые из ваших серверов помечены как отключенные.

Базовый хеш более сложен, чем простой «md5», он использует алгоритм «согласованного хеширования». Это означает, что если у вас есть 15 узлов и вы потеряете 1, большинство ключей все равно будут разрешаться на один и тот же сервер. Есть длинные статьи о «последовательном хэшировании», поэтому технические подробности получить несложно.

person Evert    schedule 03.06.2020
comment
Ах хорошо. Это то, что я имел в виду под случайным (т. е. не по алфавиту или что-то в этом роде, что привело бы к группировке похожих имен). вероятность их группировки. - person Zachary Wright; 04.06.2020
comment
@ZacharyWright используемый хэш должен иметь хорошее распространение. Даже если ключи идентичны на 99%, разброс должен быть статистически равномерным. - person Evert; 04.06.2020