分散ロック:RedLockアルゴリズム

分散ロックベースのRedisの単一ノードについての私たちの最後の記事では、この単一ノードの問題は、実際には、非常に大きいそれを行う方法を、サーバーの崩壊をRedisの場合は全体の事業は、それを冷却します。我々は一般的に、よりRedisのサーバーを必要とするので、一緒にロックを配布しました。

アルゴリズムのプロセス

5つの主要なサーバーの完全に独立したのRedisがあると仮定

現在の時刻のタイムスタンプを取得するためのクライアントをロックするための(1)要求(スレッドも詳細なポイントを言います)。

そこ各また、サーバー用途のRedisに、各クライアントの単一ノードの実施形態のロックのために。

(2)クライアントは、同じキーを使用しようとするためには、値の取得は、すべてのロックRedisのサービスは、また、値はスレッドIDで、前に言いました。時間の有効期限がはるかに小さいよりも、ロック時間を設定するためのロックを獲得し、それはRedisのサーバーがハングアップした場合、クライアントはまた愚かな待ち時間に、それは時間の無駄であるので、一般的に最小を設定し、時間を待って、より多くのこの時間よりも、その後、あきらめる場合、Redisのサーバーロックの下で行いました。

ロックを取得することができた後、すべての時間を取得するための最初のステップを減算することにより、(3)クライアントの時間は、この時間差は、時間(タイムが期限切れ)以下TTLよりも、成功したのRedisの少なくとも3つの例があります、本当に成功するために、ロック・アクセスをロックを取得。時間差がTTLよりも大きい場合ので、その後、ロックの最初のセットは、おそらく期限切れのRedis。また、半分のRedisは仕事のためにロックアップする以上必要です。

ロックが正常に取得された場合(4)、ロックの本当の有効時間がTTLマイナス時間第三の工程の間の時間差であり、例えば:TTLは、(実際に再びべき、2S持つすべてのロックを取得し、5Sある実質実効ロック時間3Sマイナスクロックドリフト)。

(5)クライアントが何らかの理由でロックを取得できなかった場合、すべてのインスタンスをRedisのロックを解除するために開始されます。そうでない場合は、ロック、他のクライアントの獲得に影響を与える、以下の3つのロックを解除する必要が取得されている可能性があるため、

 

かどうかRedLockアルゴリズムは、非同期アルゴリズムですか?

クロックを同期させることなく、(複数のコンピュータ間)もインターので、しかし都度プロセスは、実質的に同じ流量である;それは同期アルゴリズムとして見ることができ、クロックドリフトが小さいTTLに対しては無視することができ、同期アルゴリズムを見ることができます;(地球の両端の2台のコンピュータが、クロックドリフトが非常に大きい場合ので、ない厳格なことに、アルゴリズム)は、クロックドリフトをカウントします。

RedLock失敗時の再試行

クライアントがロックを取得できない場合、ランダムな時間がロックを取得した後に再試行されるべきである、とロックは、ロックのタイムリーなリリースでは、タスクを完了するために、クライアントのために取得された、とすべてのインスタンスのRedisの、好ましくは同一の伝送時間同時setコマンドこれは時間を節約することです。

RedLockリリースロック

値を判断しますロックは、それが削除された場合、ロックを解除するために自分の時間を設定されていないので、そのロックを解除することは、非常に単純であるとき限りのコマンドがロックを解除するために発行されるすべてのインスタンスに関係なく、ロックの解除の成功の。

RedLock上のご注意(安全の引数):

(1)第一のセットのコマンドはTlの、最後の後に設定のコマンドである前に、最初のクライアントがすべてのインスタンスを取得し、すべてのインスタンスが同じキーと有効期限(TTL)を含むが、設定コマンドの各インスタンスは、異なる時間につながることができないと仮定すると、同時に満了します最小時間はT2、このロックが取得された有効なクライアントにTTL(T2-T1) - でクロックドリフト。

(2)へのN / 2 + 1(すなわち、半分以上)の実施形態の半分未満が成功したと判定された場合、クライアントが複数存在することができるので、取得されたロック成功は、正常に発生ロックを取得するかどうかを決定するようにロック効果こと。

(3)クライアントがロックの満了またはその近くで過ごした時間よりも長く、ほとんどのケースをロックし、ロックを無効とし、(事業を行わない)Redisの例のロックを解除され、ロックが正常よりTTLの時間の半分以上が有効で取得限りとしてロック、そうでない場合は無効。

システムは、特徴的な活性を有します

(1)自動的にロックを解除

(2)自動的にロックが獲得にロック失敗(半分以下)をリリースしている、またはタスクが完了すると、それは自動的に期限切れになるまで、待っていません

ロック前OH(第2故障再試行間隔に最初)を得る(3)クライアントの試みは、消費第1ロック取得時間よりも大きいです。

(4)一定を有するように、ロックを取得するための再試行制限

関連ソリューションRedLockのパフォーマンスとクラッシュ回復

(1)はRedisの無持続的な機能は、クライアントAでのロックの成功を取得した場合は、すべてのRedisは非常に排他相互排他ロックに違反している、clientBがロックに再び取得することができ、再起動してください。例えば:今は5つのRedisの、今そこにありますロックは、2つのロックの所有は、スレッドがロックを取得し、再び、左、その後、3見がに得ることができるようになります、3、跳ね返ったの1を占めています。

(2)あなたは永久記憶AOF起動すると、物事は例えば、より良いでしょう:満了に伴う我々はRedisのを再起動したときには、その再起動後、UNIXタイムスタンプ行くに従ってメカニズムをRedisの、と規定時間に応じて期限切れとなる、ビジネスに影響を与えることはありません。 ;しかし、理由は、デフォルトでは1秒あたりのディスクへの同期方法のAOFの - 二回、1秒以内に電源障害がデータの損失につながる場合は、すぐに再起動は、相互に排他ロックに失敗になります。しかし、あなたは、同期ディスクモード常に(すべての書き込みを使用している場合コマンドは、パフォーマンスの大幅な減少を生じる)ハードディスクに同期され、その完全なロックで有効性とパフォーマンスが選択をします。 

(3)効果的かつ効率的なパフォーマンスをフルロック、さらには停電方法の両方を確保するための効果的なソリューションが何らかの理由Redisの中で、毎秒デフォルトのディスクを維持する方法を同期のRedisされ、(TTL時間後の再起動後に待機する停止学名:再起動遅延);欠点は、TTL時間に相当するサービスが状態を中断することです。

概要

(1)TTL期間が通常の業務が+サービスを行っよりも長くなければならないすべてのRedis +クロックドリフトを取得するには時間がかかり

(2)はるかに少ないTTLよりも消費するすべてのサービスRedisの時刻を取得し、ロックの数が一般総上記で成功するために取得:N / 2 + 1

(3)各時刻取得試行Redisのインスタンス・ロックは、はるかに少ない場合TTLよりも

制限の一定数(4)すべてのロックが失敗を取得しようとした後、そこに再試行する必要があります

(5)(かかわらずかどうか一つまたは全ての)Redisの崩壊後、TTL時間が再開Redisのを遅延させます

(6)は、マルチノードに共通達成するために、単一ノード分散ロック・アルゴリズムと併せてのRedis

公開された134元の記事 ウォン称賛91 ビュー160 000 +

おすすめ

転載: blog.csdn.net/weixin_44588495/article/details/104570594