Slide 1

Slide 1 text

Web開発を⽀える マイグレーションツールについて 第11回 PostgreSQLアンカンファレンス@東京

Slide 2

Slide 2 text

⾃⼰紹介 @yudppp 株式会社HRBrain CTO 好きな⾔葉: 冪等性
 嫌いなモノ: 浮動⼩数点の誤差 基本的にWebエンジニア


Slide 3

Slide 3 text

⽬標評価管理クラウド

Slide 4

Slide 4 text

HRBrainとは • ⽬標と評価を管理するクラウドSaaSを作って いる会社です。 • リリース開始からもうすぐで3年

Slide 5

Slide 5 text

先⽇Buildersconにて
 Row Level Securityは マルチテナントの 銀の弾丸になりうるのか
 という話をしました https://speakerdeck.com/yudppp/row-level-security-is-silver-bullet-for-multitenancy

Slide 6

Slide 6 text

概要 • SaaS開発していく上でリリース頻度を⾼く開 発していくには真のマルチテナント(全ての会 社の情報が⼀つのDB)にしていきたいが、セ キュリティ的な不安要素をPostgreSQLの RowLevelSecurityを使って解決した話

Slide 7

Slide 7 text

PostgreSQL Conference Japanで この内容とマイグレーションについて話そうとしたら CfP落ちました。。

Slide 8

Slide 8 text

現在のリリース頻度 • 週に2回リリース • 毎回ではないがSQLのマイグレーションが頻 繁に必要

Slide 9

Slide 9 text

みなさんマイグレーション の管理どうされていますか

Slide 10

Slide 10 text

元々のマイグレーション管理 gooseというGo製のToolを利⽤

Slide 11

Slide 11 text

起きた問題① Aさん「81_modify_user_birthday_col.sql」 Bさん「81_add_era_table.sql」 Aさん「Merge!」 Bさん「Merge!」 CI 「Test / Deploy 失敗!」

Slide 12

Slide 12 text

CIでTest実⾏した瞬間は ⼤丈夫なので Mergeされる前に 検知するのが難しい

Slide 13

Slide 13 text

起きた問題② 前提:
 みんなでdev環境⼀つを共有していてfeature ブランチをSlackで告知すれば好きなタイミ ングであげれる運⽤ (本当はfeatureブランチごとdeployしたい)

Slide 14

Slide 14 text

起きた問題② Bさん「令和追加した確認するのでdev使い ます。」
 CI 「Deployed!」 Migrationがなぜか呼ばれない。。
 誰かがあげたMigrationがdownされてない

Slide 15

Slide 15 text

この運⽤をしていると Migrationを戻すタイミング が難しい

Slide 16

Slide 16 text

解決策を探す

Slide 17

Slide 17 text

k0kubun/sqldef The easiest idempotent MySQL/PostgreSQL schema management by SQL. This is inspired by Ridgepole but using SQL, so there's no need to remember Ruby DSL. 定義したschema.sqlとDB接続した情報を⽐較し ていい感じにALTER⽂を流してくれる Go製なのでbinaryだけで動く

Slide 18

Slide 18 text

https://github.com/k0kubun/sqldef

Slide 19

Slide 19 text

どうなるか 常にschemaファイルとDBの状態が等しくな るので、上記のような問題は起きない。 もし起きたとしても、schemaファイルが Conflictするので気づける。

Slide 20

Slide 20 text

sqldefの内部実装 Vitess(Vitess is a database clustering system for horizontal scaling of MySQL)のsqlparser のsourceを拡張して作られている。 information_schema.table_constraintsあた りをSELECTした結果を元にCREATE⽂を Buildしている。

Slide 21

Slide 21 text

既知の課題 基本的な構⽂は対応しているが、Vitessから 派⽣したこともありPostgreSQLのあまり使わ れない構⽂が未対応だったりする。(そう例え ばRowLevelSecurityとか) sqldefのPostgreSQLのユーザーがそこまで多 くなさそう。

Slide 22

Slide 22 text

まとめ 冪等性が担保された安全な⽣活がしたい。 sqldefをPostgreSQLで使うユーザーを増やし て、より洗礼されたツールになってほしい 今⽇の発表で1⼈でもユーザーが増えたら嬉 しい

Slide 23

Slide 23 text

参考資料 •SQLで羃等にDBスキーマ管理ができるツー ル「sqldef」を作った (https:// k0kubun.hatenablog.com/entry/2018/08/ 25/114455) •http://vitess.io/