redis分散ロック

1807 ワード

redis分散ロック
分散ロックは、異なるプロセスが共有リソースに反発的にアクセスする必要がある場合に非常に有用な技術的手段である.スタンドアロン状態:
SET resource_name my_random_value NX PX 30000 

ランダム値my_によるrandom_value resourceを削除するかどうかを判断します.name、これにより他のクライアントがデータを誤って削除することを避けることができるだけで、論理は以下のスクリプトを参照してください.
if redis.call("get",KEYS[1]) == ARGV[1] then
        return redis.call("del",KEYS[1])
    else
        return 0
    end

Redlockアルゴリズム
分散バージョンのアルゴリズムでは,複製や他の暗黙的な分散協調アルゴリズムを用いずに完全に独立したN個のRedisマスターノードがあると仮定した.単一ノード環境でロックを安全に取得および解放する方法について説明した.したがって,当然,この方法で各単一ノードでロックを取得し,解放しなければならない.私たちの例では、Nを5に設定します.この数字は比較的合理的な数値です.そのため、異なるコンピュータまたは仮想マシン上で5つのmasterノードを実行して、ほとんどの場合、同時にダウンタイムしないことを保証する必要があります.クライアントは、ロックを取得するために次の操作を行う必要があります.
1.現在の時間(ミリ秒単位)を取得します.
2.同じkeyとランダム値でN個のノードで順番にロックを要求する.このステップでは、クライアントがmasterごとにロックを要求すると、総ロック解放時間に比べて小さなタイムアウト時間が発生する.たとえば、ロックの自動解放時間が10秒の場合、各ノードのロック要求のタイムアウト時間は5~50ミリ秒の範囲であり、クライアントがダウンしたmasterノードで長時間ブロックされることを防止します.masterノードが使用できない場合は、できるだけ早く次のmasterノードを試してみましょう.
3.クライアントは、第2のステップでロックを取得するのにかかる時間を計算し、クライアントがほとんどのmasterノードでロック(ここでは3つ)を正常に取得し、合計消費時間がロック解放時間を超えない場合にのみ、このロックは成功したと考えられる.
4.ロックの取得に成功した場合、ロックの自動解放時間は、最初のロック解放時間から、以前にロックを取得するのに消費された時間を差し引くことになる.
5.ロックの取得に失敗した場合、成功したロックが半分以下(N/2+1)であっても、総消費時間がロックの解放時間を超えた場合でも、クライアントは、成功しなかったと考えているロックであっても、masterノードごとにロックを解放します.
Redlockは安全ですか?
antirezはMartinのRedLockに対する告発をまとめた.
  • 分散ロックは、自動的に解放される機能を有する.ロックの反発性は、期限切れの時間内にのみ有効であり、ロックが期限切れになってリリースされると、複数のClientがロックを保持します.//他の分散ロックの設計も
  • を避けることができない.
  • RedLockシステム全体は、実際のシステムでは保証できないシステムモデル上に構築されています.この例では、システムは、時間が同期され、信頼できると仮定する.時間が信頼できないのは主に1.人为修正//仕方がない.システム時間ステップ//運転メンテナンス
  • 回避
    Redis RedLockの完璧な分散ロックですか?掘金分布式ロックの3つの実装の対比−Distributed locks with Redis−Redishttp://ifeve.com/redis-lock/Redisson分散ロックの概要|網易楽得技術チーム