CAP定理の明確化

記事「 CAP定理の誤解 」とそれに関するコメントは、誤解があることを示しています。 また、「パーティション分割」という用語の誤った解釈だけでなく、他のレベルのメンタルエラーとも関連しています。 明確にしようとします。



コンベンション


はじめに、抽象化のレベルに同意しましょう。

定理の枠組みでは、「実世界」では、分散システムのノード間に保証された接続は存在できないと述べるのは無意味です。 同じ成功で、十分な数のノードに障害が発生した場合(すべてのノードに障害が発生した場合など)、システムへのアクセスが停止するため、「可用性」などのプロパティは原則として達成できません。



したがって、これはまだモデルであり、いくつかの仮定がその中で行われていることに同意しましょう。

クリティカルな数のシステムノードの障害の可能性は無視できると仮定します。これにより、可用性を保証することはまだ可能であると言えます。

ノードの配置とノード間の接続の性質については考慮しません。これは定理にとって重要ではありません。



技術的には、ノード間の通信が失われる確率が、重要なノードの障害の確率(無視できると見なされる)よりもさらに小さくなるシステムを作成できます。 これにより、ノード間の通信が保証され分散システム(パーティショニングが不可能)が可能になると言えます



これを正確に達成する方法は重要ではありません。 通信システムの数百万倍の複製、または粗いシリコンクラフトよりも影響を受けにくい桁違いのクラウドである超高信頼性グラビトントランスミッターの発明が必要になる場合があります。 誰かが本当にそれを望んでいるなら、これができるという事実。 4つのプロセッサが同じことを互いに確認するためだけに考慮するコンピューターが作られています。 同じ注意で、コミュニケーションの保証に近づくことができます。



死はもっと甘い


システムノードの死とそれとのコミュニケーションの損失が同等でないことを理解するのは重要です。

違いは簡単です-死んだノードは、システムの残りの部分に対して「無知から」破壊的なアクションを実行できません。 いつでも彼が永遠に死ぬように手配することができます、または彼が意識を取り戻すとき、彼は最初にシステムの残りの部分と相談して、彼が不注意に何かを壊さないようにします。



接続が切断されると、すべてが悲しくなります。 ノードは、それだけが可能であり、操作性を保証するため、それ自体が死ぬことを許可することはできません(他のノードとの通信がなければ、生きている誰かがいるかどうかは理解できません) また、彼は自分の仕事を他の人と同期させることもできません-接続はありません。 あなた自身の危険とリスクで盲目的に行動することは残っています。



具体的な例で何が起こっているか考えてください。


私たちのシステムには、まったく同じ2つのノードAとBがあり、それぞれが2番目のデータのコピーを保存し、外部からの要求を独立して処理できるとします。 リクエストを処理するそれぞれが、2番目の変更を通知して、データの一貫性を保ちます。



オプション1:ノードAが停止します。

システムは、何も起こらなかったかのように機能し続けます-Bはリクエストを処理し続けます。 Aに命が吹き込まれると、最初にBと同期し、2人はさらに作業を続けます。 アクセシビリティも一貫性も損なわれません。



オプション2:AとBは生きていますが、それらの間の接続は切断されています。

同時に、それぞれが外部からのリクエストを受け入れ続けますが、変更を2番目に通知することはできません。 各ノードについて、2番目のノードが停止しているように見え、単独で動作します。 この状況はしばしば「スプリットブレイン」と呼ばれます-脳は2つの半球に分割され、それぞれが状況の唯一の所有者であると考えています。 システムは統合失調症になりました。



その時点で、特定のレコードRを削除するリクエストがAで処理され、Bで同じレコードを変更するリクエストが処理された場合、データは一貫性がなくなりました。 AとB間の接続が復元されると、同期中に競合が発生します-Rを削除するか、変更したバージョンを残しますか? ここでは、さまざまな競合解決戦略を使用できますが、 すでに一貫性が失われています。



問題を解決する別の方法-AとBは、お互いの接続が失われたことを確認して、リクエストの処理を停止します。 この場合、一貫性は侵害されませんが、 可用性失われます。



より現実に近い


もちろん、ノードが2つだけのシステムは一般的ではありません。 しかし、AとBが2つの別個のノードではなく、2セットのノードであると仮定した場合も同様です。 同時に、A内とB内の任意の2つのノード間の通信は可能ですが、AのノードはBのノードと対話できません。さらに、両方のセットは外部からの要求の受信と処理を続けます。



実際、これは2つのデータセンター間の接続が中断された典型的な状況の説明です。 スプリットブレインは、このような単純な場合でも、統合失調症をシステムに確実に提供します。 複数のスプリットまたは異なるグループのデータセットが不完全であることが判明した場合、すべてがさらに悪化する可能性があります。



定理に戻る


定理はカリフォルニアがノードの間のコミュニケーション失敗への抵抗の損失によってだけ達成されると述べます。 実際には、これは、通信損失の可能性が無視できると考える場合にCAシステムが正しく使用されることを意味します。



どのようにしてこれを達成しますか-定理を気にしないでください。 男が何かに追いついていないことを示すために「現実の世界」を呼び出す必要はありません。 定理はモデルのフレームワーク内に存在します。 現在は真実であるため、グラビトン送信機がついに発明された明後日も真実です。



しかし、グラビトン送信機がなくても、事態はそれほど悪くありません。 データセンター間の通信の損失はそれほど一般的ではありません。 1つのデータセンター内-さらに少ない頻度で。 はい、分割が発生した場合、競合を解決する必要があります。 おそらく手作業でも、膨大な数のタスクが多くの競合を自動的に解決できますが。 しかし、おそらく、CAシステムの喜びは、万が一の分割の場合に手で何かを修理する必要性を怖がらせるよりもはるかに私たちを引き付けるでしょう。 この場合、純粋な心を持つ私たちは、将来のスーパーテクノロジーに依存することなく、問題の可能性を無視できると考えます。



プロジェクトで分割確率が十分に高いと思う場合、この方法で定理を再定式化できます。分割が発生した場合、AまたはCを選択するだけです。



叙情的な余談


さまざまな特殊なケースでCAP定理を緩和する手法があります。 人は必ずしも完全に機能するシステムを必要としません。 少なくともほとんどの場合、十分に機能することは十分です。



これらの技術には、ひどいことが起こった後に完全性を自動的に復元する試み、および可用性の完全な拒否に陥らないで、完全性の損失を防ぐ試みが含まれます。



最も単純な例:各ノードは、残りのノードの半分未満を検出すると、外部からの要求の処理を自動的に停止します。 これにより、システムが2つの不均等な部分に分割された場合、一方が機能し続け、もう一方が自動的にhara-kiriを実行し、バカなことをしないようにします。



もう1つのことは、電力が半分のままであるため、システムは完全に負荷がかかる可能性が高いことです。 ただし、もう1つのトリックを適用できます。分離されたままのノードは、競合を発生させることなく読み取りを続行できます。 集中的な読み取りを行うシステムの場合、これは非常に合理的な動きです。 確かに、与えられたデータは常に関連するとは限りませんが、多くの場合、何もないよりはましです。 ただし、複数の部分に分割された場合、書き込み要求を処理できる部分はありません。 あなたはもっとcな何かを思い付くことができますが...



どのように回避しても、CAP定理を回避することはできません。 しかし、ほとんどのプロジェクトでは、問題のシナリオの可能性を最小限に抑え、抜け出す方法を見つけるための大きな範囲があります。



PS javaspecialist 、この記事を書いた理由に感謝します。



All Articles