Slide 1

Slide 1 text

あのプロジェクトは今。 僕が考えた 最強のRDBリファクタリング 吉祥寺.pm #18

Slide 2

Slide 2 text

What is it? 吉祥寺.P(roject)M(anagement)

Slide 3

Slide 3 text

What is it? みなさん覚えていますか?

Slide 4

Slide 4 text

What is it?

Slide 5

Slide 5 text

What is it? RDBリファクタリングの話

Slide 6

Slide 6 text

What is it? あれから一年

Slide 7

Slide 7 text

What is it? そーだいなる物語が今、始まる

Slide 8

Slide 8 text

あじぇんだ 1 自己紹介 2 おさらい 3 技術で解決できたこと 4 技術で解決できなかった事 5 まとめ

Slide 9

Slide 9 text

あじぇんだ 1 自己紹介 2 おさらい 3 技術で解決できたこと 4 技術で解決できなかった事 5 まとめ

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

あじぇんだ 1 自己紹介 2 おさらい 3 技術で解決できたこと 4 技術で解決できなかった事 5 まとめ

Slide 15

Slide 15 text

おさらい オミカレは DBリファクタリングをしています

Slide 16

Slide 16 text

https://employment.en-japan.com/engineerhub/entry/2018/12/11/110000

Slide 17

Slide 17 text

おさらい なぜ 我々はリファクタリングするのか

Slide 18

Slide 18 text

リファクタリングをする理由 システム、三日会わざれば刮目して見よ

Slide 19

Slide 19 text

リファクタリングをする理由 いなかった時期

Slide 20

Slide 20 text

リファクタリングをする理由 わずか1年半 しかし成長するには充分な時間である

Slide 21

Slide 21 text

リファクタリングをする理由 とある日の出来事 「TABLEを眺める会をやろう!」

Slide 22

Slide 22 text

リファクタリングをする理由 このTABLEってなんですか? それな、俺も知らないんだ…

Slide 23

Slide 23 text

リファクタリングをする理由 誰も知らないTABLEの恐怖

Slide 24

Slide 24 text

謎のデータ mysql> SELECT gender FROM demo GROUP BY gender; +--------+ | gender | +--------+ | 0 | | 1 | | 女性 | | 男性 | +--------+ 4 rows in set (0.62 sec)

Slide 25

Slide 25 text

なるほど???

Slide 26

Slide 26 text

リファクタリングをする理由 8年目のWebサービス

Slide 27

Slide 27 text

リファクタリングをする理由 8年目のWebサービス ↓ 多くの変化によって、技術的負債が出来る 事業の成長のために優先順として仕方ないところもある

Slide 28

Slide 28 text

リファクタリングをする理由 有るモノを嘆いても何も変わらない

Slide 29

Slide 29 text

リファクタリングをする理由 有るモノを嘆いても何も変わらない ↓ 自分たちが技術で解決していくしか無い

Slide 30

Slide 30 text

あじぇんだ 1 自己紹介 2 おさらい 3 技術で解決できたこと 4 技術で解決できなかった事 5 まとめ

Slide 31

Slide 31 text

技術で解決できたこと 要件 • なるべく無停止で進めたい • 複数のWebサービスから参照される が同時には直せない • 工数は限られ、新規開発は止めない

Slide 32

Slide 32 text

リファクタリング方針 Aurora みんなの婚活 オミカレ party_detail party_open party 既存スキーマ 新スキーマ オミカレ データベース トリガー

Slide 33

Slide 33 text

リファクタリング方針 Aurora みんなの婚活 オミカレ party_detail party_open party 既存スキーマ 新スキーマ オミカレ データベース トリガー ① アプリケーション がデータを書き込む

Slide 34

Slide 34 text

リファクタリング方針 Aurora みんなの婚活 オミカレ party_detail party_open party 既存スキーマ 新スキーマ オミカレ データベース トリガー ②書き込みをイベント にトリガーが起動

Slide 35

Slide 35 text

リファクタリング方針 Aurora みんなの婚活 オミカレ party_detail party_open party 既存スキーマ 新スキーマ オミカレ データベース トリガー ③トリガーがそれぞれのテーブル に書き込みを行う

Slide 36

Slide 36 text

リファクタリング方針 Aurora みんなの婚活 オミカレ party_detail party_open party 既存スキーマ 新スキーマ PostgreSQL トリガー 異種DB間の レプリケーションが必要

Slide 37

Slide 37 text

技術で解決できたこと AWS Database Migration Service

Slide 38

Slide 38 text

Amazon DMSの仕組み ソース エンドポイント (Aurora) タスク テーブル単位でのレプリケーションが可能 ターゲット エンドポイント (PostgreSQL) レプリケーション インスタンス タスク

Slide 39

Slide 39 text

Amazon DMSの仕組み https://speakerdeck.com/takahashiikki/postgresqljapan2018

Slide 40

Slide 40 text

リファクタリング方針 Aurora みんなの婚活 オミカレ party_detail party_open party 既存スキーマ 新スキーマ PostgreSQL トリガー 出来る!

Slide 41

Slide 41 text

技術で解決できたこと 運用での出来事

Slide 42

Slide 42 text

技術で解決できたこと 時々DMSが止まるッス! データの登録時のエラーを監視しよう

Slide 43

Slide 43 text

技術で解決できたこと RDSのログを PHP経由で定期的にチェックする

Slide 44

Slide 44 text

技術で解決できたこと 1. AWS SDK for PHPで downloadDBLogFilePortion関数を実行 2. Errorなどの特定のキーワードを拾ってalert 3. Mackerelのチェック監視の仕組みで通知

Slide 45

Slide 45 text

技術で解決できたこと AWS php mackerel-agent Slack ① SDKを実行 ② ログを取得 ③ ログを確認 ④Mackerel経由で通知 Mackerel-agentが定期的に実行する

Slide 46

Slide 46 text

技術で解決できたこと 既存のコードテスト無いッス! REST APIでモデルを抽象化してそこにテストを加工

Slide 47

Slide 47 text

技術で解決できたこと https://employment.en-japan.com/engineerhub/entry/2018/12/11/110000

Slide 48

Slide 48 text

技術で解決できたこと 参照を切り替える

Slide 49

Slide 49 text

技術で解決できたこと 参照を切り替える ↓ API経由にすることでModel単位で対応

Slide 50

Slide 50 text

この方法のメリット • Model単位で移行が可能 – 対象のテーブル単位で対応できる – リスクの範囲を小さくできる • 既存の仕組みを止める必要が無い – カナリヤリリース出来る – ロールバックしやすい • 以下のパターンで概ねリスク低く、対応出来る – 読み込みだけAPIにして書き込みはOLD • この場合はデータはAmazon DMSで連携 – 書き込みはAPIとOLDの両方に書き込み、 読み込みはOLD • この場合はAmazon DMSを使わない

Slide 51

Slide 51 text

実際に運用してわかったこと 1. 性別がintでは無く文字列のため表記揺れ 2. MySQLのZero Date問題(0000-00-00) 3. タイムゾーンがUTCでズレる

Slide 52

Slide 52 text

技術で解決できたこと 想定外のデータは意外とある

Slide 53

Slide 53 text

技術で解決できたこと 想定外のデータは意外とある ↓ 細かい制約と監視・観測で 1つ1つ潰して行く

Slide 54

Slide 54 text

あじぇんだ 1 自己紹介 2 おさらい 3 技術で解決できたこと 4 技術で解決できなかった事 5 まとめ

Slide 55

Slide 55 text

技術で解決できなかった事 全てを1回で捨てれなかった

Slide 56

Slide 56 text

技術で解決できなかった事 全てを1回で捨てれなかった ↓ 具体的には管理画面とか

Slide 57

Slide 57 text

技術で解決できなかった事 ユーザ画面変更に対する 画面リニューアルのリスク

Slide 58

Slide 58 text

技術で解決できなかった事 ユーザが本当に付いて来るか SEOは大丈夫か

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

技術で解決できなかった事 売上の拡大 ↓ 技術的に優れているからと言って 売れるとは限らない

Slide 66

Slide 66 text

あじぇんだ 1 自己紹介 2 おさらい 3 技術で解決できたこと 4 技術で解決できなかった事 5 まとめ

Slide 67

Slide 67 text

まとめ まだ絶賛リファクタリング中なので 進捗を今後も報告していきます! (辛かったとこも含めて)

Slide 68

Slide 68 text

オミカレは仲間を募集中です デザイナやマーケやエンジニアを 絶賛 大募集中です https://party-calendar.net/corp/recruite

Slide 69

Slide 69 text

まとめ ここで一句

Slide 70

Slide 70 text

まとめ 改善は 今日の一歩が 道になる

Slide 71

Slide 71 text

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