Cassandraドキュメント

バージョン

プレリリース版のドキュメントを表示しています。

最新版を表示

Dynamo

Apache Cassandraは、AmazonのDynamo分散ストレージキーバリューシステムの多くの技術に依存しています。Dynamoシステムの各ノードには、主に3つのコンポーネントがあります。

  • パーティション化されたデータセットに対するリクエストの調整

  • リングメンバーシップと障害検出

  • ローカル永続性(ストレージ)エンジン

Cassandraは主に最初の2つのクラスタリングコンポーネントから派生しており、ログ構造マージツリー(LSM)に基づくストレージエンジンを使用しています。特に、CassandraはDynamoスタイルの以下に依存しています。

  • 一貫性のあるハッシュを使用したデータセットのパーティショニング

  • バージョン管理されたデータと調整可能な一貫性を使用したマルチマスターレプリケーション

  • ゴシッププロトコルを介した分散クラスタメンバーシップと障害検出

  • コモディティハードウェアでのインクリメンタルスケールアウト

Cassandraは、大規模(PiB +)のビジネスクリティカルなストレージ要件を満たすためにこのように設計されました。特に、アプリケーションがペタバイト規模のデータセットの完全なグローバルレプリケーションと、常に利用可能な低遅延の読み取りと書き込みを要求するにつれて、当時のリレーショナルデータベースシステムがグローバル規模のアプリケーションの新しい要件を満たすのに苦労していたため、新しい種類のデータベースモデルを設計することが不可欠になりました。

データセットのパーティショニング:一貫性のあるハッシュ

Cassandraは、ハッシュ関数を使用してシステムに保存されたすべてのデータをパーティショニングすることにより、水平方向のスケーラビリティを実現します。各パーティションは、ラックやデータセンターなどの障害ドメインをまたいで、複数の物理ノードに複製されます。すべてのレプリカが所有するすべてのキーへの変更を独立して受け入れることができるため、すべてのキーはバージョン管理されている必要があります。決定論的なバージョンとベクタークロックを使用してキーへの同時更新を調整した元のDynamo論文とは異なり、Cassandraは、すべての変更にタイムスタンプ(削除を含む)が付けられ、最新バージョンのデータが「勝ち」の値となる、より単純なlast-write-winsモデルを使用します。形式的には、Cassandraは、各CQL行に対して、LWW-Element-Set CRDTのLast-Write-Wins Element-Set conflict-free replicated data typeを使用して、レプリカセットでの競合する変更を解決します。

トークンリングを使用した一貫性のあるハッシュ

Cassandraは、一貫性のあるハッシュと呼ばれる特殊な形式のハッシュを使用して、ストレージノード全体にデータをパーティショニングします。単純なデータハッシュでは、通常、キーのハッシュをバケット数で割った余りを取ることで、キーをバケットに割り当てます。たとえば、単純なハッシュを使用してデータを100個のノードに分散したい場合は、すべてのノードを0から100の間のバケットに割り当て、入力キーの100を割った余りをハッシュし、関連付けられたバケットにデータを保存します。ただし、この単純なスキームでは、単一のノードを追加すると、ほぼすべてのマッピングが無効になる可能性があります。

代わりにCassandraは、すべてのノードを連続ハッシュリング上の一致以上のトークンにマッピングし、キーをリングにハッシュして、Chordアルゴリズムと同様に、リングを一方向に「歩く」ことで所有権を定義します。一貫性のあるハッシュと単純なデータハッシュの主な違いは、ハッシュするノード(バケット)の数が変化した場合、一貫性のあるハッシュはキーのほんの一部を移動するだけでよいということです。

たとえば、均等に配置されたトークンを持つ8つのノードのクラスタがあり、レプリケーションファクタ(RF)が3の場合、キーの所有ノードを見つけるには、まずそのキーをハッシュしてトークンを生成し(これはキーのハッシュにすぎません)、次にリングを時計回りに「歩いて」3つの異なるノードに遭遇するまで続けます。その時点で、そのキーのすべてのレプリカが見つかったことになります。このgRF = 3の8つのノードのクラスタの例は、次のように視覚化できます。

image

Dynamoのようなシステムでは、キーの範囲(トークン範囲とも呼ばれる)が同じ物理ノードのセットにマッピングされることがわかります。この例では、トークン1を除外してトークン2を含むトークン範囲に該当するすべてのキー(grange(t1、t2])は、ノード2、3、4に保存されます。

物理ノードごとの複数のトークン(vnode)

単純な単一トークンの一貫性のあるハッシュは、データを分散させるための多くの物理ノードがある場合はうまく機能しますが、均等に配置されたトークンと少数の物理ノードでは、インクリメンタルスケーリング(容量のわずかなノードの追加)は、リングのバランスを保つことができる新しいノードのトークン選択がないため、困難です。Cassandraは、トークンの不均衡がリクエスト負荷の不均一につながるため、トークンの不均衡を回避しようとします。たとえば、前の例では、不均衡を引き起こすことなく9番目のトークンを追加する方法はありません。代わりに、既存の範囲の中点に8トークンを挿入する必要があります。

Dynamo論文では、この不均衡問題を解決するために「仮想ノード」を使用することを推奨しています。仮想ノードは、トークンリング内の複数のトークンを各物理ノードに割り当てることで問題を解決します。単一の物理ノードがリング内で複数の位置を取れるようにすることで、小規模なクラスタをより大きく見せることができ、したがって単一の物理ノードを追加した場合でも、さらに多くのノードを追加したように見せることができます。つまり、単一のノードを追加した場合でも、より多くのリングネイバーからより小さなデータを取得できます。

Cassandraは、これらの概念を処理するためにいくつかの用語を紹介します。

  • トークン:Dynamoスタイルのハッシュリング上の単一の位置。

  • エンドポイント:ネットワーク上の単一の物理IPとポート。

  • ホストID:単一の「物理」ノードの一意の識別子。通常、1つのgEndpointに存在し、1つ以上のgTokensが含まれます。

  • 仮想ノード(またはvnode):同じ物理ノード、つまり同じgHost IDを持つノードが所有するハッシュリング上のgToken。

トークンからエンドポイントへのマッピングにより、Cassandraがどのリング位置がどの物理エンドポイントにマッピングされるかを追跡するトークンマップが発生します。たとえば、次の図では、すべてのノードに2つのトークンを割り当てることで、4つの物理ノードのみを使用して8つのノードのクラスタを表すことができます。

image

物理ノードごとの複数のトークンには、次の利点があります。

  1. 新しいノードが追加されると、リング内の他のノードからほぼ同じ量のデータを受け入れるため、クラスタ全体でデータが均等に分散されます。

  2. ノードが廃止されると、リングの他のメンバーにほぼ均等にデータが失われ、クラスタ全体でデータの均等な分散が維持されます。

  3. ノードが利用できなくなると、クエリ負荷(特にトークン対応のクエリ負荷)が他の多くのノードに均等に分散されます。

ただし、複数のトークンにはデメリットもあります。

  1. すべてのトークンは、トークンリング上で最大2 * (RF - 1)個の追加のネイバーを導入します。これは、トークンリングの一部で可用性を失うノード障害の組み合わせが増えることを意味します。トークンが多いほど、停止の確率が高くなります

  2. クラスター全体のメンテナンス操作は、しばしば遅延します。例えば、ノードあたりのトークン数が増加すると、クラスターが行う必要のある個別の修復操作の数も増加します。

  3. トークン範囲にまたがる操作のパフォーマンスが影響を受ける可能性があります。

Cassandra 2.xでは、利用可能なトークン割り当てアルゴリズムはランダムなトークンを選択するものであり、バランスを保つためにはノードあたりのデフォルトのトークン数を256と非常に高くする必要がありました。これにより、多くの物理エンドポイントが結合され、可用性のリスクが増加しました。そのため、3.x +では、リングが最適にバランスされるように、より少ない数の物理ノードあたりのトークンでトークンをインテリジェントに選択する新しい決定論的なトークンアロケータが追加されました。

マルチマスターレプリケーション:バージョン付きデータと調整可能な整合性

Cassandraは、高い可用性と耐久性を維持するために、データのすべてのパーティションをクラスター内の多くのノードに複製します。変更が発生すると、コーディネーターはパーティションキーをハッシュしてデータが属するトークン範囲を決定し、レプリケーション戦略に従ってそのデータのレプリカに変更を複製します。

すべてのレプリケーション戦略には、パーティションのコピーをいくつ作成すべきかをCassandraに示すレプリケーションファクターRF)の概念があります。例えば、RF=3のキースペースでは、データは3つの異なるレプリカに書き込まれます。レプリカは常に、必要に応じて仮想ノードをスキップすることで、異なる物理ノードになるように選択されます。レプリケーション戦略では、ラックやデータセンターなどの同じ障害ドメインにあるノードをスキップして、Cassandraクラスターがラック全体やノードのデータセンター全体の障害を許容できるようにすることもできます。

レプリケーション戦略

Cassandraはプラグ可能なレプリケーション戦略をサポートしており、特定のトークン範囲のレプリカとして機能する物理ノードを決定します。データのすべてのキースペースには、独自のレプリケーション戦略があります。すべての本番環境デプロイメントではNetworkTopologyStrategyを使用する必要があり、SimpleStrategyレプリケーション戦略は、クラスターのデータセンターレイアウトをまだ知らないテストクラスターでのみ役立ちます。

NetworkTopologyStrategy

NetworkTopologyStrategyでは、クラスター内の各データセンターに指定されたレプリケーションファクターが必要です。クラスターが単一のデータセンターのみを使用している場合でも、後で必要になった場合に物理または仮想の新しいデータセンターをクラスターに追加しやすくするために、SimpleStrategyよりもNetworkTopologyStrategyが推奨されます。

NetworkTopologyStrategyは、データセンターごとにレプリケーションファクターを個別に指定できるようにするだけでなく、Snitchで指定されたように、データセンター内の異なるラックからレプリカを選択しようとします。ラックの数がデータセンターのレプリケーションファクター以上の場合、各レプリカは異なるラックから選択されることが保証されます。そうでない場合は、各ラックに少なくとも1つのレプリカが保持されますが、一部のラックには複数のレプリカが保持される場合があります。このラックを認識する動作には、潜在的に驚くべき影響があることに注意してください。例えば、各ラックに均等な数のノードがない場合、最も小さいラックのデータ負荷がはるかに高くなる可能性があります。同様に、単一のノードが真新しいラックにブートストラップされると、リング全体に対してレプリカと見なされます。このため、多くのオペレーターは、単一のアベイラビリティーゾーンまたは同様の障害ドメイン内のすべてのノードを単一の「ラック」として構成することを選択します。

SimpleStrategy

SimpleStrategyでは、単一の整数replication_factorを定義できます。これは、各行のコピーを格納する必要があるノード数を決定します。例えば、replication_factorが3の場合、3つの異なるノードが各行のコピーを格納する必要があります。

SimpleStrategyは、構成されたデータセンターやラックを無視して、すべてのノードを同一に扱います。トークン範囲のレプリカを決定するために、Cassandraはリング内のトークンを、対象のトークン範囲から開始して反復処理します。各トークンについて、所有ノードがレプリカのセットに追加されているかどうかを確認し、追加されていない場合は、セットに追加します。このプロセスは、replication_factor個の異なるノードがレプリカのセットに追加されるまで続きます。

一時レプリケーション

一時レプリケーションは、元のDynamo論文には存在しないCassandra 4.0の実験的な機能です。この機能を使用すると、増分修復されていないデータのみを複製するようにレプリカのサブセットを構成できます。この構成は、データの冗長性と可用性を分離します。例えば、RF=3で複製されたキースペースがあり、それを2つの一時レプリカを持つRF=5に変更すると、ストレージ使用量を対応して増やすことなく、1つの障害レプリカを許容する状態から2つの障害レプリカを許容する状態に移行します。現在、3つのノードが特定のトークン範囲のすべてのデータを複製し、他の2つのノードは増分修復されていないデータのみを複製します。

一時レプリケーションを使用するには、まずcassandra.yamlでオプションを有効にします。有効にすると、SimpleStrategyNetworkTopologyStrategyの両方を、データを一時的に複製するように構成できます。レプリケーションファクターを<total_replicas>/<transient_replicasとして指定して構成します。SimpleStrategyNetworkTopologyStrategyの両方が一時レプリケーションの構成をサポートしています。

一時的に複製されたキースペースは、read_repairNONEに設定されたテーブルの作成のみをサポートします。単調読み取りは現在サポートされていません。また、4.0では、LWT、ログバッチ、またはカウンターを使用することはできません。おそらく、一時的に複製されたキースペースでマテリアライズドビューを使用することはできず、おそらくそれらでセカンダリインデックスを使用することもできないでしょう。

一時レプリケーションは、本番環境での使用に対応していない実験的な機能です。対象となるのは、特定のアプリケーションのデプロイメントを完全に検証できる経験豊富なCassandraユーザーです。つまり、読み取り、書き込み、デコミッション、削除、再構築、修復、および置換などの操作が、クエリ、データ、構成、運用方法、および可用性の要件で機能することをチェックする経験があるということです。

4.nextで予想される追加機能は、一時レプリケーションでの単調読み取りのサポート、およびLWT、ログバッチ、カウンターです。

データバージョン管理

Cassandraは、データの最終的な整合性を保証するために、ミューテーションタイムスタンプバージョン管理を使用します。具体的には、システムに入るすべてのミューテーションは、クライアントクロックから、またはクライアント提供のタイムスタンプがない場合は、コーディネーターノードのクロックから提供されたタイムスタンプを使用します。更新は、後書き優先の競合解決ルールに従って解決されます。Cassandraの正確さはこれらのクロックに依存するため、NTPなどの適切な時間同期プロセスが実行されていることを確認してください。

Cassandraは、CQLパーティション内のすべての行のすべての列に個別のミューテーションタイムスタンプを適用します。行はプライマリキーによって一意であることが保証されており、行内の各列は、後書き優先の競合解決に従って同時ミューテーションを解決します。これは、パーティション内の異なるプライマリキーへの更新が、実際には競合なしで解決できることを意味します。さらに、マップやセットなどのCQLコレクションタイプは、この同じ競合のないメカニズムを使用します。つまり、マップとセットへの同時更新も解決されることが保証されます。

レプリカ同期

Cassandraのレプリカはミューテーションを個別に受け入れることができるため、一部のレプリカが他のレプリカよりも新しいデータを持っている可能性があります。Cassandraには、読み取りパスのレプリカ読み取り修復 <read-repair>や書き込みパスのヒント付きハンドオフ <hints>など、レプリカの収束を促進するための多くのベストエフォート技術があります。

ただし、これらの技術はベストエフォートにすぎません。最終的な整合性を保証するために、CassandraはレプリカがMerkleツリーと呼ばれるデータセットに対して階層的なハッシュツリーを計算し、それらをレプリカ間で比較して不一致のデータを特定するアンチエントロピー修復 <repair>を実装します。元のDynamo論文と同様に、Cassandraはレプリカがデータセット全体をハッシュし、Merkleツリーを作成し、それらを相互に送信して、一致しない範囲を同期する完全な修復をサポートします。

元のDynamo論文とは異なり、Cassandraはサブレンジ修復と増分修復も実装しています。サブレンジ修復を使用すると、Cassandraは、データ範囲の一部のみにまたがる多数のツリーを作成することにより、ハッシュツリーの解像度(場合によっては単一のパーティションレベルまで)を上げることができます。増分修復を使用すると、Cassandraは最後の修復以降に変更されたパーティションのみを修復できます。

調整可能な整合性

Cassandraは、整合性レベルを通じて、整合性と可用性の間の操作ごとのトレードオフをサポートしています。Cassandraの整合性レベルは、オペレーターが読み取り(R)および書き込み(W)に参加する必要があるノード数をレプリケーションファクター(N)よりも大きく構成できるDynamoのR + W > N整合性メカニズムのバージョンです。Cassandraでは、代わりに、オペレーターがレプリケーションファクターを知らなくてもRWの動作を選択できる一般的な整合性レベルのメニューから選択します。一般に、書き込み整合性レベルとのクォーラム交差を保証するのに十分なノードが読み取り整合性レベルに含まれている場合、書き込みは後続の読み取りに表示されます。

次の整合性レベルを利用できます

ONE

単一のレプリカのみが応答する必要があります。

TWO

2つのレプリカが応答する必要があります。

THREE

3つのレプリカが応答する必要があります。

QUORUM

レプリカの過半数(n/2 + 1)が応答する必要があります。

ALL

すべてのレプリカが応答する必要があります。

LOCAL_QUORUM

ローカルデータセンター(コーディネーターがあるデータセンター)内のレプリカの過半数が応答する必要があります。

EACH_QUORUM

各データセンター内のレプリカの過半数が応答する必要があります。

LOCAL_ONE

単一のレプリカのみが応答する必要があります。マルチデータセンタークラスターでは、これにより、読み取りリクエストがリモートデータセンターのレプリカに送信されないことも保証されます。

ANY

単一のレプリカが応答するか、コーディネーターがヒントを保存する場合があります。ヒントが保存された場合、コーディネーターは後でヒントを再生し、レプリカにミューテーションを配信しようとします。この整合性レベルは、書き込み操作でのみ受け入れられます。

書き込み操作は、整合性レベルに関係なく、常にすべてのレプリカに送信されます。整合性レベルは、コーディネーターがクライアントに応答するまでに待機する応答数を制御するだけです。

読み取り操作の場合、コーディネーターは通常、整合性レベルを満たすのに十分なレプリカにのみ読み取りコマンドを発行します。この例外の1つは、元のレプリカが指定された時間内に応答しなかった場合に、投機的な再試行が余分なレプリカに冗長な読み取り要求を発行する可能性がある場合です。

整合性レベルの選択

レプリカセットが重複するように読み取りと書き込みの整合性レベルを選択するのが一般的で、これにより、確認済みのすべての書き込みが後続の読み取りで表示されます。これは通常、Dynamoと同じ用語で表現され、W + R > RFとなります。ここで、Wは書き込み整合性レベル、Rは読み取り整合性レベル、RFはレプリケーションファクターです。たとえば、RF = 3の場合、QUORUMリクエストは少なくとも2/3のレプリカからの応答が必要です。書き込みと読み取りの両方にQUORUMが使用されている場合、少なくとも1つのレプリカが書き込みリクエストと読み取りリクエストの両方に参加することが保証され、それによってクォーラムが重複し、書き込みが読み取りに表示されることが保証されます。

マルチデータセンター環境では、LOCAL_QUORUMを使用して、より弱いながらも依然として有用な保証を提供できます。読み取りは、同じデータセンター内からの最新の書き込みを確認することが保証されます。これは、単一のデータセンターにホーム化されたクライアントが自分の書き込みを読み取るため、多くの場合十分です。

このタイプの強力な整合性が不要な場合は、LOCAL_ONEONEのような低い整合性レベルを使用して、スループット、レイテンシ、可用性を向上させることができます。複数のデータセンターにまたがるレプリケーションの場合、LOCAL_ONEは通常ONEよりも可用性が低いですが、原則としてより高速です。実際、ONEは、単一のレプリカがどのデータセンターでも利用可能であれば成功します。

分散クラスタメンバーシップと障害検出

レプリケーションプロトコルとデータセットのパーティショニングは、クラスタ内でどのノードがアクティブでどのノードがデッドであるかを知ることに依存しているため、書き込み操作と読み取り操作を最適にルーティングできます。Cassandraでは、ライブネス情報は、ゴシッププロトコルに基づく障害検出メカニズムを介して分散的に共有されます。

ゴシップ

ゴシップは、Cassandraがエンドポイントメンバーシップやノード間ネットワークプロトコルのバージョンなどの基本的なクラスタブートストラップ情報を伝播する方法です。Cassandraのゴシップシステムでは、ノードは自分自身に関するだけでなく、自分が知っている他のノードに関する状態情報も交換します。この情報は、(世代、バージョン)タプルのベクトルクロックでバージョン管理されます。ここで、世代は単調なタイムスタンプであり、バージョンはほぼ毎秒増分する論理クロックです。これらの論理クロックを使用すると、Cassandraゴシップはゴシップメッセージに提示された論理クロックを調べるだけで、古いバージョンのクラスタ状態を無視できます。

Cassandraクラスタ内のすべてのノードは、ゴシップタスクを独立して定期的に実行します。毎秒、クラスタ内のすべてのノードが

  1. ローカルノードのハートビート状態(バージョン)を更新し、クラスタのゴシップエンドポイント状態のローカルビューを構築します。

  2. ゴシップエンドポイント状態を交換するために、クラスタ内のランダムな他のノードを選択します。

  3. (存在する場合)到達不能なノードとのゴシップを確率的に試みます。

  4. ステップ2で発生しなかった場合、シードノードとゴシップします。

オペレーターが最初にCassandraクラスタをブートストラップするとき、特定のノードをシードノードとして指定します。どのノードもシードノードになる可能性があり、シードノードと非シードノードの唯一の違いは、シードノードが他のシードノードを確認せずにリングにブートストラップできることです。さらに、クラスタがブートストラップされると、上記のステップ4により、シードノードはゴシップのホットスポットになります。

非シードノードがクラスタにブートストラップするために少なくとも1つのシードノードに接続できる必要があるため、複数のシードノードを含めるのが一般的です。多くの場合、ラックまたはデータセンターごとに1つです。シードノードは、既存の既製のサービスディスカバリメカニズムを使用して選択されることがよくあります。

ノードはシードノードに同意する必要はなく、実際、クラスタがブートストラップされると、新しく起動されたノードは、既存のノードをシードとして使用するように構成できます。同じノードをシードとして選択する唯一の利点は、ゴシップのホットスポットとしての有用性が高まることです。

現在、ゴシップはトークンメタデータとスキーマバージョン情報も伝播します。この情報は、データ移動とスキーマプルをスケジュールするためのコントロールプレーンを形成します。たとえば、ノードがゴシップ状態のスキーマバージョンの不一致を検出した場合、他のノードとのスキーマ同期タスクをスケジュールします。トークン情報がゴシップを介して伝播されるため、どのエンドポイントがどのデータを所有しているかをノードに教えるためのコントロールプレーンでもあります。

リングメンバーシップと障害検出

ゴシップはリングメンバーシップの基礎を形成しますが、障害検出器は最終的にノードがUPであるかDOWNであるかについての決定を行います。Cassandraのすべてのノードは、Phi Accrual Failure Detectorのバリアントを実行しており、各ノードはピアノードが利用可能かどうかを常に独立して決定しています。この決定は、主に受信したハートビート状態に基づいています。たとえば、ノードが一定時間、ノードからの増加するハートビートを確認しない場合、障害検出器はそのノードを「有罪」と判断します。その時点で、Cassandraは読み取りのルーティングを停止します(書き込みは通常ヒントに書き込まれます)。ノードが再びハートビートを開始すると、Cassandraは連絡を取り、接続しようとします。通信チャネルを開くことができれば、そのノードを利用可能としてマークします。

UPDOWNの状態はローカルノードの決定であり、ゴシップで伝播されません。ハートビート状態はゴシップで伝播されますが、ノードは実際のネットワークチャネルを介して正常にメッセージをやり取りできるまで、互いにUPと見なしません。

Cassandraは、オペレーターからのデコミッション操作、またはreplace_address_first_bootオプションでブートストラップする新しいノードを介して明示的な指示がない限り、ゴシップ状態からノードを削除することはありません。この選択は、データが不必要に再バランスすることなく、Cassandraノードが一時的に失敗することを許可するために意図的です。これは、トークン範囲の複数のレプリカが同時に移動する同時範囲移動を防ぐのにも役立ちます。これは、単調整合性に違反する可能性があり、データ損失を引き起こす可能性さえあります。

コモディティハードウェアでの段階的なスケールアウト

Cassandraは、データサイズとリクエストレートの増加の要件を満たすためにスケールアウトします。スケールアウトとは、リングにノードを追加することを意味し、追加するすべてのノードは、コンピューティングとストレージで線形的な改善をもたらします。対照的に、スケールアップとは、既存のデータベースノードに容量を追加することを意味します。Cassandraはスケールアップも可能であり、特定の環境ではデプロイメントに応じて望ましい場合があります。Cassandraは、オペレーターにスケールアウトまたはスケールアップのいずれかを選択する柔軟性を提供します。

CassandraがDynamoに従う重要な側面の1つは、コモディティハードウェアで実行しようとすることであり、この仮定の下で多くのエンジニアリング上の選択が行われます。たとえば、Cassandraはノードがいつでも失敗する可能性があると想定し、利用可能なCPUとメモリリソースを最大限に活用するように自動調整し、限られたメモリとストレージ機能から最大限のストレージを取得するために、高度な圧縮およびキャッシュ技術を多用します。

シンプルなクエリモデル

Cassandraは、Dynamoと同様に、SQLリレーショナルデータベース管理システム(RDBMS)で一般的なクロスパーティショントランザクションを提供しないことを選択します。これにより、プログラマーにシンプルで読みやすく、書きやすいAPIが提供され、複数のノードにまたがるマルチパーティショントランザクションは実装が非常に難しく、通常は非常にレイテンシが高いため、Cassandraは水平方向にスケールするのが容易になります。

代わりに、Cassandraは、単一パーティション操作に対して、高速で一貫性があり、任意のスケールでのレイテンシを提供することを選択し、プライマリキーフィルターに基づいてパーティション全体またはパーティションのサブセットのみの取得を可能にします。さらに、Cassandraは軽量トランザクションCQL APIを介して単一パーティションの比較およびスワップ機能をサポートします。

レコードを保存するためのシンプルなインターフェース

Cassandraは、Dynamoとは少し異なり、「単純なキーと値」ストアよりも洗練されていますが、SQLリレーショナルデータモデルよりも大幅に複雑でないストレージインターフェースを選択しています。Cassandraは、ワイドカラムストアインターフェースを提供します。このインターフェースでは、データのパーティションに複数の行が含まれ、各行には個別に型指定された柔軟な列セットが含まれています。すべての行は、パーティションキーと1つ以上のクラスタリングキーによって一意に識別され、すべての行は必要に応じて多数の列を持つことができます。

これにより、ユーザーは新しい要件が発生したときに、既存のデータセットに新しい列を柔軟に追加できます。スキーマの変更には、メタデータの変更のみが関与し、ライブワークロードと完全に並行して実行されます。したがって、ユーザーは、クエリのパフォーマンスが低下しないことを確信しながら、既存のCassandraデータベースに列を安全に追加できます。