サーバ(ノード)構成
RDBタイプの分散処理環境MySQL Clusterと比較しながらサーバ構成の違いを説明します。MySQL Clusterは、異なる3つのノード(サービス)が存在します。データノードは、データを分散して格納します。データノード4台でレプリケーションが2の場合、4つのフラグメントが分散配置され、複製(セカンダリ)が他のデータノードに配置されます。フラグメントのプライマリとセカンダリのいずれかが生きていれば処理を行えます。SQLノードは、SQLステートメントを受け取りデータノードに渡す役割です。管理ノードは、MySQL Cluster全体を調整する役割を担います。MySQL Clusterは、データノードとSQLノードで役割を分担することで、高度な分散処理を実現しています。
Cassandraは、機能別の役割はありません。すべてのノードが同じ機能を持っています。ノードは、理論上のリング構造に配置されます。データは、Keyspaceごとに全ノードに分割して格納します。さらに障害に備えて、レプリカ(複製)を別のノードに配置できます。レプリカが3の場合、リングの左となり2つのノードにレプリカが設けられます。そのため、同一ノード情報を持っているノードが2台ダウンしても処理を継続できます。
Cassandraでは、すべてのノードがリクエストを受けられます。リクエストを受け取ったノードがデータを持っているノードと通信を行い必要なデータを取得してリクエスト元に返します。
Cassandraは、各ノードが独自に処理を行います。レプリカが3の場合、3ノードがデータを保持しています。これらのレプリカ同士で、データに差が発生することを前提に複数数ノードでのデータの整合性チェック機構が備わっています。このような仕組みは、ACIDが前提となっているRDBでは見られません。ぜひ知っていただきたい仕組みです。
ConsistencyLevelによる動作の違い(書き込み処理)
Cassandraでは、書き込み時に指定するConsistencyLevelによって、書き込み処理の動作が異なります。
リクエストを受け取ったノードは、該当(N3)するノードのいずれかに書き込みを実施します。もし、該当するノード稼働していない場合は、リクエストを受けたノードに書き込みを実施します。さらに何ノードに書き込みが行えたか確認する数を指定できます。
| ConsistencyLevel | 内容 |
|---|---|
| ANY | 書き込みがHintedHandoffを含む少なくとも1ノードに書かれたことを保証 |
| ONE | 書き込みが少なくとも1つのノードに書かれたことを保証 |
| TWO | 書き込みが少なくとも2つのノードに書かれたことを保証 |
| THREE | 書き込みが少なくとも3つのノードに書かれたことを保証 |
| QUORUM | 書き込みが少なくともN/2+1個(過半数)のノードに書かれたことを保証 |
| LOCAL_QUORUM | ローカルのデータセンター内のレプリカ数/2+1個のノードに書かれたことを保証 |
| EACH_QUORUM | リモートのデータセンター内のレプリカ数/2+1個のノードに書かれたことを保証 |
| ALL | 書き込みがすべてのノードに書かれたことを保証 |
もちろん、書き込み対象の台数が多いほど処理時間がかかります。そのため、安全性を期待してALLを指定するのは避けるべきです。
ConsistencyLevelによる動作の違い(読み込み処理)
読み込み処理は、書き込み処理よりも複雑です。なぜなら、どのノードのデータが正しいか判断する必要があるからです。
このように分散して格納しているデータが異なっていることを前提に(タイムスタンプの)最も新しいデータを返します。
| ConsistencyLevel | 内容 |
|---|---|
| ONE | 最初にリターンのあったレコードをそのまま返答 |
| TWO |
最初にリターンのあった2つのレコードのタイムスタンプを比較し もっとも新しいレコードを返答 |
| THREE |
最初にリターンのあった3つのレコードのタイムスタンプを比較し もっとも新しいレコードを返答 |
| QUORUM |
最初にリターンのあったレプリカ数/2+1つ(過半数)の レコードのタイムスタンプを比較し、もっとも新しいレコードを返答 |
| LOCAL_QUORUM |
ローカルのデータセンター内のレプリカ数/2+1個のノードから返答があった レコードのタイムスタンプを比較し、もっとも新しいレコードを返答 |
| EACH_QUORUM |
リモートのデータセンター内のレプリカ数/2+1個のノードから返答があった レコードのタイムスタンプを比較し、もっとも新しいレコードを返答 |
| ALL |
すべてのノードからリターンを待ちレコードのタイムスタンプを比較し、 もっとも新しいレコードを返答 |
後処理として、データに差異があった場合には、タイムスタンプの新しいデータに書き換えます。
