この記事は、分散システムにおける真実と虚偽を理解するのに役立ちます

この記事は、分散システムにおける真実と虚偽を理解するのに役立ちます

[[409590]]

分散システム内の各サーバーはインターネットを介して接続されていることはご存じのとおりです。その結果、各サーバーの実際の状態を把握することが困難になります。たとえば、別のサーバーに問題があるかどうかを判断する唯一の方法は、そのサーバーにリクエストを送信することです。返事が来た時だけ、良かったと思うのです。応答がない場合は、ネットワーク障害が原因で応答がない可能性があり、実際には相手側のマシンに問題がある可能性があるため、相手側のサーバーに問題があるかどうかを判断するのは困難です。では、分散システムでこれらの問題を正確に判断するにはどうすればよいでしょうか?この記事では関連する方法を詳しく紹介します。

多数の事実に基づく

多くの場合、ノードには実際には問題がない可能性があります。たとえば、GC を実行している場合、GC 期間中はいかなる要求にも応答できません。現時点では、ノード自体の観点から見ると、非常に大丈夫であり、問​​題はありません。しかし、他のノードから見ると、この GC ノードは問題のあるノードとまったく同じです。リクエストに応答せず、再試行にも応答しません。そのため、他のノードはそれが問題があると考えることになります。この観点から見ると、ノード自体が問題があるかどうかを知ることは実際には困難です。

現在、ノードに問題があるかどうかを判断するための最も一般的なアルゴリズムは、多数決による意思決定に基づいています。たとえば、ノードが 5 つある場合は、全員が一緒に投票します。一定数以上のノード (通常は半数以上、ここでは 3 つのノード) が問題があると判断した場合、このノードには本当に問題があると判断されます。ノード自体に問題がなくても、大多数が問題があると考えている限り、問題があるとみなします。ここで多数決が使用される理由は、システム内に多数決が 2 つ存在することはできず、1 つだけであるため、衝突が起こらないためです。

リーダーとロック

ノードに問題があるかどうかを判断する必要があるのはなぜですか?実際、分散システムでは、次のように一度しか使用できない概念が使用されるシナリオが数多くあります。

  • データベースパーティション内の1つのノードのみがリーダーになれる

  • 同時書き込みを防ぐため、オブジェクトのロックを保持できるのは 1 つのトランザクションまたはクライアントのみです。

  • ユーザー名は一意である必要があるため、ユーザーのみが登録できます。

これらのシナリオでは、設計時に注意する必要があります。たとえば、あるノードが自分だけが選択されていると考えている場合でも (たとえば、自分がリーダーであると考えている、オブジェクトのロックを持っていると考えているなど)、他のほとんどのノードは問題があると考える可能性があります。デザインが良くないと問題が発生します。次の例を見てみましょう。

この例では、複数のクライアントが同じデータにアクセスするのを防ぐために、書き込み後に各クライアントがロックを取得することを要求します。このロックはリース ロックであり、タイムアウトすると解除されます。ここでは、Client1 が最初にロックを申請したことがわかりますが、残念ながら、ロックを取得した後すぐに GC が発生し、リース タイムアウトを超えて GC が発生したため、リース タイムアウト後にロックが解放されました。その後、クライアント2はロックを取得し、更新を行いました。 GC が戻った後、クライアント 1 はロックを保持していると判断して直接書き込み、問題が発生します。ここでの問題は、GC が戻った後、クライアント 1 がロックをまだ保持していると誤って認識することです。

フェンシングトークン

では、このような誤解にどう対処すればよいのでしょうか?一般的な技術はフェンシングです。次の図に示すように:

ここで行われた変更は、ロックを取得するたびにトークン値がクライアントに返され、このトークンはロックが取得されるたびに増加することです。このように、クライアントが書き込むときに、トークンも送り返す必要があります。このようにして、ストレージはこのトークンを使用して、古いトークンの書き込みを拒否するかどうかを決定できます。

一般的な実装方法は、ZooKeeper の TransactionID またはノード バージョンを fencingToken として使用することです。

ビザンチン断層

上記の FencingToken には、クライアントによって送信されたトークンが実際に受信されるという前提があります。書き込み時にクライアントから送信されたトークンが偽のトークンである場合、明らかに fencingToken に問題が発生することが想像できます。したがって、分散システムの場合、ノードが存在すると、問題はさらに複雑になります。私たちはこの状況をビザンチン問題と呼んでいます。これは、ビザンチン将軍問題とも呼ばれることが多いものです。

ビザンチン問題のあるシステムでは、メッセージが信頼できないノードが 1 つまたは 2 つ存在する可能性があると単純に想定できます。この信頼性の低さは、次のような理由により発生する可能性があります。

  • 何らかの理由で、マシンのメモリまたは CPU レジストリ内のデータが破損しています。たとえば、レジ​​ストリの読み取り時にエラーが発生した場合は、デフォルト値や任意の値などを返します。

  • たとえば、不正行為や攻撃が発生したとします。この場合、ノードは信頼されません。

もちろん、現実には、この信頼できない問題は、ほとんどまたはすべてのノードではなく、比較的少数のノードで発生すると考えられます。したがって、ほとんどのノードで信頼できない事態が発生した場合 (たとえば、受信したトークンに常に乱数を追加するコードにバグがある場合)、対応するアルゴリズムではこの問題を解決できません。

嘘を減らす

ただし、嘘をついているノードはほとんどないと考えています。しかし、次のようなノードを検出または保護するためのメカニズムがあればさらに良いでしょう。

  • ネットワーク パケットについては、正しいかどうかを検出するためのチェックサムを追加します。

  • ユーザーの入力値が妥当な範囲内であるかどうかを確認するなど、いくつかのチェックをユーザー入力値に追加します。

  • NTP クライアントは複数のアドレスに接続し、多数派のフィードバックを参照して実際の時間を決定します。

システムモデルと現実

私たちは、さまざまな分散システムの問題を解決するために多くのアルゴリズムを設計してきました。これらのアルゴリズムは一連のソフトウェアとハ​​ードウェアのペアに基づいているため、多くの仮定があり、これらの依存関係は一般にシステム モデルと呼ばれています。

たとえば、時間の仮定について話すとき、次の 3 つが一般的なシステム モデルです。

同期モデル

いわゆる同期モデルとは、ネットワークの遅延、プロセスの一時停止、クロックのドリフトが一定の制限を超えないことがわかっていることを意味します。もちろん、ネットワーク遅延がないという意味ではなく、制限を超えないことがわかっているという意味です。もちろん、このモデルは現実には現実的ではありません。予期しない遅延が常に発生するからです。

部分同期モデル

いわゆる部分同期モデルは、ほとんどの場合に同期モデルと見なされるもので、特定の制限を超えることはありませんが、場合によってはこれらの制限を超えることもあります。これはより現実的なモデルです。

非同期モデル

このモデルはいかなる仮定も行わず、クロックさえ信頼しません。たとえば、タイムアウトは使用しません。このモデルの制限は非常に大きいです。

時間に関する上記の想定に加えて、もう 1 つの一般的な問題は、ノード障害の想定です。通常、次の 3 つのモデルがあります。

クラッシュストップエラー

このモデルでは、ノードに応答しないなどの問題がある場合、そのノードは二度と戻ってこないとアルゴリズムが判断します。

クラッシュ回復エラー

このモデルでは、アルゴリズムはノードに問題があり、しばらくすると再発すると考えます。もちろん何が戻ってくるかは分かりません。これには、クラッシュ後でも回復できるように、ディスクに多くのものを書き込むなど、ノードに共通のストレージ メディアが必要になる場合があります。

ビザンチンエラー

上で述べたように、ノードには何でも起こり得ます。

実際に見られる最も一般的なモデルは、部分的に同期したクラッシュ回復エラーです。では、分散システムのアルゴリズムはこれらのモデルをどのように使用するのでしょうか?

アルゴリズムの正確さ

アルゴリズムの正しさを判断するときは、いくつかの特性を使用して判断する必要があります。たとえば、小さいものから大きいものに並べ替えるアルゴリズムでは、出力内の 2 つの異なる要素は、前者が後者よりも小さいという要件を満たす必要があります。これが最も簡単な判断方法です。

同様に、分散システムのアルゴリズムが正しいかどうかをどのように判断するのでしょうか?ロックを例に挙げてみましょう。判断には次の属性を使用できます。

ユニークさ

2 つのリクエストが同じトークンを受信することはありません。

単調増加

x を要求するトークンが tx であり、y を要求するトークンが ty であり、x が y の前にある場合、tx<ty です。

信頼性

ノードがリクエストを送信すると、クラッシュしない限り、最終的には応答を受信します。

安全性と活力

ここでは、セキュリティと活性という 2 つの概念を区別する必要があります。例えば、上記の例では、一意性と単調増加性が安全性であり、信頼性が活力です。両者の簡単な違いは、一般的に安全性は悪いことが起こり得ないことを意味し、活力は良いことが最終的に起こることを意味するということです。これら 2 つを区別することで、より複雑なシステム モデルを処理できるようになります。

要約する

この記事では、分散システムにおける現実の判断と処理について詳しく紹介します。皆様に大まかな理解をしていただければ幸いです。

<<:  ハイブリッドおよびマルチクラウド アーキテクチャを実現する 5 つのテクノロジー

>>:  2021年中国人事担当者スーパーセレモニーが開幕、デジタル時代の中国人事担当者の「栄光」と「夢」を見つめる

推薦する

「2021 年の調査データの傾向を見て、企業のデジタル変革におけるクラウドの道を解釈する」

クラウド コンピューティングは、当初の構想から今日の広範な実装に至るまで、企業向けクラウド コンピュ...

Baiduは外部リンクツールをリリースしており、4つの主要な機能を備えている。

10月30日午後、Baidu Webmaster Platformツールが更新されました。アドレスは...

RocketMQ プロデューサーにこれほど多くの用途があることをなぜ知らなかったのでしょうか?

[[383770]]この記事はWeChatの公開アカウント「大宇賢人」から転載したもので、著者は大宇...

色彩心理学を活用してウェブサイトのコンバージョン率を向上させる方法(パート 1): ウェブサイトに適した色を選択する

色は人の態度や気分に大きな影響を与える可能性があります。私たちの目が特定の色を見ると、視床下部と呼ば...

国慶節の休暇中に、旅行会社向けのWeChatマーケティングの秘密を知りたいですか?

月収10万元の起業の夢を実現するミニプログラム起業支援プラン建国記念日の祝日が近づいてきました。どこ...

現在のセルフサービス Web サイト構築プラットフォームをどのように評価しますか?

セルフサービス型ウェブサイト構築ツールのデザインは似すぎているたとえば、Fanke の Web サイ...

fliphost-256M メモリ/5gSSD/G ポート/年間 24 ドル/6 時間ごとにデータ バックアップ、ワンクリックで復元

Fliphost.net は優れた VPS 業者です。顧客ベースは buyvm よりはるかに少ないで...

ウェブサイトの外部リンクが繰り返し変動している理由について簡単に説明します。

外部リンクは、私たちが常により注意を払う部分です。すべてのサイトの SEO 最適化のプロセスでは、外...

#11.11# losangelesvps: 月額 4 ドル、KVM 仮想 VPS/2G メモリ/1Gbps 帯域幅/無制限トラフィック、月 1 回の無料 IP 変更

losangelesvpsの11.11中国イベントが始まりました。INAPのロサンゼルスデータセンタ...

ユーザーをつなぐクリエイティブマーケティング

ユーザーをつなぐクリエイティブマーケティングユーザー同士を結びつけるクリエイティブなマーケティングと...

インフォア、コールマン AI デジタルアシスタントを発表

業界特化型クラウド アプリケーションの大手プロバイダーである Infor は本日、Infor Clo...

クラウドのユースケース: セントジュードはクラウドを使用して小児がんと闘っています

セントジュード小児研究病院はゲノムデータベースをクラウドに移行し、世界中の科学者に共同プラットフォー...

ブロックチェーンを使用して、企業がマルチクラウド管理の問題を解決できるようにするにはどうすればよいでしょうか?

[[257045]]昨年発表された調査レポートによると、世界中の企業の 81% がマルチクラウド戦略...

タオバオアライアンスのルール変更がタオバオ顧客に与える影響(第9回)

これは、タオバオアライアンスの規則変更がタオバオアフィリエイトに与える影響に関するシリーズの第9回で...

ウェブサイト構築前のSEO対策について

現在、ウェブサイトの構築と SEO の最適化は別々に行われています。通常、SEO の最適化はウェブサ...