Гарантированный Memcached замок - PullRequest
1 голос
/ 30 июня 2011

Итак, я пытаюсь реализовать распределенную блокировку с использованием хранилища memcached и add (), только если не существует контракта (Java и spymemcached, но, конечно, применимо на любом языке). Конечно, если экземпляр удаляется, мы теряем блокировку, поэтому мы думали, что добавим блокировку 3 раза (например, MyLock1, MyLock2, MyLock3), что, скорее всего, будет хэшировать до 3 разных экземпляров.

Но я понял, что если экземпляры выходят из хэша, то, очевидно, он меняется (используя режим сбоя Redystribute для spymemcached), и поэтому, вероятно, что при очередной попытке добавить () блокировки, хэши всех 3 Блокировки не будут соответствовать ни одной из 2 оставшихся блокировок в кластере memcached.

Итак ... есть еще идеи для распределенных блокировок с использованием memcached? Или это в принципе невозможно сделать гарантированную блокировку, как я имею в виду?

РЕДАКТИРОВАТЬ: Хорошо, поэтому, просматривая исходный код spymemcached для режима перераспределения, он просто переходит к следующему активному экземпляру memcached в своем списке, вместо того, чтобы заново что-либо хэшировать, поэтому он должен работать нормально.

Ответы [ 3 ]

3 голосов
/ 30 июня 2011

Вы не можете, по крайней мере, не надежно.memcached не дает никаких гарантий относительно сохранения данных - как кеш , он может отбрасывать данные в любой момент без предупреждения.Даже если в экземпляре memcache имеется свободное место, ему может потребоваться удалить данные из-за ограничений на перекрытия.

Если вам нужна распределенная блокировка, вам нужно искать в другом месте - memcached - неподходящий инструмент дляработа.Для чего стоит MySQL имеет блокировки: http://dev.mysql.com/doc/refman/5.1/en/miscellaneous-functions.html

2 голосов
/ 30 июня 2011

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

Но если вы открыты для решений, которые не требуютне полагайтесь на memcached, тогда лично я бы использовал zookeeper для реализации распределенной блокировки в java.Я бы также использовал утилиту куратора Netflix , чтобы сделать это проще.

1 голос
/ 17 января 2012

Если вы используете Java, я рекомендую использовать Hazelcast (1.9+), он поддерживает распределенные блокировки в кластере и его легко создать.

Hazelcast гарантирует, что если сервер, на котором установлена ​​блокировка, выйдет из строя, блокировка будет снята.

http://hazelcast.com/docs/1.9.4/manual/single_html/#Lock

Также Hazelcast предоставляет тот же контракт, что и memcached, поэтому, если вам нужен доступ к нему из JVM, вы можете это сделать (этот пример демонстрирует, что любой клиент будет работать):

Java:

MemcachedClient client = new MemcachedClient(AddrUtil.getAddresses("10.20.17.1:5701 10.20.17.2:5701"));
client.set("key1", 3600, "value1");
System.out.println(client.get("key1"));

PHP:

<?php
    $memcache = new Memcache;
    $memcache->connect('10.20.17.1', 5701) or die ("Could not connect");
    $memcache->set('key1','value1',0,3600);
    $get_result = $memcache->get('key1'); //retrieve your data
    var_dump($get_result); //show it
?>

Документация 1.9+: http://hazelcast.com/docs/1.9.4/manual/single_html/

Надеюсь, это поможет.

...