Slide 1

Slide 1 text

データベースに プログレッシブデリバリーを導入しよう Jagu'e'r Observability-SRE分科会 Meetup#7 ハイブリッド 株式会社スリーシェイク 中楯 直希

Slide 2

Slide 2 text

\du 2 株式会社スリーシェイク Sreake事業部 業務内容 ● DBRE兼SRE見習い ○ データベースを中心にインフラ・アプリ領域もがんばってます ● 自称データ雑用係 ○ DBAでもDBREでもデータエンジニアでも 最近注目しているデータベース ● Tsurugi ● YugabyteDB 中楯 直希 @nnaka2992 @nnaka2992.bsky.social

Slide 3

Slide 3 text

● 対象 ○ データベースエンジニア ○ SREer・DBREer ● 伝えたいこと ○ データベース(RDB)におけるプログレッシブデリバリーの種類 ○ Google Cloudでの実現方法 この資料のコンセプト 3

Slide 4

Slide 4 text

● アプリケーションのプログレッシブデリバリーとの違い ● データベースにおけるプログレッシブデリバリー ● まとめ Agenda 4

Slide 5

Slide 5 text

アプリケーションのプログレッシブデリバリーとの違い 01

Slide 6

Slide 6 text

一番の違いはステートの有無 ● アプリケーションはステートを持たない → 壊れてもロールバックすればよい ● データベースはステートを持つ → 壊れた場合の影響が大きい アプリケーションのプログレッシブデリバリーとの違い 6 Google Kubernetes Engine Cloud Functions Cloud Run App Engine Cloud Spanner Cloud SQL Alloy DB

Slide 7

Slide 7 text

アプリケーションのプログレッシブデリバリーとの違い : データベースの復旧 7 データベースを復旧する場合リードタイムが長い ● バックアップから復旧する場合最低でも数時間。 ○ ひどい場合は数日 ○ バックアップの取得方法やアプリケーションの実装によっては 復旧できないデータも データベースこそプログレッシブデリバリーをするべきでは?

Slide 8

Slide 8 text

データベースにおける変更とは? 02

Slide 9

Slide 9 text

データベースにおける変更とは? 9 データベースにおける変更は大きく分けて4つ 1. パラメータの変更 2. ストアドプロシージャ・ファンクション・トリガの変更 3. データベースバージョンの変更 4. テーブル定義の変更

Slide 10

Slide 10 text

データベースにおける変更とは? 10 データベースにおける変更は大きく分けて4つ 1. パラメータの変更 2. ストアドプロシージャ・ファンクション・トリガの変更 3. データベースバージョンの変更 4. テーブル定義の変更 クリティカルな変更になりにくいので省略

Slide 11

Slide 11 text

データベースにおける変更とは? 11 データベースにおける変更は大きく分けて4つ 1. パラメータの変更 2. ストアドプロシージャ・ファンクション・トリガの変更 3. データベースバージョンの変更 4. テーブル定義の変更 今時のアプリケーション開発で導入することは 少ないので省略

Slide 12

Slide 12 text

データベースにおける変更とは? 12 データベースにおける変更は大きく分けて4つ 1. パラメータの変更 2. ストアドプロシージャ・ファンクション・トリガの変更 3. データベースバージョンの変更 4. テーブル定義の変更 今回はこの2つにフォーカスします

Slide 13

Slide 13 text

データベースにおける変更とは? : データベースバージョンの変更 13 基本的には以下の2方式がある 1. インプレースアップデート サービスの停止を伴ううえにロールバックも大変 2. ブルーグリーンアップデート ダウンタイムが最小でロールバックも容易

Slide 14

Slide 14 text

データベースにおける変更とは? : データベースバージョンの変更 14 ブルーグリーンアップデートの手順 1. データベースを新規で作成し、バックアップから復旧 Cloud SQL for PostgreSQL 15 Cloud SQL PostgreSQL 15 バックアップやDMSで複製 Cloud Run SQLを実行

Slide 15

Slide 15 text

データベースにおける変更とは? : データベースバージョンの変更 15 ブルーグリーンアップデートの手順 2. Green をインプレースアップデート Cloud SQL for PostgreSQL 15 Cloud Run SQLを実行 Cloud SQL PostgreSQL 16 アップグレードを実行

Slide 16

Slide 16 text

データベースにおける変更とは? : データベースバージョンの変更 16 ブルーグリーンアップデートの手順 3. Green へのデータ移行を再開 Cloud SQL for PostgreSQL 15 Cloud Run SQLを実行 Cloud SQL PostgreSQL 16 レプリケーションや DMSで書 き込みを複製

Slide 17

Slide 17 text

データベースにおける変更とは? : データベースバージョンの変更 17 ブルーグリーンアップデートの手順 4 - a. アプリケーションの向き先を Green に変更 Cloud SQL for PostgreSQL 15 Cloud Run SQLを実行 Cloud SQL PostgreSQL 16 一番簡単なもののロールバックは出来ない ロールバックを諦められるなら このパターンを利用するべき

Slide 18

Slide 18 text

データベースにおける変更とは? : データベースバージョンの変更 18 ブルーグリーンアップデートの手順 4 - b. アプリケーションの向き先に Green を変更し、逆方向レプリケーションを設定 Cloud SQL for PostgreSQL 15 Cloud Run SQLを実行 Cloud SQL PostgreSQL 16 Blue から Green にレプリ ケーションを実行 ひと手間かかるものの ニアリアルタイムのロールバックが 可能に!

Slide 19

Slide 19 text

データベースにおける変更とは? : データベースバージョンの変更 19 ブルーグリーンアップデートの手順 4 - c. アプリケーションの向き先に Green を追加する Cloud SQL for PostgreSQL 15 Cloud Run SQLを実行 Cloud SQL PostgreSQL 16 データベースは楽できるものの アプリケーションの改修が必要に

Slide 20

Slide 20 text

他クラウドでは a のパターンはマネージドでサポートしていることも データベースにおける変更とは? : データベースバージョンの変更 20 Google Cloudにも頑張っていただきたい

Slide 21

Slide 21 text

データベースにおける変更とは? : テーブルの変更 21 基本的には以下の2方式がある 1. クラスタレベルのブルーグリーンアップデート データベースのアップデートと同じことを行うので、ほとんどのケースで実現可能 2. テーブルレベルのブルーグリーンアップデート 自前でやるハードルは高いものの、ロールバックが非常に簡単

Slide 22

Slide 22 text

データベースにおける変更とは? : テーブルの変更 22 ブルーグリーンアップデートの手順(fullnameカラムの分割) 前提. アプリケーションからアクセスするのは必要なカラムのみに絞ったビューとする Cloud Run Users(View) text text id fullname SQLを実行 Users text text id fullname

Slide 23

Slide 23 text

データベースにおける変更とは? : テーブルの変更 23 ブルーグリーンアップデートの手順(fullnameカラムの分割) 1. firstname / lastname カラムを追加する Cloud Run Users(View) text text id fullname SQLを実行 Users text text id fullname text firstname text lastname

Slide 24

Slide 24 text

データベースにおける変更とは? : テーブルの変更 24 ブルーグリーンアップデートの手順(fullnameカラムの分割) 2. fullname カラムを firstname / lastname カラムに分割してインサートする Cloud Run Users(View) text text id fullname SQLを実行 Users text text id fullname text firstname text lastname スペース等で区切って INSERT INSERTは細かいバッチサイズで 実行すること! 大きなサイズで行くとロック範囲が大きく大障害に ......!

Slide 25

Slide 25 text

データベースにおける変更とは? : テーブルの変更 25 ブルーグリーンアップデートの手順(fullnameカラムの分割) 3. カラムの分割が終わったら Green 用 View を作成する Cloud Run Users(View) text text id fullname SQLを実行 Users text text id fullname text firstname text lastname Users(View) text text text id firstname lastname

Slide 26

Slide 26 text

データベースにおける変更とは? : テーブルの変更 26 ブルーグリーンアップデートの手順(fullnameカラムの分割) 3. Green 用 View を利用するアプリケーションを追加する Cloud Run Users(View) text text id fullname SQLを実行 Users text text id fullname text firstname text lastname Users(View) text text text id firstname lastname

Slide 27

Slide 27 text

データベースにおける変更とは? : テーブルの変更 27 ブルーグリーンアップデートの手順(fullnameカラムの分割) 4 - a. 問題が発生しなければ Blue 用 View を利用するアプリケーションをロールアウトする Cloud Run Users(View) text text id fullname SQLを実行 Users text text id fullname text firstname text lastname Users(View) text text text id firstname lastname

Slide 28

Slide 28 text

データベースにおける変更とは? : テーブルの変更 28 ブルーグリーンアップデートの手順(fullnameカラムの分割) 5 - a. Blue 用 View を削除する Cloud Run SQLを実行 Users text text id fullname text firstname text lastname Users(View) text text text id firstname lastname

Slide 29

Slide 29 text

データベースにおける変更とは? : テーブルの変更 29 ブルーグリーンアップデートの手順(fullnameカラムの分割) 6 - a. 不要なカラムを DROP する Cloud Run SQLを実行 Users text id text firstname text lastname Users(View) text text text id firstname lastname

Slide 30

Slide 30 text

データベースにおける変更とは? : テーブルの変更 30 ブルーグリーンアップデートの手順(fullnameカラムの分割) 6 - a. 不要なカラムを DROP する Cloud Run SQLを実行 Users text id text firstname text lastname Users(View) text text text id firstname lastname リリースが完了!

Slide 31

Slide 31 text

データベースにおける変更とは? : テーブルの変更 31 ブルーグリーンアップデートの手順(fullnameカラムの分割) 4 - b. 問題が発生した場合 Green 用 View を利用するアプリケーション切り戻す Cloud Run Users(View) text text id fullname SQLを実行 Users text text id fullname text firstname text lastname Users(View) text text text id firstname lastname

Slide 32

Slide 32 text

データベースにおける変更とは? : テーブルの変更 32 ブルーグリーンアップデートの手順(fullnameカラムの分割) 5 - b. Green 用 View を削除する Cloud Run Users(View) text text id fullname SQLを実行 Users text text id fullname text firstname text lastname

Slide 33

Slide 33 text

データベースにおける変更とは? : テーブルの変更 33 ブルーグリーンアップデートの手順(fullnameカラムの分割) 6 - b. 不要になったカラムを DROP する Cloud Run Users(View) text text id fullname SQLを実行 Users text text id fullname

Slide 34

Slide 34 text

データベースにおける変更とは? : テーブルの変更 34 ブルーグリーンアップデートの手順(fullnameカラムの分割) 6 - b. 不要になったカラムを DROP する Cloud Run Users(View) text text id fullname SQLを実行 Users text text id fullname ロールバックが完了!

Slide 35

Slide 35 text

データベースにおける変更とは? : テーブルの変更 35 テーブルレベルでブルーグリーンする方法はメリットが大きい ● 手順はデータベースによって若干かわるものの、ほとんどの DBで適用できる ● ただし手順が複雑 ○ PostgreSQL であればツールがある ■ pgroll ■ reshape MySQL 版をご存じの方教えてください

Slide 36

Slide 36 text

まとめ 03

Slide 37

Slide 37 text

まとめ 37 ● データベースでもブルーグリーンデプロイメント程度なら可能! ○ マネージドブルーグリーンデプロイメントを出してほしい ● テーブルレベルでブルーグリーンデプロイメントを行うことで アプリケーションのプログレッシブデリバリーと接続することが可能 ○ とても複雑なものの、一連を自動化したツールもある

Slide 38

Slide 38 text

38 参考資料 38 ● データを移行してデータベースのメジャー バージョンをアップグレードする | Cloud SQL for MySQL ○ https://cloud.google.com/sql/docs/mysql/upgrade-major-db-version-migrate?hl=ja ● データを移行してデータベースのメジャー バージョンをアップグレードする | Cloud SQL for PostgreSQL ○ https://cloud.google.com/sql/docs/postgres/upgrade-major-db-version-migrate?hl=ja ● Aurora MySQL 一段飛ばしのバージョンアップとその他もろもろの話 ○ https://www.docswell.com/s/hmatsu47/Z7WR15-2022-11-21-232543 ● Amazon RDS ブルー/グリーンデプロイの概要 ○ https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/blue-green-deployments-overview.html

Slide 39

Slide 39 text

39 参考資料 39 ● Postgres schema changes are still a PITA | xata ○ https://xata.io/blog/postgres-schema-changes-pita ● Handling table and column renames | PlanetScale ○ https://planetscale.com/docs/learn/handling-table-and-column-renames#how-to-rename-a-column-on-planetscale ● 運用中のPostgreSQLのスキーマを無停止で安全に変更する | 株式会社ヌーラボ(Nulab inc.) ○ https://nulab.com/ja/blog/typetalk/change-postgresql-schema-with-safety-and-non-stop/ ● Safe and unsafe operations for high volume PostgreSQL | Leopard Blog ○ https://leopard.in.ua/2016/09/20/safe-and-unsafe-operations-postgresql ● 令和最新版: PostgreSQLの安全なSET NOT NULL | Wantedly Engineer Blog ○ https://www.wantedly.com/companies/wantedly/post_articles/433252

Slide 40

Slide 40 text

40 参考資料 40 ● Introducing pgroll: zero-downtime, reversible, schema migrations for Postgres | xata ○ https://xata.io/blog/pgroll-schema-migrations-postgres ● pgrollで実現するスキーマブルーグリーンデプロイメント ○ https://speakerdeck.com/nnaka2992/pgrolldeshi-xian-surusukimaburugurindepuroimento ● sqldefとpgrollを利用したPostgreSQLでのスキーマブルーグリーンデプロイメント ○ https://zenn.dev/nnaka2992/articles/blue_grean_on_postgres_with_sqldeff_and_pgroll ● xataio/pgroll ○ https://github.com/xataio/pgroll ● fabianlindfors/reshape ○ https://github.com/fabianlindfors/reshape