RDBMSの苦手なことを 如何に乗り越えていくか / challenge-to-rdbms
by
soudai sone
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
RDBMSの苦手なことを 如何に乗り越えていくか ~ ハイトラフィック・ビックデータ対策 ~ PHPカンファレンス沖縄@2021
Slide 2
Slide 2 text
多くの問題は RDBMSで解決できる What is it?
Slide 3
Slide 3 text
しかしRDBMSは銀の弾丸ではない What is it?
Slide 4
Slide 4 text
しかしRDBMSは銀の弾丸ではない ↓ 得手不得手を理解する What is it?
Slide 5
Slide 5 text
今日はRDBMSの外の話 What is it?
Slide 6
Slide 6 text
大量のログデータを 如何に上手く集計するか What is it?
Slide 7
Slide 7 text
突然のハイトラフィック システム障害を如何に乗り越えるか What is it?
Slide 8
Slide 8 text
ECサイト… チケットの予約… What is it?
Slide 9
Slide 9 text
現実の問題を 如何に乗り越えるか What is it?
Slide 10
Slide 10 text
AWSの前提でお話します What is it?
Slide 11
Slide 11 text
AWSの前提でお話します ↓ とはいえ、応用のできる話です What is it?
Slide 12
Slide 12 text
1. 自己紹介 2. 大量のデータを集計したい 3. 突然のハイトラフィックでサービス障害 4. ロック待ちの悪夢 5. まとめ あじぇんだ
Slide 13
Slide 13 text
1. 自己紹介 2. 大量のデータを集計したい 3. 突然のハイトラフィックでサービス障害 4. ロック待ちの悪夢 5. まとめ あじぇんだ
Slide 14
Slide 14 text
自己紹介 曽根 壮大(36歳) Have Fun Tech LLC 代表社員 そ ね たけ とも ● 日本PostgreSQLユーザ会 勉強会分科会 担当 ● 3人の子供がいます(長女、次女、長男) ● 技術的にはWeb/LL言語/RDBMSが好きです ● コミュニティが好き
Slide 15
Slide 15 text
No content
Slide 16
Slide 16 text
本書きました
Slide 17
Slide 17 text
1. 自己紹介 2. 大量のデータを集計したい 3. 突然のハイトラフィックでサービス障害 4. ロック待ちの悪夢 5. まとめ あじぇんだ
Slide 18
Slide 18 text
人類に必要なのは ログデータからいい感じのテーブルを作る 大量のデータを集計したい
Slide 19
Slide 19 text
結論 これができれば苦労しない 大量のデータを集計したい
Slide 20
Slide 20 text
いい感じのテーブルを作る 大量のデータを集計したい
Slide 21
Slide 21 text
いい感じのテーブルを作る ↓ これがRDBMSだけで出来ないとき 大量のデータを集計したい 出来たらRDBMSだけで良いのです
Slide 22
Slide 22 text
RDBMSの責務を超えるとき 大量のデータを集計したい
Slide 23
Slide 23 text
RDBMSの責務を超えるとき ● 集計クエリが難しすぎる ● 集計クエリが終わらない ● ログデータがDBに保存できない量 大量のデータを集計したい
Slide 24
Slide 24 text
RDBMSの責務を超えるとき ● 集計クエリが難しすぎる ● 集計クエリが終わらない ● ログデータがDBに保存できない量 大量のデータを集計したい
Slide 25
Slide 25 text
集計クエリが難しいときは 設計が悪いか無知かのどちらか 大量のデータを集計したい
Slide 26
Slide 26 text
17章 複雑なクエリ “複雑なクエリが生まれるには理由があ ります。その理由はクエリを紐 解くこと で見えてきますが、おもに次の2つに分 けられるでしょう。” ● 無知ゆえの豪腕 スキル不足に起因した、力技による解 決としての複雑なクエリ ● 腐ったテーブルの腐ったクエリ テーブル設計に問題を抱えており、目 的を達成するため結果的に 複雑に なったクエリ
Slide 27
Slide 27 text
良い設計とはなにか 大量のデータを集計したい
Slide 28
Slide 28 text
良い設計とはなにか ↓ 先人から学ぶ 大量のデータを集計したい
Slide 29
Slide 29 text
レポートの先人に学ぶ 大量のデータを集計したい
Slide 30
Slide 30 text
大量のデータを集計したい
Slide 31
Slide 31 text
大量のデータを集計したい
Slide 32
Slide 32 text
この話で3日ぐらい話せるので 詳しくは @pei0804 にきいてください 大量のデータを集計したい
Slide 33
Slide 33 text
良いクエリは 良い設計に宿る 大量のデータを集計したい
Slide 34
Slide 34 text
RDBMSの責務を超えるとき ● 集計クエリが難しすぎる ● 集計クエリが終わらない ● ログデータがDBに保存できない量 大量のデータを集計したい
Slide 35
Slide 35 text
リソースの資源には限界がある 大量のデータを集計したい
Slide 36
Slide 36 text
リソースの資源には限界がある ↓ 制約と成果の関係が大事 大量のデータを集計したい
Slide 37
Slide 37 text
制約と成果の関係の例 ● いつまで・どうやって・何がほしい ○ いつまで → 時間がどれだけ使える? ○ どうやって → リソース、手段 ○ 何がほしい → 成果物はなにか 大量のデータを集計したい
Slide 38
Slide 38 text
多くの場合、リソースとして 時間が犠牲になるし、時間で限界が来る 大量のデータを集計したい
Slide 39
Slide 39 text
Batchの突き抜け || 特定のタイミングまでにBatchが終わらない 大量のデータを集計したい
Slide 40
Slide 40 text
Batchが遅くなる理由 大量のデータを集計したい
Slide 41
Slide 41 text
Batchが終わらない ● 集計クエリが終わらない ○ 結果がでかすぎる ○ 集計対象がでかすぎる ○ SQLが巨大すぎる 大量のデータを集計したい
Slide 42
Slide 42 text
スコープを小さくする 大量のデータを集計したい
Slide 43
Slide 43 text
スコープを小さくする ↓ それができればRDBMSで戦える 大量のデータを集計したい
Slide 44
Slide 44 text
RDBMSの責務を超えるとき ● 集計クエリが難しすぎる ● 集計クエリが終わらない ● ログデータがDBに保存できない量 大量のデータを集計したい
Slide 45
Slide 45 text
でかいデータと如何に戦うか 大量のデータを集計したい
Slide 46
Slide 46 text
でかいデータと如何に戦うか ↓ スコープが小さく出来ない 大量のデータを集計したい
Slide 47
Slide 47 text
適切なミドルウェアを選ぶしかない 大量のデータを集計したい
Slide 48
Slide 48 text
最近作った例 大量のデータを集計したい
Slide 49
Slide 49 text
S3 大量のデータを集計したい json file json file json file json file Redshift Spectrum Redshift Aurora external tablesで Redshiftに読み込む 集計クエリ S3のfileを取り込む
Slide 50
Slide 50 text
Redshift Spectrum 外部データをSQLで取り込む機能 大量のデータを集計したい
Slide 51
Slide 51 text
external tables 外部のデータベースのテーブルを 自分のテーブルのように参照する機能 大量のデータを集計したい
Slide 52
Slide 52 text
これでログとRDBのマスタを Redshift上でJOINして集計できる 大量のデータを集計したい
Slide 53
Slide 53 text
データストアを増やすときは 最小限にすること 大量のデータを集計したい
Slide 54
Slide 54 text
1. 自己紹介 2. 大量のデータを集計したい 3. 突然のハイトラフィックでサービス障害 4. ロック待ちの悪夢 5. まとめ あじぇんだ
Slide 55
Slide 55 text
鳴り続けるalert… 飛び交う怒号と絶望のtimeout… 突然のハイトラフィックでサービス障害
Slide 56
Slide 56 text
RDBMSの死は サービスの死 突然のハイトラフィックでサービス障害
Slide 57
Slide 57 text
ハイトラフィックは突然やってくる 突然のハイトラフィックでサービス障害
Slide 58
Slide 58 text
ハイトラフィックは突然やってくる ↓ 如何にハイトラフィックに備えるか 突然のハイトラフィックでサービス障害
Slide 59
Slide 59 text
ハイトラフィックに備える ○ スケールアップは全てに効く ○ 正しくキャッシュを活用する ○ ボトルネックを敢えて作る 突然のハイトラフィックでサービス障害
Slide 60
Slide 60 text
ハイトラフィックに備える ○ スケールアップは全てに効く ○ 正しくキャッシュを活用する ○ ボトルネックを敢えて作る スケールアップがもっとも効率良く問題を解決できる オンプレでは難しいクラウドを使うメリット 突然のハイトラフィックでサービス障害
Slide 61
Slide 61 text
突然のハイトラフィックでサービス障害
Slide 62
Slide 62 text
限界が来る前に 改善を始めましょう 突然のハイトラフィックでサービス障害
Slide 63
Slide 63 text
ハイトラフィックに備える ○ スケールアップは全てに効く ○ 正しくキャッシュを活用する ○ ボトルネックを敢えて作る 突然のハイトラフィックでサービス障害
Slide 64
Slide 64 text
キャッシュは麻薬 突然のハイトラフィックでサービス障害
Slide 65
Slide 65 text
16章 キャッシュ中毒 “キャッシュは前述のとおり、採用することで データの参照が高速化されます。 これは、省略した計算処理量が多ければ多 いほど劇的な効果を発揮します。 この効果は絶大で、前述のとおりその効果に 魅了される人も少なくありません。 また、キャッシュは一度使い始めると辞める ことが難しく、魅力と辞めることの難しさ、つ まり中毒性の高さから 「キャッシュは麻薬」と 比喩されることもあります。”
Slide 66
Slide 66 text
16章 キャッシュ中毒 キャッシュしたデータの状態を意識する ことが難しく、参照時にどの状態なのかコード 側からは直感的に把握し辛い ● キャッシュと元データの整合性を合わせる必要 がある ● キャッシュの生存期間を決める必要がある ● キャッシュを正しく読み取る必要がある
Slide 67
Slide 67 text
16章 キャッシュ中毒 キャッシュしたデータのデバッグが難しく、どの データがキャッシュされているかを 把握し辛い ● 参照されたタイミングのキャッシュがどの データか把握が難しい ● どのデータがキャッシュされたか 把握が難しい ● どこまでキャッシュされているのかの把握 が難しい ● 意図しない結果となった場合、原因が キャッシュなのか元データの破損なのか 判断が難しい
Slide 68
Slide 68 text
キャッシュは最後の手段 突然のハイトラフィックでサービス障害
Slide 69
Slide 69 text
ハイトラフィックに備える ○ スケールアップは全てに効く ○ 正しくキャッシュを活用する ○ ボトルネックを敢えて作る 突然のハイトラフィックでサービス障害
Slide 70
Slide 70 text
防壁(ボトルネック)を作る 突然のハイトラフィックでサービス障害
Slide 71
Slide 71 text
ボトルネックを作る例 ○ ログインにスリープを入れて待たせる ○ 特定の処理でランダムに失敗させる ○ オリンピックチケット方式 突然のハイトラフィックでサービス障害
Slide 72
Slide 72 text
サービスを止めないことが目的で トラフィックを捌くのは手段 突然のハイトラフィックでサービス障害
Slide 73
Slide 73 text
サービスを止めないことが目的で トラフィックを捌くのは手段 突然のハイトラフィックでサービス障害 例えば在庫が限定される商品は在庫を捌くのが目的なので 在庫が無くなった後は全て 503でも究極良いし、誰に売っても良い
Slide 74
Slide 74 text
全てがロック待ちで死んだりする 突然のハイトラフィックでサービス障害
Slide 75
Slide 75 text
1. 自己紹介 2. 大量のデータを集計したい 3. 突然のハイトラフィックでサービス障害 4. ロック待ちの悪夢 5. まとめ あじぇんだ
Slide 76
Slide 76 text
どんな優秀なシステムも 排他ロック一つで落とせる ロック待ちの悪夢
Slide 77
Slide 77 text
設計する上で ロックを意識する ロック待ちの悪夢
Slide 78
Slide 78 text
論理設計で INSERTとDELETEだけで設計する ロック待ちの悪夢
Slide 79
Slide 79 text
ロック待ちの悪夢 https://www.slideshare.net/kawasima/ss-40471672 https://www.slideshare.net/kawasima/ss-44958468
Slide 80
Slide 80 text
ロック待ちの悪夢 https://soudai.hatenablog.com/entry/2018/05/01/204442
Slide 81
Slide 81 text
13章 知らないロック “ロックはRDBMSを使ううえで重要な機能で す。必要不可欠であるからこそ、 正しい知識を持つことが重要です。 とくに今回のように、「今まで使ってきた RDBMSでは○○だったから別のRDBMSは □□なはずだ」と決め付けて実装するのは危 険です。”
Slide 82
Slide 82 text
14章 ロックの功罪 “RDBMSの特性を理解していない場合、 並 列処理の部分で問題が発生します。 正しくトランザクションを理解し、 ロックを使いこなしましょう。 ただし、当然ながらロックの多用は 並列度を下げ、パフォーマンスの問題になり ます。題名の「ロックの功罪」とはまさに、こ の毒にも薬にもなるロックの責務のことなの です”
Slide 83
Slide 83 text
RDBMSを使う上で ロックの種類と粒度を意識する ロック待ちの悪夢
Slide 84
Slide 84 text
1. 自己紹介 2. 大量のデータを集計したい 3. 突然のハイトラフィックでサービス障害 4. ロック待ちの悪夢 5. まとめ あじぇんだ
Slide 85
Slide 85 text
RDBMSは とても強力なソフトウェア まとめ
Slide 86
Slide 86 text
だからこそ、正しく使うことが大切です まとめ
Slide 87
Slide 87 text
だからこそ、正しく使うことが大切です ↓ 多くのことはRDBMSで解決できます まとめ
Slide 88
Slide 88 text
「知識がある」と「実践できる」には 大きな絶対的な差がある まとめ
Slide 89
Slide 89 text
知識 * 経験 = できる! まとめ
Slide 90
Slide 90 text
正しい知識を 実践で活かしていくの自分たちです まとめ
Slide 91
Slide 91 text
世の中をソフトウェアで良くしていく まとめ
Slide 92
Slide 92 text
ご清聴ありがとうございました まとめ