1. 概要

Apache Cassandra は、オープンソースのNoSQLであり、高可用性でスケーラブルな分散データベースです。 高可用性を実現するために、Cassandraはクラスター間でのデータのレプリケーションに依存しています。

このチュートリアルでは、Cassandraが、高可用性のためにデータを複製しながらデータの一貫性を管理するための制御をどのように提供するかを学習します。

2. データレプリケーション

データレプリケーションとは、各行のコピーを複数のノードに保存することを指します。データレプリケーションの理由は、信頼性とフォールトトレランスを確保するためです。 したがって、何らかの理由でいずれかのノードに障害が発生した場合、レプリケーション戦略により、同じデータが他のノードで使用可能になります。

レプリケーションファクター(RF)は、クラスター全体でレプリカを格納するノードの数を指定します。

利用可能なレプリケーション戦略は2つあります。

SimpleStrategyは、単一のデータセンターと1つのラックトポロジに使用されます。最初に、Cassandraはパーティショナーロジックを使用して、行を配置するノードを決定します。 次に、リング内の時計回りに次のノードに追加のレプリカを配置します。

NetworkTopologyStrategyは通常、複数のデータセンターと複数のラックに使用されます。さらに、データセンターごとに異なるレプリケーション係数を指定できます。 データセンター内では、可用性を最大化するためにレプリカをさまざまなラックに割り当てます。

3. 一貫性レベル

一貫性は、データ行のすべてのレプリカがどれだけ最近で同期しているかを示します。分散システム全体でデータを複製する場合、データの一貫性を実現することは非常に複雑な作業です。

Cassandraは一貫性よりも可用性を優先します。一貫性を最適化しません。 代わりに、ユースケースに応じて一貫性を調整する柔軟性が得られます。 ほとんどのユースケースでは、Cassandraは結果整合性に依存しています。

データの書き込みおよび読み取り中の整合性レベルの影響を見てみましょう。

4. 書き込み時の整合性レベル(CL)

書き込み操作の場合、整合性レベルは、コーディネーターがクライアントに正常に報告する前に確認応答する必要があるレプリカノードの数を指定します。さらに重要なことに、(特定の整合性レベルに対して)確認応答するノードの数と数(特定のRFの)レプリカを格納するノードの数はほとんど異なります。

たとえば、整合性レベルがONEでRF = 3の場合、書き込み操作が成功したことを確認するレプリカノードは1つだけですが、Cassandraはバックグラウンドで他の2つのノードにデータを非同期的に複製します。

書き込み操作を成功させるために使用できる整合性レベルのオプションのいくつかを見てみましょう。

整合性レベルONEは、1つのレプリカノードからの確認応答のみが必要であることを意味します。 確認する必要があるレプリカは1つだけなので、この場合、書き込み操作が最速です。

整合性レベルQUORUMは、すべてのデータセンターのレプリカノードの51% oraの過半数からの確認応答が必要であることを意味します。

LOCAL_QUORUM の整合性レベルは、コーディネーターと同じデータセンター内のレプリカノードの51% oraの大多数からの確認応答が必要であることを意味します。 したがって、データセンター間の通信の遅延を回避できます。

ALL の整合性レベルは、すべてのレプリカノードからの確認応答が必要であることを意味します。 すべてのレプリカノードが確認応答する必要があるため、この場合、書き込み操作は最も遅くなります。 さらに、書き込み操作中にレプリカノードの1つがダウンすると、失敗し、可用性が低下します。 したがって、ベストプラクティスは、実稼働展開でこのオプションを使用しないことです。

各書き込みクエリまたはグローバルクエリレベルで整合性レベルを構成できます。

次の図は、書き込み時のCLの例をいくつか示しています。

5. 読み取り時の整合性レベル(CL)

読み取り操作の場合、整合性レベルは、コーディネーターがデータをクライアントに正常に送り返す前に、最新の整合性のあるデータで応答する必要があるレプリカノードの数を指定します。

Cassandraがデータを正常に返す読み取り操作で使用可能な整合性レベルオプションのいくつかを見てみましょう。

整合性レベルONEは、1つのレプリカノードのみがデータを返すことを意味します。 この場合、データの取得が最速です。

整合性レベルQUORUMは、すべてのデータセンターのレプリカノードの51% oraの過半数が応答することを意味します。 次に、コーディネーターはデータをクライアントに返します。 複数のデータセンターの場合、データセンター間の通信の遅延により読み取りが遅くなります。

LOCAL_QUORUM の整合性レベルは、同じデータセンター内のレプリカノードの51% oraの過半数を意味します。 コーディネーターが応答すると、コーディネーターはデータをクライアントに返します。 したがって、データセンター間の通信の遅延を回避できます。

ALL の整合性レベルは、すべてのレプリカノードが応答し、コーディネーターがデータをクライアントに返すことを意味します。 すべてのレプリカノードが確認応答する必要があるため、この場合、読み取り操作は最も遅くなります。 さらに、読み取り操作中にレプリカノードの1つがダウンすると、失敗し、可用性が低下します。 ベストプラクティスは、本番デプロイメントでこのオプションを使用しないことです。

各書き込みクエリまたはグローバルクエリレベルで整合性レベルを構成できます。

次の図は、読み取り時のCLの例をいくつか示しています。

6. 強一貫性

強一貫性とは、最新の書き込みとその後の読み取りの間にどれだけの時間がかかっても、クラスターに最新の書き込みデータを読み込んでいることを意味します。

前のセクションで、書き込みと読み取りに必要な整合性レベル( CL )を指定する方法を説明しました。

W + R> RF の場合、強力な一貫性を実現できます。ここで、 R CL レプリカ数の読み取り、 W –書き込み CL レプリカ数、 RF –複製係数。

このシナリオでは、すべてのクライアント読み取りが常に最新の書き込みデータをフェッチするため、強い一貫性が得られます。

強一貫性レベルの例をいくつか見てみましょう。

6.1. CL=QUORUMの書き込みとCL=QUORUMの読み取り

RF = 3、 W = QUORUMまたはLOCAL_QUORUM、 R =QUORUM[X80X]またはLOCAL_QUORUMの場合、[X117X ] W(2)+ R(2)> RF(3)

この場合、書き込み操作により、2つのレプリカに最新のデータが含まれていることを確認します。 次に、読み取り操作では、少なくとも2つのレプリカが一貫した最新データで応答した場合にのみ、データを正常に受信することも確認します。

6.2. CL = ALLを書き込み、CL=ONEを読み取ります

RF = 3、 W = ALL R = ONE の場合、 W(3)+ R(1) > RF(3)

この場合、コーディネーターがすべてのレプリカにデータを書き込むと、書き込み操作は成功します。 次に、これらのレプリカの1つからデータを読み取って、最新の書き込みデータを確実に読み取るだけで十分です。

ただし、前に学習したように、 ALL の書き込みCLはフォールトトレラントではなく、可用性が低下します。

7. 結論

この記事では、Cassandraでのデータレプリケーションについて説明しました。 また、データの書き込みと読み取りで使用できるさまざまな整合性レベルのオプションについても学びました。 さらに、強一貫性を実現するためにいくつかの例を検討しました。