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

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

88f4e84b94fe07cddbd9e6479d689192?s=128

soudai sone

March 24, 2019
Tweet

Transcript

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

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

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

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

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

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

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

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

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

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

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

    まとめ
  12. 自己紹介 曽根 壮大(34歳) 株式会社オミカレ 副社長/CTO • 日本PostgreSQLユーザ会 勉強会分科会 座長 •

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

    3人の子供がいます • 技術的にはWeb/LL言語/RDBが好きです そ ね た け と も
  14. 婚活といえばオミカレ https://party-calendar.net/

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

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

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

  19. フレームワーク依存症 フレームワークを使う ↓ フレームワークの制約を受け入れる

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

  21. フレームワーク依存症 フレームワークの制約? ↓ 例えばORM

  22. RDBMS Model フレームワーク View 情報をやり取りする Modelが事実を加工し、 情報に変更する 事実をやり取りする SQLでやり取りする プログラミング言語

    でやり取りする ORM リレーショナルモデルをプログラミング言語が 扱うオブジェクトモデルに変換する またはその逆を行う
  23. フレームワーク依存症 ORMは漏れのある抽象化

  24. N+1問題 foreach ($blogs as $id => $blog) { echo $blog->get();

    } もしget()の度にSQLが発行されたら?
  25. http://soudai1025.blogspot.com/2016/11/rdbantipattern1.html

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

  27. フレームワーク依存症 Active Record パターン ↓ Viewがテーブル設計に影響を与える

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

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

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

  31. フレームワーク依存症 名前 トーク評価 理由 好きなDB その他 曽根 壮大 最高 ベストスピーカー

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

    PostgreSQL soudai1025 最高 なんとなく MySQL Soudai 最高 SQL Server foo hoge 普通 普通だった Oracle Fuga 悪い その他 Firebird アプリケーションのバグで入る
  33. フレームワーク依存症 フレームワークの制約が ときにはRDBMSにとって毒になる

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

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

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

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

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

  39. アンチパターンを防ぐには? ORMもフレームワークも絶対悪では無い ↓ 漏れのある抽象化と付き合う よりよい抽象化を目指す

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

  41. RDBMS View 会員ページ 会員テーブル 会員サービス 会員データ Model ORM SQL 会員リポジトリ

    サービスに必要な ビジネスロジック キャッシュ ストレージ フレームワーク データクラスはサービスが必要な会員の データを取り出し、加工する。 場合によってはキャッシュから取り出し たり、RDBMSから取り出したりする リポジトリクラスはデータのCRUD部分 だけを担う。 ORM経由でもSQLでもサービスクラスか らは関係ない
  42. アンチパターンを防ぐには? フレームワークに依存しない 最適な設計を常に模索する

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

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

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

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

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

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

  50. ロックのレベル 排他ロック(eXcluded lock) 共有ロック(Shared lock) ロック対象へのすべての アクセスを禁止する ロック対象への参照以外の アクセスを禁止する SELECT、INSERT、UPDATE、

    DELETE、すべて実行できない ほかのトランザクションから参照 (SELECT)でアクセス可能 書き込みロック、X lock と呼ばれることもある 読み込みロック、S lock と呼ばれることもある
  51. ロックの粒度 表ロック 行ロック テーブル(表)を対象にロックするため 該当のテーブル内の行は全て対象になる 行単位で対象をロックする。 1行の場合もあれば、複数行にまたがる 場合もあり、全ての行を対象にすると表 ロックと同義になる テーブルロックと呼ばれることもある

    レコードロックと呼ばれることもある
  52. 知らないロック しかし意図しないロックは デッドロックなど新たな問題を生み出す

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

  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; デッドロック発生!
  55. 知らないロック ロックはとにかく取得するのではなく 順番も大切

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    * FROM hoge SELECT * FROM hoge
  76. マテリアライズド・ビュー アプリケーション マテリアライズド・ビュー テーブル CREATE MATERIALIZED VIEW ビュー名 AS SELECT文;

    マテリアライズド・ビューは実体な のでINDEXを作成することもできる RDBMS SELECT * FROM マテビュー名 マテリアライズド・ビューを REFRESHするまで作成時の状態
  77. アプリケーションキャッシュ RDBMS アプリケーション データを取り出す SELECT * FROM hoge キャッシュ ファイル

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

    Redis アプリケーションがキャッシュの 振る舞いをコントロールできる RDBMSより高速に取り出せるデータストアに アクセスするため高速に処理できる
  79. キャッシュ中毒 キャッシュのトラブルはクリティカル

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

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

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

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

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

  85. アンチパターンを防ぐには? キャッシュは銀の弾丸では無い ↓ キャッシュヒットしない場合は 逆にボトルネックになる

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

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

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

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

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

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

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

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

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

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

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

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

  98. まとめ 今、あるデータベースと向き合うには? ↓ 自分たちで直すしかない

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

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

  101. まとめ 諦めず、仕組みで解決する ↓ 仕組みは技術力で解決できる

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

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

  104. まとめ 技術で問題を解決する ↓ 解決までの歩んだ轍が道になる

  105. まとめ RDB THE Right Way

  106. まとめ RDB THE Right Way ↓ あなたの道を歩くのはあなた自身

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

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

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

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