■
- 2010年5月20日(木) 19:00-21:00
- @ぐるなび大学
Cassandra & MR (Hadoop)
- ムロドー根本氏
Consistency Level
- ムロドー富田氏
- twitter: railute
- blog: http://intheforest.jp/blog
- mail: tomitakazutaka@gmail.com
- 全回アジェンダ
- Cassandraを複数で立ち上げる
- コンシステンシーレベルとは ← イマココ
- ゴシッププロトコル?
- 複数ノードで事なrう設定
- 巨大なデータを入れてみる
- ノードのスプリットブレイン
- Base64で写真を突っ込んだりはしてる。ノードが落ちたとかその他は基本的に見られいない
- 5MBを100枚とか
- ネットワークが切れた時のそれぞれ相互の動きを見てみたい ← 今後の希望
- 今日のアジェンダ
- Consistency Levelとは
- データは何処にあるのか?(partition)
- データはどこまで書き込まれるのか?
- thriftAPIでみてみる
- データはいつ書き込まれるのか?
- データを読み込む
- Consistency Levelとは
複数ノードを立ち上げたときに実際データはどこにあるのか?
データはどこまで書き込まれるのか?
- storage-conf.xmlのReplicaPlacementStrategyで指定(RackUnwareStrategy)
- ラックをまたがないとかデータセンターをまたがないとかの設定に使う
- ring上で隣り合う、n-1分、右のノードまで書き込む
- N = ReplicationFactor
データはいつ書き込まれるのか?
- 複数ノードを立ち上げたときに実際データはいつ書き込まれるのか?
- 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の論文があった)