Как django справляется с несколькими memcached-серверами?

В документации django говорится следующее:

....

Одной из отличных возможностей Мемкеша является его способность совместно использовать кэш над несколько серверов. Это означает, что вы можете запускать Memcached демоны на нескольких машины, и программа будет относиться к группе машин как к единому кэш, без необходимости дублировать значения кэша на каждой машине. На воспользоваться этой функцией, включить все адреса серверов в МЕСТОРАСПОЛОЖЕНИЕ, разделенное точкой с запятой или списком.

...

Кэш-фреймворк Django - Memcached

Как именно это работает? Я прочитал некоторые ответы на этом сайте, которые говорят о том, что это делается путем шардинга по серверам на основе хэшей ключей.

Вопрос о нескольких кэшированных серверах

Как на самом деле MemCacheStore работает с несколькими серверами?

Это нормально, но мне нужен гораздо более конкретный и подробный ответ. Использование django с pylibmc или python-memcached, как на самом деле работает этот шардинг? Имеет ли значение порядок IP-адресов в настройках конфигурации? Что, если два разных веб-сервера под управлением одного и того же приложения django имеют два разных файла настроек с IP-адресами memcached-серверов в разном порядке? Приведет ли это к тому, что на каждой машине будет использована своя стратегия шардинга, которая приведет к дублированию ключей и другим неэффективным действиям?

Что, если конкретная машина появится в списке дважды? Например, что если я сделаю что-то вроде этого, где 127.0.0.1 на самом деле та же самая машина, что и 172.19.26.240?

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': [
            '127.0.0.1:11211',
            '172.19.26.240:11211',
            '172.19.26.242:11211',
        ]
    }
}

Что если один из memcached серверов имеет большую производительность, чем другие? Если на машине 64МБ memcached, а на машине 2 128МБ, будет ли алгоритм шардинга учитывать это и давать машине 2 большую часть ключей?

Я также читал, что если memcached сервер потерян, то эти ключи будут потеряны. Это очевидно, когда речь идет о шардинге. Что более важно, что произойдет, если memcached сервер выйдет из строя и я оставлю его IP адрес в файле настроек? Будет ли django/memcached просто не в состоянии получить ключи, которые были бы шардированы к этому вышедшему из строя серверу, или он поймет, что сервер вышел из строя и придумает новую стратегию шардинга? Если есть новая стратегия шардинга, умно ли она взять ключи, которые изначально предназначались для вышедшего из строя сервера и разделить их между оставшимися серверами, или она придумала совершенно новую стратегию, как если бы первого сервера не существовало, и в результате ключи были продублированы?

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

20
задан Community 23 May 2017 в 11:45
поделиться