1

そのため、契約が存在しない場合にのみ、memcached と add() のストアを使用して分散ロックを実装しようとしています (Java と spymemcached ですが、もちろんどの言語にも適用できます)。もちろん、インスタンスがなくなるとロックが失われるため、ロックを 3 回 (例: MyLock1、MyLock2、MyLock3) 追加すると、3 つの異なるインスタンスにハッシュ アウトする可能性が非常に高くなります。

しかし、インスタンスがハッシュをダウンすると明らかに変化することに気付きました (spymemcached の Redistribute 失敗モードを使用)。 memcached クラスター内の残りの 2 つのロックのいずれかに一致します。

それで... memcachedを使用した分散ロックの他のアイデアはありますか? それとも、私が言及しているように保証されたロックを行うことは基本的に不可能ですか?

編集: 再配布モードの場合、spymemcached ソース コードを調べると、何も再ハッシュするのではなく、リスト内の次のアクティブな memcached インスタンスに移動するだけなので、問題なく動作するはずです。

4

3 に答える 3

3

You can't, at least not reliably. memcached doesn't make any guarantees about data retention -- as a cache, it may discard data at any point without warning. Even if the memcache instance appears to have space available, it may have to evict data due to slab constraints.

If you need distributed locking, you'll need to look elsewhere -- memcached is the wrong tool for the job. For what it's worth, MySQL has locks: http://dev.mysql.com/doc/refman/5.1/en/miscellaneous-functions.html

于 2011-06-30T17:49:57.840 に答える
2

本当に memcached を使用して、環境により多くのもの/複雑さを導入することを避けたい場合は、ロック専用の非常に小さいが専用の memcached 構成を検討してください。

しかし、memcached に依存しないソリューションを受け入れる場合は、個人的にはZookeeperを使用して Java で分散ロックを実装します。これを簡単にするために、 Netflixキュレーターユーティリティも使用します。

于 2011-06-30T17:54:43.513 に答える
1

Java を使用している場合は、Hazelcast (1.9+) を使用することをお勧めします。Hazelcast はクラスター全体で分散ロックをサポートし、簡単に作成できます。

Hazelcast は、ロックを保持しているサーバーがダウンした場合、ロックが解除されることを保証します。

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

また、Hazelcast は memcached と同じコントラクトを公開するため、JVM からアクセスする必要がある場合はそれを行うことができます (このサンプルは、任意のクライアントが機能することを示しています)。

ジャワ:

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/

それが役に立てば幸い。

于 2012-01-17T01:45:37.777 に答える