Download - Random partionerのデータモデリング
![Page 1: Random partionerのデータモデリング](https://reader033.vdocuments.mx/reader033/viewer/2022051616/55385fd25503469f338b47bb/html5/thumbnails/1.jpg)
株式会社ワークスアプリケーションズ
堤 勇人(@2t3)
RandomPartitonerの データモデリング
![Page 2: Random partionerのデータモデリング](https://reader033.vdocuments.mx/reader033/viewer/2022051616/55385fd25503469f338b47bb/html5/thumbnails/2.jpg)
所属
自己紹介
ワークスアプリケーションズ
Incubation Labo4 Webmail
お仕事
ウェブメールの開発
![Page 3: Random partionerのデータモデリング](https://reader033.vdocuments.mx/reader033/viewer/2022051616/55385fd25503469f338b47bb/html5/thumbnails/3.jpg)
所属
自己紹介
ワークスアプリケーションズ
Incubation Labo4 Webmail
お仕事
ウェブメールの開発
・・・という名義で最先端技術を試す実験場
![Page 4: Random partionerのデータモデリング](https://reader033.vdocuments.mx/reader033/viewer/2022051616/55385fd25503469f338b47bb/html5/thumbnails/4.jpg)
Webmail
AP: jetty
DB: cassandra, hbase
全てクラウド(AWS)で動作
![Page 5: Random partionerのデータモデリング](https://reader033.vdocuments.mx/reader033/viewer/2022051616/55385fd25503469f338b47bb/html5/thumbnails/5.jpg)
1. CRUDが存在するデータを扱う
今回の達成目標
2. BETWEEN検索が可能
3. 余剰リソースを少なく
DELETEが存在する。
例えば、このユーザーの3月~5月のデータ、という検索をしたい。
低予算。
![Page 6: Random partionerのデータモデリング](https://reader033.vdocuments.mx/reader033/viewer/2022051616/55385fd25503469f338b47bb/html5/thumbnails/6.jpg)
いわゆるRDB的な
前提知識:普通のデータモデリング
キー / カラム username(key) password
tsutsumi_h tsutsumi_h ********
yutuki_r yutuki_r **********
test_data test_data ******
例えば、Accountデータ
![Page 7: Random partionerのデータモデリング](https://reader033.vdocuments.mx/reader033/viewer/2022051616/55385fd25503469f338b47bb/html5/thumbnails/7.jpg)
RDBを使え?
![Page 8: Random partionerのデータモデリング](https://reader033.vdocuments.mx/reader033/viewer/2022051616/55385fd25503469f338b47bb/html5/thumbnails/8.jpg)
RDBを使え?
知らん!
批判は断る!
いやいや、分かってる分かってるんだ。最初から動的なウェブアプリケーションにCassandraなんて無理だし。アトミック操作も無いしね。件数表示とかすごい勢いでズレるし。それは分かっていながら、敢えて、そう敢えてのチャレンジなのですよ。本当はlike検索とかしたい。超したい。気軽にインデックスとか貼りたい。でも最先端技術使うって名目なんだもの。
![Page 9: Random partionerのデータモデリング](https://reader033.vdocuments.mx/reader033/viewer/2022051616/55385fd25503469f338b47bb/html5/thumbnails/9.jpg)
1. CRUDが存在するデータを扱う
もう一度、今回の達成目標
2. BETWEEN検索が可能
3. 余剰リソースを少なく
DELETEが存在する。
例えば、このユーザーの3月~5月のデータ、という検索をしたい。
低予算。
![Page 10: Random partionerのデータモデリング](https://reader033.vdocuments.mx/reader033/viewer/2022051616/55385fd25503469f338b47bb/html5/thumbnails/10.jpg)
案1:人工キーを利用する
キー / カラム username password
1 tsutsumi_h ********
2 yutuki_r **********
3 test_data ******
1. CRUDが存在するデータを扱う
2. BETWEEN検索が可能
3. 余剰リソースを少なく
![Page 11: Random partionerのデータモデリング](https://reader033.vdocuments.mx/reader033/viewer/2022051616/55385fd25503469f338b47bb/html5/thumbnails/11.jpg)
案1:人工キーを利用する
キー / カラム username password
1 tsutsumi_h ********
2 yutuki_r **********
3 test_data ******
2,3は良いが、1で問題が起こる
DELETEが発生すると、キーに抜けができ、パフォーマンスが落ちる
![Page 12: Random partionerのデータモデリング](https://reader033.vdocuments.mx/reader033/viewer/2022051616/55385fd25503469f338b47bb/html5/thumbnails/12.jpg)
案1:人工キーを利用する
キー / カラム username password
1 tsutsumi_h ********
2 yutuki_r **********
3 test_data ******
2,3は良いが、1で問題が起こる
DELETEが発生すると、キーに抜けができ、パフォーマンスが落ちる
![Page 13: Random partionerのデータモデリング](https://reader033.vdocuments.mx/reader033/viewer/2022051616/55385fd25503469f338b47bb/html5/thumbnails/13.jpg)
案2:OrderPreservingPartitioner
1. CRUDが存在するデータを扱う
2. BETWEEN検索が可能
3. 余剰リソースを少なく
node
node
node
tsutsumi_h yutuki_r
test_data
![Page 14: Random partionerのデータモデリング](https://reader033.vdocuments.mx/reader033/viewer/2022051616/55385fd25503469f338b47bb/html5/thumbnails/14.jpg)
1,2は良いが、3が微妙
データの偏りが発生し、仕事をあまりしないノードが出来る
案2:OrderPreservingPartitioner
node
node
node
tsutsumi_h yutuki_r
test_data
![Page 15: Random partionerのデータモデリング](https://reader033.vdocuments.mx/reader033/viewer/2022051616/55385fd25503469f338b47bb/html5/thumbnails/15.jpg)
案2:OrderPreservingPartitioner
node
node
node
tsutsumi_h yutuki_r
test_data
1,2は良いが、3が微妙
データの偏りが発生し、仕事をあまりしないノードが出来る
![Page 16: Random partionerのデータモデリング](https://reader033.vdocuments.mx/reader033/viewer/2022051616/55385fd25503469f338b47bb/html5/thumbnails/16.jpg)
OPPを使った場合のデータ分布
稼働率が全体で50%以下
仕事をしないノードは仕事をするノードの25%以下しか働かない。
しかもこの余剰分は他が溢れた時に活かされることはない。
![Page 17: Random partionerのデータモデリング](https://reader033.vdocuments.mx/reader033/viewer/2022051616/55385fd25503469f338b47bb/html5/thumbnails/17.jpg)
Columnについては検索ができる
前提知識:RandomPartitioner
例えば、p~zまでのカラム名を抽出
キー / カラム username(key) … password
tsutsumi_h tsutsumi_h … ********
yutuki_r yutuki_r … **********
test_data test_data … ******
![Page 18: Random partionerのデータモデリング](https://reader033.vdocuments.mx/reader033/viewer/2022051616/55385fd25503469f338b47bb/html5/thumbnails/18.jpg)
案3:RPを使って横持ちindex化
1. CRUDが存在するデータを扱う
2. BETWEEN検索が可能
3. 余剰リソースを少なく
key suzuki tamura tsutsumi urata wakui yutuki zhag
![Page 19: Random partionerのデータモデリング](https://reader033.vdocuments.mx/reader033/viewer/2022051616/55385fd25503469f338b47bb/html5/thumbnails/19.jpg)
案3:RPを使って横持ちindex化
key suzuki tamura tsutsumi urata wakui yutuki zhag
1,2,3を満たす・・・が
indexが壊れた場合に、全てのデータを一括で読むしか修復の方法が なくなる。
![Page 20: Random partionerのデータモデリング](https://reader033.vdocuments.mx/reader033/viewer/2022051616/55385fd25503469f338b47bb/html5/thumbnails/20.jpg)
案3:RPを使って横持ちindex化
key suzuki tamura tsutsumi urata wakui yutuki zhag
1,2,3を満たす・・・が
indexが壊れた場合に、全てのデータを一括で読むしか修復の方法がなくなる
![Page 21: Random partionerのデータモデリング](https://reader033.vdocuments.mx/reader033/viewer/2022051616/55385fd25503469f338b47bb/html5/thumbnails/21.jpg)
案4:じゃあ全データ横持ちにする
1. CRUDが存在するデータを扱う
2. BETWEEN検索が可能
3. 余剰リソースを少なく
key suzuki tamura tsutsumi urata wakui yutuki zhag
username suzuki tamura tsutsumi urata wakui yutuki zhag
password ***** ***** *** ****** ****** **** ****
active 1 0 0 1 1 1 1
![Page 22: Random partionerのデータモデリング](https://reader033.vdocuments.mx/reader033/viewer/2022051616/55385fd25503469f338b47bb/html5/thumbnails/22.jpg)
案4:じゃあ全データ横持ちにする
key suzuki tamura tsutsumi urata wakui yutuki zhag
username suzuki tamura tsutsumi urata wakui yutuki zhag
password ***** ***** *** ****** ****** **** ****
active 1 0 0 1 1 1 1
1,2,3を満たす
さらにはcassandraのget_count()も使えるように!
![Page 23: Random partionerのデータモデリング](https://reader033.vdocuments.mx/reader033/viewer/2022051616/55385fd25503469f338b47bb/html5/thumbnails/23.jpg)
案4:じゃあ全データ横持ちにする
key suzuki tamura tsutsumi urata wakui yutuki zhag
username suzuki tamura tsutsumi urata wakui yutuki zhag
password ***** ***** *** ****** ****** **** ****
active 1 0 0 1 1 1 1
1,2,3を満たす
さらにはcassandraのget_count()も使えるように!
![Page 24: Random partionerのデータモデリング](https://reader033.vdocuments.mx/reader033/viewer/2022051616/55385fd25503469f338b47bb/html5/thumbnails/24.jpg)
横持ちの仕方には色々ある
key / column tsutsumi@20110524 tsutsumi@20110525
key tsutsumi@20110524 tsutsumi@20110525
username tsutsumi tsutsumi_h
password ******* ******************
active 0 1
完全横持ち
全てのデータが、column名ごとに 横に入る。自由に検索が出来るが、 rowが大きくなる。
![Page 25: Random partionerのデータモデリング](https://reader033.vdocuments.mx/reader033/viewer/2022051616/55385fd25503469f338b47bb/html5/thumbnails/25.jpg)
横持ちの仕方には色々ある
key / column tsutsumi@20110524 tsutsumi@20110525
tsutsumi@key tsutsumi@20110524 tsutsumi@20110525
tsutsumi@username tsutsumi tsutsumi_h
tsutsumi@password ******* ******************
tsutsumi@active 0 1
ブロック(?)持ち
ユーザーなど、ブロックごとに横持ちする。rowが比較的小さくなり、 ブロック毎のcountも出来る。 ただし、ブロック内しか検索できない
![Page 26: Random partionerのデータモデリング](https://reader033.vdocuments.mx/reader033/viewer/2022051616/55385fd25503469f338b47bb/html5/thumbnails/26.jpg)
横持ちの仕方には色々ある
key / column tsutsumi@20110524 tsutsumi@20110525
tsutsumi@20110524
@key tsutsumi@20110524 空
tsutsumi@20110524
@username tsutsumi 空
tsutsumi@20110525
@key 空 tsutsumi@20110525
tsutsumi@20110525
@username 空 tsutsumi_h
ナナメ持ち 一つのキー毎に別のカラム名で横持ちする。rowが小さくなり負荷が少ない
![Page 27: Random partionerのデータモデリング](https://reader033.vdocuments.mx/reader033/viewer/2022051616/55385fd25503469f338b47bb/html5/thumbnails/27.jpg)
RP横持ちを使ったデータ分布
ほぼ均等なデータ分布・稼働率
個々のノード毎の偏りがなくなり、 負荷も全体に分散するようになった。
さらに、get_Count()関数の利用が 可能になり、range_ghostの呪いからも開放された。
DB1 DB2 DB3
79.82 79.56 79.77 (GB)
ブロック持ちの場合
![Page 28: Random partionerのデータモデリング](https://reader033.vdocuments.mx/reader033/viewer/2022051616/55385fd25503469f338b47bb/html5/thumbnails/28.jpg)
RP横持ちを使ったデータ分布
ほぼ均等なデータ分布・稼働率
個々のノード毎の偏りがなくなり、 負荷も全体に分散するようになった。
さらに、get_Count()関数の利用が 可能になり、range_ghostの呪いからも開放された。
DB1 DB2 DB3
79.82 79.56 79.77 (GB)
ブロック持ちの場合
![Page 29: Random partionerのデータモデリング](https://reader033.vdocuments.mx/reader033/viewer/2022051616/55385fd25503469f338b47bb/html5/thumbnails/29.jpg)
注意事項
空データの扱い方 データが無いカラムには、nullではなく、 適当な0xDEADBEEF等を入れないと、 cassandraが左詰めで返してしまう。
key / column a b c d e f g h i j k l m n o
key
username
password
active
ー データ無し
![Page 30: Random partionerのデータモデリング](https://reader033.vdocuments.mx/reader033/viewer/2022051616/55385fd25503469f338b47bb/html5/thumbnails/30.jpg)
以上、ありがとうございました。