コンテンツに移動
Google Cloud

Cloud Spanner と CAP 定理

2017年2月24日
Google Cloud Japan Team

グローバルに分散化されたデータを扱い、データの一貫性を維持しながら高可用性をも実現するシステムを構築しようとしたら、それは簡単なことではありません。クラウドの良いところは、誰かがそれを構築して、誰にでも使えるようにしてくれることです。

CAP 定理によると、データベースは以下の 3 つの望まれる特性のうち、2 つまでしか持てないとあります。

  • C(Consistency): 一貫性、共有されているデータが唯一の値を持つ
  • A(Availability): 可用性、読み込みと書き込みの両方で 100% の可用性が確保されている
  • P(Partition Tolerance): 分断耐性、ネットワークの分断に対する耐性がある
ここから導かれるシステムは 3 種類で、除く文字に応じて CA、CP、AP となります。これは、システムの設計者に 3 つから 2 つを選ぶことを強いるものではなく、実際多くのシステムはこれらのうち 1 つの特性しか持っていないか、あるいはどの特性も持っていません。

ワイド エリアにわたる広域の分散システムでは、あたり前のことだとは言えないものの、一般的に分断が起きることは避けられないと見られています。では、分断が避けられないとするなら、一貫性を犠牲にするか(AP)、可用性を犠牲にするか(CP)選ばなければならないのかと言うと、それも誰も望まない選択です。

CAP 定理の意図は本来、設計者にこのトレードオフを真剣に考えてもらうことにありました。ですが、ここでは 2 つの注意すべきことを挙げます。第 1 に、一貫性や可用性を犠牲にしなければならないのは、実際に分断が起こっている間だけで、その間であっても、それを緩和する方法は多くあるということ。第 2 に、定理には 100% の可用性とありますが、そこで議論すべきなのは、現実的な高可用性の実現に伴うトレードオフについてです。

Spanner が Google Cloud へ

Google Cloud Platform(GCP)で利用できる Cloud Spanner は、Google のグローバルな高可用性 SQL データベースです。データのサイズ、トランザクション量の両面からも、大規模にレプリケーションされたデータを管理します。そこで書き込まれる全てのデータにはグローバルに一貫したタイムスタンプが付与され、クライアントはロックすることなくデータベース全体からデータをグローバルに一貫して読み込むことができます。

Spanner はワイド エリアで扱えるものでありながら、一貫性と高可用性を両立するとありますが、CAP の観点から見ると、多くの人が意外に、あるいは疑わしいとさえ思うでしょう。これは議論すべき題材です。はたして Spanner は CAP で定義されているような CA システムなのだろうかと。端的に答えると、技術的には違いますが、実際のところ CA システムだと考えて構いません。

違うというのは、ネットワークの分断が発生したときで、実際に Google で起こりました。分断が起きると Spanner は C を選択し、A を犠牲にします。つまり技術的に見ると、Spanner は CP システムなのです。

それでも 100% の可用性を実現するシステムはないことから、結局のところ障害が起きることを考えなくてもいいほどの高い可用性が Spanner にはあるのかという問に行き着きます。言い換えると、アプリケーションの障害には多くの原因があるなかで、Spanner がダウンタイムの原因となることが殆どなければ良いということになります。

検証してきたなかで Spanner はこの水準を 99.999% を超える可用性(障害が発生する割合が 105 分の 1 未満)で満たすことがわかりました。それを考慮すると、マルチリージョンの Cloud Spanner の可用性が 99.999% に設定されているのは妥当でしょう。追加された新しい要素があることから、しばらくは多少のリスクが想定されるからです。

Spanner の内側

次の問は、Spanner がこの可用性をどのように達成しているのかということです。

いくつかの要因があるなか、なにより大きな要因は Spanner が Google のプライベート ネットワーク上で稼働しているということです。殆どのワイド エリア ネットワーク、ましてやパブリック インターネットとは異なり、Google が全体をコントロールしているネットワークであることから、ハードウェアや経路の冗長性の確保から、アップグレードや一般的なオペレーションまでも自ら制御できます。それでもファイバの断線や機器の故障はありますが、システム全体としては堅牢に保たれます。

ここに至るには、何年にもわたるオペレーションの改善も大きく、ここ 10 年あまり Google は冗長性、障害の抑制、そして何よりもプロセスを進化していくために改善してきました。その結果、ただでさえ稀な Spanner の障害の中でも、ネットワークが原因となる割合は 10% にも届きません。

世界中をまたがってデータを管理し、データの一貫性を備え、高可用性をも実現するシステムを構築することは可能です、ただし容易なことではありません。クラウドの良いところは、誰かがそれを構築して、誰にでも使えるようにしてくれることです。代わりに、そのシステムを使い構築する、あなたのサービスやアプリケーションの中心となるイノベーションを生み出すことに集中してください。

次のステップ

さらに踏み込んで見ていくなら、Spanner のリリースに合わせて公開されたホワイトペーパーで、Spanner とその一貫性と可用性の詳細について新しいデータを交え説明しています。また、グローバルに同期したクロック、TrueTime システムの役割にも触れています。TrueTime も今後 GCP のお客様が直接利用できるようにリリースする予定です。

サンフランシスコで 3 月に開催される Google Cloud Next '17 では、Cloud Spanner に関連する新しいセッションを追加しています。席に限りがあるので、早めに申し込みを済ませてください。

* この投稿は米国時間 2 月 14 日、Google Cloud の Vice President of Infrastructure である Eric Brewer によって投稿されたもの(投稿はこちら)の抄訳です。

- By Eric Brewer, Vice President of Infrastructure, Google Cloud

投稿先