第9回 Cassandra - MAYAH - MAYAHmayah.jp/resources/2010/Cassandra9.pdfCassandra で WebApp を...
Transcript of 第9回 Cassandra - MAYAH - MAYAHmayah.jp/resources/2010/Cassandra9.pdfCassandra で WebApp を...
![Page 1: 第9回 Cassandra - MAYAH - MAYAHmayah.jp/resources/2010/Cassandra9.pdfCassandra で WebApp を 基本にたちかえって、Cassandra を backend に WebApp を 作る場合に気をつけないといけないことを探ってみる](https://reader031.fdocument.pub/reader031/viewer/2022020214/5af7948b7f8b9ae948905122/html5/thumbnails/1.jpg)
第9回 Cassandra 勉強会川中 真耶 a.k.a. MAYAH
@mayahjp
![Page 2: 第9回 Cassandra - MAYAH - MAYAHmayah.jp/resources/2010/Cassandra9.pdfCassandra で WebApp を 基本にたちかえって、Cassandra を backend に WebApp を 作る場合に気をつけないといけないことを探ってみる](https://reader031.fdocument.pub/reader031/viewer/2022020214/5af7948b7f8b9ae948905122/html5/thumbnails/2.jpg)
Cassandra で WebApp を
基本にたちかえって、Cassandra を backend に WebApp を作る場合に気をつけないといけないことを探ってみる
RDB で作った方がよいものを無理矢理 Cassandra で作ってみて、何が問題になるかを探る
![Page 3: 第9回 Cassandra - MAYAH - MAYAHmayah.jp/resources/2010/Cassandra9.pdfCassandra で WebApp を 基本にたちかえって、Cassandra を backend に WebApp を 作る場合に気をつけないといけないことを探ってみる](https://reader031.fdocument.pub/reader031/viewer/2022020214/5af7948b7f8b9ae948905122/html5/thumbnails/3.jpg)
題材: イベント開催・参加管理
管理者がイベントを登録
参加者はイベントに参加登録を出す
申し込みは早いものがち
キャンセルとかも出来る
早い話が atnd.org のぱく(ry
UNDER CONSTRUCTION
![Page 4: 第9回 Cassandra - MAYAH - MAYAHmayah.jp/resources/2010/Cassandra9.pdfCassandra で WebApp を 基本にたちかえって、Cassandra を backend に WebApp を 作る場合に気をつけないといけないことを探ってみる](https://reader031.fdocument.pub/reader031/viewer/2022020214/5af7948b7f8b9ae948905122/html5/thumbnails/4.jpg)
作っていて問題になった点
データ構造 & Transaction
ソート
Transaction again (別の問題)
![Page 5: 第9回 Cassandra - MAYAH - MAYAHmayah.jp/resources/2010/Cassandra9.pdfCassandra で WebApp を 基本にたちかえって、Cassandra を backend に WebApp を 作る場合に気をつけないといけないことを探ってみる](https://reader031.fdocument.pub/reader031/viewer/2022020214/5af7948b7f8b9ae948905122/html5/thumbnails/5.jpg)
データ構造 & Transaction
![Page 6: 第9回 Cassandra - MAYAH - MAYAHmayah.jp/resources/2010/Cassandra9.pdfCassandra で WebApp を 基本にたちかえって、Cassandra を backend に WebApp を 作る場合に気をつけないといけないことを探ってみる](https://reader031.fdocument.pub/reader031/viewer/2022020214/5af7948b7f8b9ae948905122/html5/thumbnails/6.jpg)
主要なデータ構造 (RDB 脳で)
イベントテーブル
ユーザーテーブル
この2つは Cassandra に直すのも簡単 (id を key にする)
id title date desc
event id タイトル 開催日 説明
id nameuser id ユーザー名
![Page 7: 第9回 Cassandra - MAYAH - MAYAHmayah.jp/resources/2010/Cassandra9.pdfCassandra で WebApp を 基本にたちかえって、Cassandra を backend に WebApp を 作る場合に気をつけないといけないことを探ってみる](https://reader031.fdocument.pub/reader031/viewer/2022020214/5af7948b7f8b9ae948905122/html5/thumbnails/7.jpg)
参加テーブルは?RDB 脳で作ると次のようになり、RDB ならこれで OK
これを Cassandra に落とす場合は何を key にして保持すればいいの?
event_id user_id date
event id user id 申込日時
![Page 8: 第9回 Cassandra - MAYAH - MAYAHmayah.jp/resources/2010/Cassandra9.pdfCassandra で WebApp を 基本にたちかえって、Cassandra を backend に WebApp を 作る場合に気をつけないといけないことを探ってみる](https://reader031.fdocument.pub/reader031/viewer/2022020214/5af7948b7f8b9ae948905122/html5/thumbnails/8.jpg)
参加テーブル (contd.)
event_id を key に保持すると user から検索できなくなる
user_id を key の保持すると event から検索できなくなる
➡解決策は両方持つこと (当たり前ですね)
![Page 9: 第9回 Cassandra - MAYAH - MAYAHmayah.jp/resources/2010/Cassandra9.pdfCassandra で WebApp を 基本にたちかえって、Cassandra を backend に WebApp を 作る場合に気をつけないといけないことを探ってみる](https://reader031.fdocument.pub/reader031/viewer/2022020214/5af7948b7f8b9ae948905122/html5/thumbnails/9.jpg)
Transaction の問題がッ
先生! 1つ書いた後もう1つを書くまでの間にサーバーが落ちたらどうしたら良いですか!
CRASH!!
CassandraAP
![Page 10: 第9回 Cassandra - MAYAH - MAYAHmayah.jp/resources/2010/Cassandra9.pdfCassandra で WebApp を 基本にたちかえって、Cassandra を backend に WebApp を 作る場合に気をつけないといけないことを探ってみる](https://reader031.fdocument.pub/reader031/viewer/2022020214/5af7948b7f8b9ae948905122/html5/thumbnails/10.jpg)
Transaction の問題がッ
RDB では、データの書き込みは transactional にできたが、Cassandra ではそうはいかない。
1つだけ書き込んだ後にエラーが発生する可能性があり、そうすると不整合が発生
commit/rollback とかない
![Page 11: 第9回 Cassandra - MAYAH - MAYAHmayah.jp/resources/2010/Cassandra9.pdfCassandra で WebApp を 基本にたちかえって、Cassandra を backend に WebApp を 作る場合に気をつけないといけないことを探ってみる](https://reader031.fdocument.pub/reader031/viewer/2022020214/5af7948b7f8b9ae948905122/html5/thumbnails/11.jpg)
Transaction は出来なくとも後でリカバリーはしたい
一瞬不整合が起きているのは許容
最終的には問題ない状態にしておきたい
![Page 12: 第9回 Cassandra - MAYAH - MAYAHmayah.jp/resources/2010/Cassandra9.pdfCassandra で WebApp を 基本にたちかえって、Cassandra を backend に WebApp を 作る場合に気をつけないといけないことを探ってみる](https://reader031.fdocument.pub/reader031/viewer/2022020214/5af7948b7f8b9ae948905122/html5/thumbnails/12.jpg)
没案:不整合を検出するために1日1回チェック
全部に不整合がある訳じゃない
処理量が多い
![Page 13: 第9回 Cassandra - MAYAH - MAYAHmayah.jp/resources/2010/Cassandra9.pdfCassandra で WebApp を 基本にたちかえって、Cassandra を backend に WebApp を 作る場合に気をつけないといけないことを探ってみる](https://reader031.fdocument.pub/reader031/viewer/2022020214/5af7948b7f8b9ae948905122/html5/thumbnails/13.jpg)
案:Redo log を持ってしまう
普通に書き込もうとする前に redo log を書き込み
その後いくつか書き込み
全部うまくいけば redo log を削除
➡ redo log があるので落ちても後から整合性が取れた状態に持って行ける 他に良い方法あったら教
えてください
![Page 14: 第9回 Cassandra - MAYAH - MAYAHmayah.jp/resources/2010/Cassandra9.pdfCassandra で WebApp を 基本にたちかえって、Cassandra を backend に WebApp を 作る場合に気をつけないといけないことを探ってみる](https://reader031.fdocument.pub/reader031/viewer/2022020214/5af7948b7f8b9ae948905122/html5/thumbnails/14.jpg)
ソートの問題
![Page 15: 第9回 Cassandra - MAYAH - MAYAHmayah.jp/resources/2010/Cassandra9.pdfCassandra で WebApp を 基本にたちかえって、Cassandra を backend に WebApp を 作る場合に気をつけないといけないことを探ってみる](https://reader031.fdocument.pub/reader031/viewer/2022020214/5af7948b7f8b9ae948905122/html5/thumbnails/15.jpg)
イベントの開催日時でソートしたい
Cassandra では Column は name で自動的にソートされる
Recall: Column = name + value + timestamp
イベント一覧の name を開催日時にしておけばいいんじゃない?
value を event id にして、そこから引いてしまえば OK
![Page 16: 第9回 Cassandra - MAYAH - MAYAHmayah.jp/resources/2010/Cassandra9.pdfCassandra で WebApp を 基本にたちかえって、Cassandra を backend に WebApp を 作る場合に気をつけないといけないことを探ってみる](https://reader031.fdocument.pub/reader031/viewer/2022020214/5af7948b7f8b9ae948905122/html5/thumbnails/16.jpg)
開催日時を update すると?
当然対応する name 部分を書き換える必要がある
![Page 17: 第9回 Cassandra - MAYAH - MAYAHmayah.jp/resources/2010/Cassandra9.pdfCassandra で WebApp を 基本にたちかえって、Cassandra を backend に WebApp を 作る場合に気をつけないといけないことを探ってみる](https://reader031.fdocument.pub/reader031/viewer/2022020214/5af7948b7f8b9ae948905122/html5/thumbnails/17.jpg)
ユーザーが参加するイベントを開催日時で並べたいときは?ユーザーごとに、どのイベントに参加しているかを表す
column を持つ
そのイベントに参加する人が 1000 人いたら、その人達の分
1000 個 name を変更しろということですか?
なんかすごい残念感があるが、実はあんまり開催日時を変更することはないので OK かもしれない。
![Page 18: 第9回 Cassandra - MAYAH - MAYAHmayah.jp/resources/2010/Cassandra9.pdfCassandra で WebApp を 基本にたちかえって、Cassandra を backend に WebApp を 作る場合に気をつけないといけないことを探ってみる](https://reader031.fdocument.pub/reader031/viewer/2022020214/5af7948b7f8b9ae948905122/html5/thumbnails/18.jpg)
結論なんか残念だったのでnameを開催日時にするのはやめた。
一人のユーザは 1000 個ぐらいまでしかイベントに参加しないだろうから、表示時に毎回ソート。
表示時には全部イベントを取ってこないといけないので、それにソートが加わってもたいしたことない。
nameを開催日時にして表示時に実際の開催日時と食い違っている場合は直すという様にしても良いかも知れない。
![Page 19: 第9回 Cassandra - MAYAH - MAYAHmayah.jp/resources/2010/Cassandra9.pdfCassandra で WebApp を 基本にたちかえって、Cassandra を backend に WebApp を 作る場合に気をつけないといけないことを探ってみる](https://reader031.fdocument.pub/reader031/viewer/2022020214/5af7948b7f8b9ae948905122/html5/thumbnails/19.jpg)
Transaction Again
![Page 20: 第9回 Cassandra - MAYAH - MAYAHmayah.jp/resources/2010/Cassandra9.pdfCassandra で WebApp を 基本にたちかえって、Cassandra を backend に WebApp を 作る場合に気をつけないといけないことを探ってみる](https://reader031.fdocument.pub/reader031/viewer/2022020214/5af7948b7f8b9ae948905122/html5/thumbnails/20.jpg)
参加人数を数えたい
参加者が増えたら[減ったら] atomic に1を足す[引く]だけの簡単なお仕事
これさえ Cassandra だけだと出来ません
![Page 21: 第9回 Cassandra - MAYAH - MAYAHmayah.jp/resources/2010/Cassandra9.pdfCassandra で WebApp を 基本にたちかえって、Cassandra を backend に WebApp を 作る場合に気をつけないといけないことを探ってみる](https://reader031.fdocument.pub/reader031/viewer/2022020214/5af7948b7f8b9ae948905122/html5/thumbnails/21.jpg)
没案:1つのスレッドからのみ書き込みをする
![Page 22: 第9回 Cassandra - MAYAH - MAYAHmayah.jp/resources/2010/Cassandra9.pdfCassandra で WebApp を 基本にたちかえって、Cassandra を backend に WebApp を 作る場合に気をつけないといけないことを探ってみる](https://reader031.fdocument.pub/reader031/viewer/2022020214/5af7948b7f8b9ae948905122/html5/thumbnails/22.jpg)
没案:1つのスレッドからのみ書き込みをする
たんいつしょうがいてんつくっちゃってどーすんの
![Page 23: 第9回 Cassandra - MAYAH - MAYAHmayah.jp/resources/2010/Cassandra9.pdfCassandra で WebApp を 基本にたちかえって、Cassandra を backend に WebApp を 作る場合に気をつけないといけないことを探ってみる](https://reader031.fdocument.pub/reader031/viewer/2022020214/5af7948b7f8b9ae948905122/html5/thumbnails/23.jpg)
どうしようもないので
get_count() で O(N) 使って取ってくる
N が小さければ問題ナシ
count にしか使えないのであまり汎用的な解決法ではない
Apache Zoo Keeper を使ってロックする
出来るけどロックするのでちょっと残念ではある
![Page 24: 第9回 Cassandra - MAYAH - MAYAHmayah.jp/resources/2010/Cassandra9.pdfCassandra で WebApp を 基本にたちかえって、Cassandra を backend に WebApp を 作る場合に気をつけないといけないことを探ってみる](https://reader031.fdocument.pub/reader031/viewer/2022020214/5af7948b7f8b9ae948905122/html5/thumbnails/24.jpg)
Cassandra に check and set
ぐらい実装できないか?lock はしたくない。失敗したらもう一回やればいい
まず consistency level ALL で読み込み、データを持っているノードに順番を付けてその順番で CAS するとかすればなんとかなる? (まだ証明してない)
CAS 以外の操作が来たらなにも保証できない
![Page 25: 第9回 Cassandra - MAYAH - MAYAHmayah.jp/resources/2010/Cassandra9.pdfCassandra で WebApp を 基本にたちかえって、Cassandra を backend に WebApp を 作る場合に気をつけないといけないことを探ってみる](https://reader031.fdocument.pub/reader031/viewer/2022020214/5af7948b7f8b9ae948905122/html5/thumbnails/25.jpg)
DEMO
![Page 26: 第9回 Cassandra - MAYAH - MAYAHmayah.jp/resources/2010/Cassandra9.pdfCassandra で WebApp を 基本にたちかえって、Cassandra を backend に WebApp を 作る場合に気をつけないといけないことを探ってみる](https://reader031.fdocument.pub/reader031/viewer/2022020214/5af7948b7f8b9ae948905122/html5/thumbnails/26.jpg)
DEMO8月リ
リース予定
只今 UI 実装中
![Page 27: 第9回 Cassandra - MAYAH - MAYAHmayah.jp/resources/2010/Cassandra9.pdfCassandra で WebApp を 基本にたちかえって、Cassandra を backend に WebApp を 作る場合に気をつけないといけないことを探ってみる](https://reader031.fdocument.pub/reader031/viewer/2022020214/5af7948b7f8b9ae948905122/html5/thumbnails/27.jpg)
さいごに
ASCII .technologies でCassandra 連載が始まります。
みんな見てね!