ACID特性 と CAP定理 について勉強してみた

ACID特性 と CAP定理 について勉強してみた

こんばんは。七色メガネです。

GCPのRDBやNoSQLについて勉強していたら「一貫性」とか「可用性」なんていうワードが出てきて、あー知ってるーDBのACID何とかでしょー、とか思いながら読んでいたんですけど、ふと調べたら、可用性はACID特性じゃなくてCAP定理の1つだとか。

可用性って言葉からなんとなくイメージはつくけれども、じゃあACID特性とCAP定理の違いは?なんて突っ込まれたら答えられないことは明白なので、今回この2つの考え方について勉強します。

ACID特性とは?

ACID特性とは、トランザクション処理において必要とされる4要素の頭文字をとった言葉です。

Atomicity

原子性、あるいは不可分性。トランザクションに含まれる全ての処理が行われるか、あるいは全て行われないことを保証する性質です。
通帳からお金を引き出してそのまま他の口座に入金を行おうとした時、出金はされたけれども入金はエラーになった、なんてことが起きたらお金が何処かに消えちゃいますね。入金がエラーになったら出金も取り消さなければいけません。
これを体現する考え方が、Atomicity です。

Consistency

一貫性、あるいは整合性。トランザクションの開始時と終了時に、データが整合性を保てていることを保証する性質です。
1億円を出金して他の口座に入金しようとした時、前提として1億円が手元になければいけませんね。1億円が無ければ出金出来ないことを保証するのが、Consistency です。

Isolation

独立性、あるいは隔離性。トランザクション中の内容が他のトランザクションから参照、観測されないことを保証する性質です。
AさんとBさんが同じ口座から出金を行おうとしているとしましょう。口座には1万円が入っています。Aさんが1万円全ての出金処理を行なっているときに、それが完了していない間にBさんも1万円を出金しようとして、仮に成功してしまったら、1万円しか入っていない口座から2万円が出金されてしまいますね。
このようなことが起きないように、Aさんが出金処理を行なっている間(トランザクション中)にはBさんがそのデータを扱えないことを保証するのが Isolation です。Bさんが出金できるのは、Aさんのトランザクションの前か、後のみです。

Durability

永続性、あるいは持続性。トランザクションの処理が確定した時点で、その操作は取り消されず結果が失われないことを保証する性質です。
会社の社長さんが社員さんに給料を支払うというトランザクションを終了させた後に、何らかのエラーでその支払い履歴が消えてしまったらどうなるでしょう。社長さんは社員さんにもう一度お給料を払わなければいけなくなって社員さんがハッピーになり過ぎちゃいますね。
このようなことが起きないよう、確定した処理は永続的に保存されるということを保証するのが Durability です。実際には障害でこういったことが起きる可能性があるので、処理の履歴をとっておくなどして復旧可能な状態を保つことで実現されます。

トランザクションとACID特性

トランザクションとは、データベースにおいて一連の処理全体の一貫性が保たれるように管理する仕組みのことです。
先ほどから引いている入出金の例で言えば、入金から出金までの一連の処理全体のことですね。
このトランザクションにおいて一貫性が保たれなければデータとして綻びが生じるので、その一貫性を保証するために考えられたのがACID特性です。つまり、ACID特性とはトランザクションが備えている性質であり、また備えなければいけない性質です。

RDB と トランザクション

RDB(リレーショナル・データベース)の本質は、データを表として管理し、表と表との間の関係性を定義することで複雑なデータの関連性を保持したまま管理・運用ができる、という点にあります。

当然ここでは、トランザクションが重要視されます。
データストレージが単一であり、障害が絶対に起きないと仮定した場合、理論上はトランザクションを完璧に成立させることが可能でしょう。

しかし現実には障害が発生し得ます。ストレージが単一であれば障害発生とともに可用性が0になりますから、ストレージを複数用意しておく必要が生じます。

すると、複数のストレージ間でデータを同期する必要も生じます。
データの同期を視野に入れると、最新データが常に取得されない可能性も考えられてきます。

このように、RDBでトランザクションが重要視されることは当然ですが、現実問題、常にトランザクションを完璧に保証することは難しいことです。そこでは、何かしらのポイントを犠牲にした上でトランザクションが成立するように設計が行われます。

どのような設計方針があるのかの説明は、後述のCAP定理に譲ります。

CAP定理とは?

さてここで、分散データの管理における考え方に触れましょう。CAP定理です。
CAP定理はブリュワーの定理とも呼ばれます。Webサービスに用いられることを想定した分散コンピューティング間の情報複製に関する考え方です。

概要を述べると、CAP(一貫性、可用性、分断耐性)の全てを同時に完璧に保証することは難しい、ということを説明する論です。

Consistency (一貫性)

一貫性とは、全てのデータ読み込みについて、「最新のデータ」あるいは「エラー」が返却されるという性質です。

通常、データが複製されているとき、一方のデータが更新されたらもう一方のデータも同じように更新します。
この状態でクライアントがデータを要求したならば、複製されたデータのいずれにアクセスしても「最新データ」が返却されます。

しかし複製先への更新が終了する前に、あるいは複製先への更新に失敗した状態でクライアントがデータを要求したならばどうでしょう。
複製元データへのアクセスならば「最新データ」を返すことができるので問題ありません。しかし複製先データ(更新に失敗したデータ)にアクセスがあったならば、「最新ではないデータ」を返してしまいますね。これでは一貫性が失われてしまいます。

ここで複製先データが返却するべきなのは、「(まだ更新が終了しておらず最新データであることが保証できないので)エラーです」という応答です。これならば、データこそ返せませんが、少なくとも複製元と複製先で返却するデータが異なるということは起きません。

以上が、”(一貫性が保たれていれば)全てのデータ読み込みについて「最新のデータ」あるいは「エラー」が返却される” の意味です。

Availabilitty (可用性)

可用性とは、ノード障害により生存ノードの機能性が損なわれない、という性質です。

データがAとBというストレージに複製されていた場合、A側のストレージが障害でダウンしてしまったとします。
この時Aの障害の影響を受けずに、B側のストレージがサービスを継続することができる、というのが可用性です。

Partion-Tolerance (分断耐性)

分断耐性とは、ネットワーク分断によりサーバー・グループが分割されてしまってもサービスを継続することができる、という性質です。

これ単体ではわかりにくいので、詳細は後述。

 

C / A / P の組み合わせ

一貫性、可用性、分断耐性の3つについて概要を確認しました。
復習ですが、CAP定理とは “これら3つの性質が同時に成立するのは難しい” という考え方でした。
逆に言えば、2つまでは同時に成立するということです。
成立するパターンを整理してみましょう。

CA パターン(分断耐性が低い)

前提:

・2つのデータストレージが存在する。
・2つのストレージはネットワークで同期され、一方のストレージ内データへの更新はもう一方へも伝播する。

設計

・データは常に「最新データ」を返すものとする。(=一貫性)
・一方のストレージがダウンした場合、もう一方のストレージは単独でサービスを継続する。(=可用性)

問題

・2つのストレージ間のネットワークが分断された時、お互いの状態を知ることができなくなる。
(=分断耐性が無いために、分断された時に一貫性と可用性が損なわれる)

CPパターン(可用性が低い)

前提:

同上

設計

・2つのストレージ間のネットワークが分断された時、アクセスされたデータが最新であることを保証できなければ「エラー」を返すものとする。(=分断耐性と一貫性)

問題

・一方のストレージに障害が起きた時、利用できないサービスが発生する。
(=最新データでなければエラーを返すので、ストレージ障害時に絶対に利用できないデータが出現し、可用性が低下する)

 

APパターン(一貫性が低い)

前提:

同上

設計

・一方のストレージがダウンした場合、もう一方のストレージはそれを察知し、単独でサービスを継続する。(=可用性)
・2つのストレージ間のネットワークが分断された時、各個のストレージが保持するデータを用いてサービスを継続する(=分断耐性)

問題

・分断時でもデータを必ず返すので、最新データであることを保証できない。
(=ストレージAとBで異なったデータを返却することがあり、一貫性が低下する)

まとめ

書いておいて難ですが、ACIDはともかく、CAPは文章だけでは分かりにくいところがありますね。
CAPについてはまた別の機会でもう少し深く掘り下げられたらなと思います。

とりあえず今回のまとめは以下です。

  • ACID特性とはトランザクションの持つべき性質を説明したものである。
  • ACID特性とは、原子性、一貫性、独立性、永続性のことである。
  • データ分散を考慮すると、トランザクションの保証が揺らぐ場面などが発生する。
  • データ分散における性質のトレードオフについての考え方にCAP定理というものがある。
  • CAP定理とは、一貫性、可用性、分断耐性の性質が3つ同時に成立することは難しい、ということを説明するものである。

 

以上です。ここまで読んでいただき、ありがとうございました!

参考

https://www.weblio.jp/content/ACID%E7%89%B9%E6%80%A7
https://www.weblio.jp/content/%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B6%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E5%87%A6%E7%90%86
https://ja.wikipedia.org/wiki/ACID_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E7%A7%91%E5%AD%A6)
https://boxil.jp/mag/a3032/

DBカテゴリの最新記事