Slide 1

Slide 1 text

© 2025 Wantedly, Inc. 初めてのPostgreSQL メジャーバージョンアップ 第52回PostgreSQLアンカンファレンス March 27 2025 - Ken Kato

Slide 2

Slide 2 text

© 2025 Wantedly, Inc. 自己紹介 加藤 健 所属:ウォンテッドリー株式会社 職種:インフラエンジニア 業務:AWS上でKubernetes、PostgreSQLを運用 X: @kkato25 2

Slide 3

Slide 3 text

© 2025 Wantedly, Inc. 背景 ● RDS for PostgreSQL / Aurora PostgreSQL で使用中のバージョンが標準サ ポート終了 (EOL) を迎える ● 期日までに対応しないと... ○ 延長サポートに入ることにより、追加コストが発生する ○ コミュニティからのセキュリティパッチが提供されないので、セキュリティリスク が高まる ○ 依存ライブラリやツールとの互換性問題が発生しやすくなる ○ 新しい機能が使えない 3

Slide 4

Slide 4 text

© 2025 Wantedly, Inc. プロジェクトのゴール EOLまでに対象データベースをアップグレードすること ● 対象データベース: ○ RDS for PostgreSQL: 11インスタンス ○ Aurora PostgreSQL: 5クラスタ 4

Slide 5

Slide 5 text

© 2025 Wantedly, Inc. 私の状況 ● 私1人でプロジェクトを進めることになった ● 人生初の PostgreSQL アップグレード ● 社内にPostgreSQLのメジャーバージョンアップ経験者はおらず、手順もドキュメン トも残っていない状態 5

Slide 6

Slide 6 text

© 2025 Wantedly, Inc. 進め方 ● スケジュール決め ● 破壊的変更の有無確認、対応 ● AWS公式ドキュメントを参考に手順作成 ● メンテナンスタイム調整、ユーザーアナウンス ● 開発環境、テスト環境でアップグレード ○ うまくいかなかった手順を修正する ● 本番環境でアップグレード 6

Slide 7

Slide 7 text

© 2025 Wantedly, Inc. 想定通りにはいかず、2回対応することになりました 7

Slide 8

Slide 8 text

© 2025 Wantedly, Inc. 想定と違ったポイント 1. ANALYZEが終わらなかった 2. パラメータグループの差異により、アップグレードに失敗した 3. 拡張機能 (pgAudit) のアップグレードに失敗した 8

Slide 9

Slide 9 text

© 2025 Wantedly, Inc. 1. ANALYZEが終わらなかった ANALYZE実行が必要な理由: ● PostgreSQLのメジャーバージョンアップ後は、統計情報が白紙になる ● PostgreSQLは統計情報をもとに実行計画を決定するため、統計情報がないと、 実際のデータに合わない非効率な実行計画でクエリを実行してしまう -> ANALYZEを実行することで、統計情報を最新にし、効率的なクエリが実行されるよう になる。 ANALYZE実行 統計情報を最新化 効率的なクエリ 9

Slide 10

Slide 10 text

© 2025 Wantedly, Inc. 1. ANALYZEが終わらなかった 通常20分以内で終わるはずのANALYZEが、2時間以上経っても終わらなかった。 理由としては... ● 外部アクセスを遮断していたが、夜間バッチジョブがクエリを実行していた ● 非効率なクエリが実行されていて、CPU使用率が90%以上に張り付いていた -> メンテナンスタイム中に完了しなかったので、バックアップから切り戻した。 PostgreSQL バッチジョブ 10

Slide 11

Slide 11 text

© 2025 Wantedly, Inc. 1. ANALYZEが終わらなかった 対策: ● 実行中のセッション (参照系のみ) を定期的に切断した ● 実行を並列化した SELECT pg_terminate_backend(pid),query,usename FROM pg_stat_activity WHERE query LIKE 'SELECT%' AND pid <> pg_backend_pid() AND usename <> 'rdsadmin' vacuumdb $DATABASE_URL -j 8 –analyze-only -v 11

Slide 12

Slide 12 text

© 2025 Wantedly, Inc. 2. パラメータグループの差異により、アップグレードに失敗した 開発環境、テスト環境では問題なく動いていたコマンドが、本番環境でエラーになってし まった。 原因は... ● 本番環境では、デフォルトパラメータグループではなく、カスタムパラメータグループ を使っていたから % aws rds modify-db-cluster --db-cluster-identifier XXX --engine-version 13.16 --apply-immediately --allow-major-version-upgrade An error occurred (InvalidParameterCombination) when calling the ModifyDBCluster operation: The current DB instance parameter group XXX is custom. You must explicitly specify a new DB instance parameter group, either default or custom, for the engine version upgrade. 12

Slide 13

Slide 13 text

© 2025 Wantedly, Inc. 2. パラメータグループの差異により、アップグレードに失敗した 本番環境との環境差異に気づけなかった。 ● 本番環境と同じ構成にする ● 本番環境のパラメータや設定を比較する 環境 パラメータグループ 開発環境 デフォルト テスト環境 デフォルト 本番環境 カスタム 13

Slide 14

Slide 14 text

© 2025 Wantedly, Inc. 3. 拡張機能 (pgAudit) のアップグレードに失敗した 拡張機能 (pgAudit) のアップグレード時に、以下のエラーが発生した。 ● pgAuditにはアップグレード用のスクリプトが存在しない ● 一度DROPした後、再度CREATEする必要があった % ALTER EXTENSION pgaudit UPDATE TO 'X.X.X' ERROR: extension "pgaudit" has no update path from version "X.X.X" to version "X.X.X" https://github.com/pgaudit/pgaudit/issues/191 14

Slide 15

Slide 15 text

© 2025 Wantedly, Inc. 3. 拡張機能 (pgAudit) のアップグレードに失敗した 原因は... ● 開発環境、テスト環境での事前検証をしていなかった ● 事前検証と違う手順で実施していた 15

Slide 16

Slide 16 text

© 2025 Wantedly, Inc. 今回学んだこと ANALYZEが終わらない ● 設定や構成といった静的な条件だけでなく、ジョブや負荷状況などの動的な条件も 考慮する必要がある パラメータグループの差異により、アップグレードに失敗した ● 開発環境、テスト環境でも本番環境と同じ設定、構成にする ● 本番のパラメータや設定の差分を事前に確認・比較する 拡張機能 (pgAudit) のアップグレードに失敗した ● 開発環境、テスト環境で事前検証する ● 本番環境でも事前検証と同じ手順で実施する 16

Slide 17

Slide 17 text

© 2025 Wantedly, Inc. ブログ ブログも書いたので、もしよければ参考にしてみてください。 17 https://www.wantedly.com/companies/wantedly/post_articles/963618