Cassandra & MR (Hadoop)

  • ムロドー根本氏

Consistency Level

  • ムロドー富田氏
  • 全回アジェンダ
    • Cassandraを複数で立ち上げる
    • コンシステンシーレベルとは ← イマココ
    • ゴシッププロトコル?
    • 複数ノードで事なrう設定
    • 巨大なデータを入れてみる
    • ノードのスプリットブレイン
  • Base64で写真を突っ込んだりはしてる。ノードが落ちたとかその他は基本的に見られいない
    • 5MBを100枚とか
  • ネットワークが切れた時のそれぞれ相互の動きを見てみたい ← 今後の希望
  • 今日のアジェンダ
    • Consistency Levelとは
      • データは何処にあるのか?(partition)
      • データはどこまで書き込まれるのか?
      • thriftAPIでみてみる
      • データはいつ書き込まれるのか?
      • データを読み込む
複数ノードを立ち上げたときに実際データはどこにあるのか?
  • storage-conf.xmlのPartitionのデフォルト (RandomPartitionoer)
    • CassandraはキーをMD5でhash値化して、ノードが持つレンジに割り当てる
    • Columnのキーは数字でなくてもいい、むしろ数字じゃなくてもいい
      • シリアルキーを入手するためだけにRDBMSを叩いたりしているので、一意になることが保証される方法を使う方がいい
データはどこまで書き込まれるのか?
  • storage-conf.xmlのReplicaPlacementStrategyで指定(RackUnwareStrategy)
    • ラックをまたがないとかデータセンターをまたがないとかの設定に使う
    • ring上で隣り合う、n-1分、右のノードまで書き込む
    • N = ReplicationFactor
thriftAPIでみてみる
  • describe_ringを使って視覚化した
  • ノードをmd5でハッシュキーをもたせサイクリック順序付けし、キーのmd5の範囲をそれで決定する
データはいつ書き込まれるのか?
  • 複数ノードを立ち上げたときに実際データはいつ書き込まれるのか?
  • ConsistencyLevelZERO
  • Localの場合は、CommitLogに書き込まれた後Flushで書き込まれる
  • Localでない場合は、hintsをつけて、CommitLogに追加する
    • データの書き込み先に依頼する
      • ZEROの場合は依頼して結果を待たなくて終了する(書き込みの確認をしない)
    • Message Sent (ここ微妙?)
  • ConsistencyLevelがその他 (ONE, ANY)
    • 書き込む先の数が違うだけでいくつかある
    • Localの場合は同じ
    • Localでない場合は、書き込み先の相手にSent Messageで投げる
      • ONE、ANYの場合はひとつでも書き込みができた時点で、returnを返す(最低限一箇所書き込みができたことを保証)
      • QUORUMは2/3以上でreturnする
      • ALLは全部でreturnする
  • ノード数が増えてきたときにQUORUMとかALLの意味が出て着る
  • returnの戻るタイミングがConsistencyLevelで異なる
  • OSに対してwrite命令をだした時点で返却されるので、Consistencyは保持されない
    • 途中でOSが落ちたり、bufferの時点で書き込まれていない可能性はある
  • StrongなConsistencyLevelのものはCassandraは使わない方がいいんじゃないかな
    • 金融系はやめたほうがいい
データを読み込む
  • 対応しているのはConsistencyLevelはONEとQUORUMのみ
  • Localの場合はスルッと返す
  • Localでない場合は、さくっと返す
    • 一番新しいデータである保証は無い
    • QUORUMの場合は、幾つか帰ってきた中でもっとも新しいものを返す
    • レプリカは最新のが確認されて返却される
      • 書き込むときにClientの時間でtimestampを返すので、clientとserverがずれるとごちゃごちゃになる
      • 意識的に変えるのは可能(制御で死ぬ気がするけど)
質疑応答
  • ConsistencyLevelZeroで書き込んで、Localの場合は、CommitLogに書き込む
  • ReadRepairは別スレッドで常に動いている(Oneのとき?QUORUMの場合はReadRepairしてから最新をreturn?)
  • 読み込みでQUORUMとかALLの場合は、データの値も取得、比較をする(?)のでデータがでかい場合はパフォーマンスは落ちる
  • ノードが死んでいると、スキップしてさらに隣には行かない
    • decommitionを打たない限りIPは消えずに残る
    • loadbalanceをうつとレンジが変わるが、落ちたサバはそのままにレンジに残る
    • loadbalance自体がdecommitionを含めてやってくれたはず(?)
    • decommitionは自分自身が抜ける
    • removetokenすると指定したノードがringから抜ける
    • decommitionして、データを綺麗にして再追加しようとして同じIPだと入らなかった
  • ノードが死ぬと自動でringから切り離されないけど、自動的には切り離されない
    • なんとかならないの?ノードがダウンするのは多くの場合、一時的なものだから勝手にrebalancingするのはおかしいからあえてしない!(というfacebookの論文があった)

茨城検索の構築 - 第2回

方針
  • 各種WebAPIサービスから茨城の情報を集めよう
  • まずは飲食店の検索ができるサイト
構造
  • mysql: ID発行、履歴管理
  • cassandra:
  • hadoop:
  • cassandraとhadoopのつなぎ込み。CassandraのデータをhadoopでN-Gramで解析してCassandraに戻す
インデックス設計
  • LuceneとCassandraを合わせたLucandra