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

ご清聴ありがとうございました
 
 
 まとめ