KEIS BLOGは株式会社ケイズ・ソフトウェアが運営しています。

KEIS BLOG

Cassandraについて③


こんにちは!

梅雨の時期です。ジメジメして嫌になりますね。

—–
fujikawa01

今回もCassandraの特徴について勉強してみます。

・Cassandraの読み込み/書き込みの仕組み
 ■読み込み
  一貫性レベルに応じて挙動が変わります。
  ・ONE
   1.トークンを計算してデータを保持する一番近いノードを決定
   2.対象ノードに読み取り要求を送信
   3.データを受け取り、クライアントに返却
  ・QUORUM(それ以上の一貫性レベル)
   1.トークンを計算してデータを保持する一番近いノードを決定
   2.レプリケーションを保持するノードを決定
   3.一番近いノードに読み取り要求を送信
     他のノードにはダイジェストのみの読み取り要求を送信
   4.一貫性レベルで指定された数のレスポンスの返却を待つ
   5.ダイジェストが一致していれば読み込んだデータを返す。
   6.ダイジェストに不一致があれば実データを読み込みにいき、Read Repairを実行。
  ※Read Repair
   読み込み時、各レプリカに違いがあった場合、最新のデータでレプリカを修復。
   修復はバックグラウンドで行われる。
   (読み込み速度を上げたい場合はOFFにすることも可能)
  1.Clientからの読み込み要求を受け取る
  2.データを保持しているノードを

 ■書き込み
  クライアントは一貫性レベルを指定して、データの書き込み(登録/更新/削除)要求をクラスタ内のノードに送信。
  要求を受けたノードは、どのノードにデータを保持するかを決定し、要求をフォワードする。
  下記のように判定を行い、書き込み要求をフォワードするノードを決定。(ローカルの場合もある)
  
  1.トークンを計算し、データを保持するノードを決定
    パーティショニング方法(IPartitionerの実装)に基づいてどのノードに属するデータかを決定
  2.レプリケーションを保持するノードを決定
  3.Hinted Handoffの必要性を判定
    本来そのデータを保持するはずだったノードの情報(Hint)をつけて、別のノードにそのデータを格納しておく。
    Hinted Handoffを受けとったノードは本来保持するノードのアドレスをSYSTEMテーブルへ保持。
    ※Hinted Handoffとは
     レプリカを所有しているノードがネットワークの問題またはその他の問題で使用できないときに
     書き込みが成功した操作からのレプリカを受け入れてクラスターの整合性プロセスと
     アンチエントロピーを最適化するCassandraの機能です。
  
  一貫性レベルに応じて挙動が変わります。
   ・ZERO
    非同期でフォワードを行う。クライアントにすぐ返るが、何も保証されない。
   ・ANY以上
    指定された一貫性レベルの数だけフォワード先からレスポンスが返った場合のみ
    クライアントにレスポンスを返す。どこかでエラーが発生したら例外を吐く。


結構複雑な仕組みで読み書きを行っていますね。
一貫性レベルと処理速度、データ整合性のバランスが難しいような気がしています。

【関連記事】
SOAPUIの便利な使い方①
SOAPUIの便利な使い方②
SOAPUIの便利な使い方③
SOAPUIの便利な使い方④
SOAPUIの便利な使い方⑤
SOAPUIの便利な使い方⑥
JavaWebServerを使ってみるテスト
Splunkを使ってみよう!
SOAPUIの便利な使い方⑦
捨てる前にできること
eclipseでSoapUIを動かしてみる
マウスにもこだわりを
WindowsでDockerを使ってみよう①
忘れがちなGitコマンド
AWSを使ってみる
ヘッドフォンの選び方
Cucumberを使ってみるテスト①
忘れがちなGitコマンド②
Cassandraについて①
Cassandraについて②