$30 off During Our Annual Pro Sale. View Details »

アンチパターンから学ぶ RDBの正しい設計 / learn-from-failure-2

アンチパターンから学ぶ RDBの正しい設計 / learn-from-failure-2

soudai sone

March 24, 2019
Tweet

More Decks by soudai sone

Other Decks in Technology

Transcript

  1. アンチパターンから学ぶ
    RDBの正しい設計
    PHPerKaigi 2019

    View Slide

  2. What is it?
    みなさん失敗したことありますか?

    View Slide

  3. What is it?
    みなさん失敗したことありますか?

    私は沢山あります

    View Slide

  4. What is it?
    あの時、どうすればよかったか…

    View Slide

  5. What is it?
    “愚者は経験に学び、賢者は歴史に学ぶ。”
    --オットー・ビスマルク

    View Slide

  6. What is it?
    他人の失敗を知ることで
    自分の失敗を未然に防ぐことが出来る

    View Slide

  7. 本を書きました
    https://www.amazon.co.jp/exec/obidos/ASIN/4297104083/maple036-22/

    View Slide

  8. What is it?
    RDBMSの失敗例集

    View Slide

  9. What is it?
    今日はこの本の中から
    厳選された内容をお伝えします

    View Slide

  10. あじぇんだ
    1 自己紹介
    2 フレームワーク依存症
    3 知らないロック
    4 キャッシュ中毒
    5 まとめ

    View Slide

  11. あじぇんだ
    1 自己紹介
    2 フレームワーク依存症
    3 知らないロック
    4 キャッシュ中毒
    5 まとめ

    View Slide

  12. 自己紹介
    曽根 壮大(34歳)
    株式会社オミカレ 副社長/CTO
    • 日本PostgreSQLユーザ会 勉強会分科会 座長
    • 3人の子供がいます
    • 技術的にはWeb/LL言語/RDBが好きです
    そ ね た け と も

    View Slide

  13. 自己紹介
    曽根 壮大(34歳)
    株式会社オミカレ 副社長/CTO
    • 日本PostgreSQLユーザ会 勉強会分科会 座長
    • 3人の子供がいます
    • 技術的にはWeb/LL言語/RDBが好きです
    そ ね た け と も

    View Slide

  14. 婚活といえばオミカレ
    https://party-calendar.net/

    View Slide

  15. あじぇんだ
    1 自己紹介
    2 フレームワーク依存症
    3 知らないロック
    4 キャッシュ中毒
    5 まとめ

    View Slide

  16. View Slide

  17. フレームワーク依存症
    アプリケーションを使う時
    フレームワークを使うことが当たり前

    View Slide

  18. フレームワーク依存症
    フレームワークを使う

    View Slide

  19. フレームワーク依存症
    フレームワークを使う

    フレームワークの制約を受け入れる

    View Slide

  20. フレームワーク依存症
    フレームワークの制約?

    View Slide

  21. フレームワーク依存症
    フレームワークの制約?

    例えばORM

    View Slide

  22. RDBMS
    Model
    フレームワーク
    View
    情報をやり取りする
    Modelが事実を加工し、
    情報に変更する
    事実をやり取りする
    SQLでやり取りする
    プログラミング言語
    でやり取りする
    ORM
    リレーショナルモデルをプログラミング言語が
    扱うオブジェクトモデルに変換する
    またはその逆を行う

    View Slide

  23. フレームワーク依存症
    ORMは漏れのある抽象化

    View Slide

  24. N+1問題
    foreach ($blogs as $id => $blog) {
    echo $blog->get();
    } もしget()の度にSQLが発行されたら?

    View Slide

  25. http://soudai1025.blogspot.com/2016/11/rdbantipattern1.html

    View Slide

  26. フレームワーク依存症
    フレームワークは
    強い制約と規約によって
    高い生産性を与えてくれる

    View Slide

  27. フレームワーク依存症
    Active Record パターン

    Viewがテーブル設計に影響を与える

    View Slide

  28. フレームワーク依存症
    制約によって生まれる
    Viewとテーブルのミスマッチ

    View Slide

  29. フレームワーク依存症
    制約によって生まれる
    Viewとテーブルのミスマッチ

    View Slide

  30. • 全て必須とします
    • 名前は一意とします

    View Slide

  31. フレームワーク依存症
    名前 トーク評価 理由 好きなDB その他
    曽根 壮大 最高 ベストスピーカー PostgreSQL
    soudai1025 最高 なんとなく MySQL
    Soudai 最高 SQL Server
    hoge 普通 普通だった Oracle
    Fuga 悪い その他 Firebird

    View Slide

  32. フレームワーク依存症
    名前 トーク評価 理由 好きなDB その他
    曽根 壮大 最高 ベストスピーカー PostgreSQL
    soudai1025 最高 なんとなく MySQL
    Soudai 最高 SQL Server foo
    hoge 普通 普通だった Oracle
    Fuga 悪い その他 Firebird
    アプリケーションのバグで入る

    View Slide

  33. フレームワーク依存症
    フレームワークの制約が
    ときにはRDBMSにとって毒になる

    View Slide

  34. フレームワーク依存症
    これがフレームワーク依存症

    View Slide

  35. フレームワーク依存症
    SQLアンチパターンに出てくる
    フレームワーク依存の話

    View Slide

  36. フレームワーク依存症
    • マジックビーンズ
    • ポリモーフィック関連
    • IDリクワイアド
    • キーレスエントリー

    View Slide

  37. まだ読んでないなら絶対読んだほうがいい
    本著はSQLアンチパターンを読んでる前提の説明も多い

    View Slide

  38. アンチパターンを防ぐには?
    ORMもフレームワークも絶対悪では無い

    View Slide

  39. アンチパターンを防ぐには?
    ORMもフレームワークも絶対悪では無い

    漏れのある抽象化と付き合う
    よりよい抽象化を目指す

    View Slide

  40. アンチパターンを防ぐには?
    例えばRepositoryパターン

    View Slide

  41. RDBMS
    View
    会員ページ
    会員テーブル
    会員サービス
    会員データ
    Model
    ORM
    SQL
    会員リポジトリ
    サービスに必要な
    ビジネスロジック
    キャッシュ
    ストレージ
    フレームワーク
    データクラスはサービスが必要な会員の
    データを取り出し、加工する。
    場合によってはキャッシュから取り出し
    たり、RDBMSから取り出したりする
    リポジトリクラスはデータのCRUD部分
    だけを担う。
    ORM経由でもSQLでもサービスクラスか
    らは関係ない

    View Slide

  42. アンチパターンを防ぐには?
    フレームワークに依存しない
    最適な設計を常に模索する

    View Slide

  43. アンチパターンのポイント
    • フレームワークもORMも必要なツールで
    あることを意識して上手く付き合う
    • その上で受けたメリットと支払った
    デメリットを把握する
    • ビジネスロジックとデータの責務を
    上手く分離する→抽象化を意識する

    View Slide

  44. アンチパターンのポイント
    これを見てORM禁止などは本末転倒

    View Slide

  45. アンチパターンのポイント
    アプリケーションの設計力
    ビジネスロジックをコードにする実現力

    View Slide

  46. アンチパターンのポイント
    視野の広さは
    継続的な学習と経験で
    必ず身につく

    View Slide

  47. あじぇんだ
    1 自己紹介
    2 フレームワーク依存症
    3 知らないロック
    4 キャッシュ中毒
    5 まとめ

    View Slide

  48. View Slide

  49. 知らないロック
    トランザクションは
    データを守るために大切な仕組み

    View Slide

  50. ロックのレベル
    排他ロック(eXcluded lock) 共有ロック(Shared lock)
    ロック対象へのすべての
    アクセスを禁止する
    ロック対象への参照以外の
    アクセスを禁止する
    SELECT、INSERT、UPDATE、
    DELETE、すべて実行できない
    ほかのトランザクションから参照
    (SELECT)でアクセス可能
    書き込みロック、X lock
    と呼ばれることもある
    読み込みロック、S lock
    と呼ばれることもある

    View Slide

  51. ロックの粒度
    表ロック 行ロック
    テーブル(表)を対象にロックするため
    該当のテーブル内の行は全て対象になる
    行単位で対象をロックする。
    1行の場合もあれば、複数行にまたがる
    場合もあり、全ての行を対象にすると表
    ロックと同義になる
    テーブルロックと呼ばれることもある レコードロックと呼ばれることもある

    View Slide

  52. 知らないロック
    しかし意図しないロックは
    デッドロックなど新たな問題を生み出す

    View Slide

  53. 知らないロック
    デッドロックの例

    View Slide

  54. トランザクションA トランザクションB
    2巻を確保
    「本の1巻と2巻が揃ったら読む」場合のデッドロック
    SELECT * FROM book WHERE id = 2
    FOR UPDATE;
    SELECT * FROM book WHERE id = 1
    FOR UPDATE;
    1巻を確保
    2巻を確保
    1巻を確保
    SELECT * FROM book WHERE id = 2
    FOR UPDATE;
    SELECT * FROM book WHERE id = 1
    FOR UPDATE;
    デッドロック発生!

    View Slide

  55. 知らないロック
    ロックはとにかく取得するのではなく
    順番も大切

    View Slide

  56. 知らないロック
    ロックは知らないうちに取っている

    暗黙的ロック

    View Slide

  57. 知らないロック
    これらのSQL構文は共有ロックを取る
    • INSERT…SELECT構文
    • CREATE TABLE…AS SELECT構文

    View Slide

  58. 知らないロック
    ロックは色んなところで取得されている

    View Slide

  59. アンチパターンを防ぐには?
    ロックを知る
    RDBMSでのロックの違いを知る

    View Slide

  60. アンチパターンを防ぐには?
    MySQLとPostgreSQLでも違う

    View Slide

  61. アンチパターンを防ぐには?
    MySQLの
    ギャップロックとネクストキーロック
    時間が無いので割愛しますが、
    書籍で詳しく解説してます

    View Slide

  62. アンチパターンを防ぐには?
    基本的な機能は一緒でも
    細かい振る舞いが違うことは多々ある

    View Slide

  63. アンチパターンを防ぐには?
    基本的な機能は一緒でも
    細かい振る舞いが違うことは多々ある

    View Slide

  64. アンチパターンのポイント
    • このRDBMSでは○○だから
    別のRDBMSでも一緒のはずだ。は危険
    • ロックに対する無知は
    パフォーマンスの問題に直結
    • ときにはクリティカルなバグを生み、
    最悪のケースではサービス停止もある

    View Slide

  65. アンチパターンのポイント
    ドキュメントを読み、手を実際に動かし、
    正しい知識を身に付けましょう

    View Slide

  66. あじぇんだ
    1 自己紹介
    2 フレームワーク依存症
    3 知らないロック
    4 キャッシュ中毒
    5 まとめ

    View Slide

  67. View Slide

  68. キャッシュ中毒
    キャッシュの利用は
    劇的なパフォーマンス向上をもたらす

    View Slide

  69. キャッシュ中毒
    この成功体験は
    かなり強い中毒性がある

    View Slide

  70. キャッシュ中毒
    キャッシュは麻薬

    View Slide

  71. キャッシュ中毒
    使い始めると辞めにくく
    システムの複雑度が上がり
    トラブルシューティングの難易度が上がる

    View Slide

  72. キャッシュ中毒
    しかし適切に使えば
    多くのパフォーマンスの問題を解決する

    View Slide

  73. キャッシュ中毒
    キャッシュは麻薬

    View Slide

  74. キャッシュの種類
    • クエリキャッシュ
    • マテリアライズド・ビュー
    (サマリーテーブル)
    • アプリケーションキャッシュ

    View Slide

  75. クエリキャッシュ
    RDBMS
    アプリケーション
    RDBMS
    アプリケーション
    キャッシュ
    1回目はクエリの結果を返す
    結果に変化がない場合、
    キャッシュから結果を返す
    SELECT * FROM hoge
    SELECT * FROM hoge

    View Slide

  76. マテリアライズド・ビュー
    アプリケーション
    マテリアライズド・ビュー
    テーブル
    CREATE MATERIALIZED VIEW
    ビュー名 AS SELECT文;
    マテリアライズド・ビューは実体な
    のでINDEXを作成することもできる
    RDBMS
    SELECT * FROM
    マテビュー名
    マテリアライズド・ビューを
    REFRESHするまで作成時の状態

    View Slide

  77. アプリケーションキャッシュ
    RDBMS
    アプリケーション
    データを取り出す
    SELECT * FROM hoge
    キャッシュ
    ファイル
    キャッシュ
    memcached
    キャッシュ
    Redis
    任意のデータストアに
    取り出したデータを保存する
    アプリケーションの処理結果を保存することで
    アプリケーションの再計算処理を省略することもできる

    View Slide

  78. アプリケーションキャッシュ
    RDBMS
    アプリケーション
    RDBMSへのアクセス
    を減らせる
    キャッシュ
    ファイル
    キャッシュ
    memcached
    キャッシュ
    Redis
    アプリケーションがキャッシュの
    振る舞いをコントロールできる
    RDBMSより高速に取り出せるデータストアに
    アクセスするため高速に処理できる

    View Slide

  79. キャッシュ中毒
    キャッシュのトラブルはクリティカル

    View Slide

  80. キャッシュ中毒
    消えたキャッシュの悪夢
    「mixi大規模障害について」
    https://alpha.mixi.co.jp/entry/2010/10731/

    View Slide

  81. キャッシュ中毒
    見えてはいけないデータ
    「CDN切り替え作業における、Web版メルカリの個人情報流出の原因につきまして」
    https://tech.mercari.com/entry/2017/06/22/204500

    View Slide

  82. キャッシュ中毒
    キャッシュの障害は
    テストやモニタリングが難しい

    View Slide

  83. キャッシュ中毒
    しかし障害はクリティカル

    View Slide

  84. アンチパターンを防ぐには?
    キャッシュ戦略をしっかりと立てる

    View Slide

  85. アンチパターンを防ぐには?
    キャッシュは銀の弾丸では無い

    キャッシュヒットしない場合は
    逆にボトルネックになる

    View Slide

  86. アンチパターンを防ぐには?
    キャッシュヒット率や更新頻度は
    サービスの成長と共に変化する

    View Slide

  87. アンチパターンを防ぐには?
    キャッシュは取り出しやすさが大事
    つまりキーが大切

    View Slide

  88. アンチパターンのポイント
    • キャッシュヒット率や更新頻度を推測、計
    測する
    • キャッシュの対象と範囲を見極める
    • キャッシュのキーを決める
    • キャッシュの生存期間と更新方法を決める

    View Slide

  89. アンチパターンのポイント
    キャッシュを使わなくて良い場合は
    使わない

    View Slide

  90. アンチパターンのポイント
    “よほど正当な理由がない限り、
    マテリアライズド・ビューの多段化はやめましょう。
    これは筆者が最も後悔したRDBの設計の1つで、
    間違いなくアンチパターンです”
    --失敗から学ぶ-RDBの正しい歩き方 16章 キャッシュ中毒

    View Slide

  91. アンチパターンのポイント
    キャッシュの多段は危険
    必要だと感じたら設計を見直すべき

    View Slide

  92. あじぇんだ
    1 自己紹介
    2 フレームワーク依存症
    3 知らないロック
    4 キャッシュ中毒
    5 まとめ

    View Slide

  93. まとめ
    “愚者は経験に学び、賢者は歴史に学ぶ。”
    --オットー・ビスマルク

    View Slide

  94. まとめ
    データベースの寿命は
    アプリケーションよりも長い

    View Slide

  95. まとめ
    データは失うと取り戻せないし、
    情報はデータが無いと作れない

    View Slide

  96. まとめ
    他人の失敗から学び、
    正しくRDBを使いこなす

    View Slide

  97. まとめ
    今、あるデータベースと向き合うには?

    View Slide

  98. まとめ
    今、あるデータベースと向き合うには?

    自分たちで直すしかない

    View Slide

  99. https://builderscon.io/tokyo/2017/session/c8f36693-32aa-4bf1-816a-4966f3859926

    View Slide

  100. まとめ
    諦めず、仕組みで解決する

    View Slide

  101. まとめ
    諦めず、仕組みで解決する

    仕組みは技術力で解決できる

    View Slide

  102. まとめ
    数冊の本を読むだけで
    充分な知識がつくのがRDB

    View Slide

  103. まとめ
    技術で問題を解決する

    View Slide

  104. まとめ
    技術で問題を解決する

    解決までの歩んだ轍が道になる

    View Slide

  105. まとめ
    RDB THE Right Way

    View Slide

  106. まとめ
    RDB THE Right Way

    あなたの道を歩くのはあなた自身

    View Slide

  107. まとめ
    自分自身で改善のサイクルを回す

    View Slide

  108. まとめ
    技術で解決した問題の価値が
    エンジニアの価値

    View Slide

  109. まとめ
    自分自身で問題を解決していきましょう

    View Slide

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

    View Slide