Movatterモバイル変換


[0]ホーム

URL:


つくって壊して直して学ぶ Database on Kubernetes (CloudNative Days Summer 2025 発表資料)

つくって壊して直して学ぶ Database on Kubernetes(CloudNative Days Summer 2025 発表資料)2025年5月23日(金)NTTデータOSSビジネス推進室小林 隆浩、加藤 慎也

Embed presentation

© 2025 NTT DATA Japan Corporationつくって壊して直して学ぶDatabase on Kubernetes2025/5/23株式会社NTTデータ小林 隆浩、加藤 慎也れ
© 2025 NTT DATA Japan Corporation 2今日話すこと⚫ Database(PostgreSQL) on Kubernetesを構築する際に気にするべきポイントや、実際の運用で発生するかも知れない障害とその対応を紹介する。• 「壊して」というより「壊れて学ぶ」のやり方⚫ Operatorはここ数年で進化したが、やはりDBには固有の運用があり、理解が難しい。• 例えば、バックアップやリストア• 急なDBクラスターの停止、など⚫ Kubernetesのストレージ周りの機能を使いながら、Database on Kubernetesを運用する際にそうした機能をどう活かすかについても、一緒に学んでいこう。
© 2025 NTT DATA Japan Corporation 3アジェンダ1. はじまり - DB on Kubernetesは突然に -2. つくって学ぶDatabase on Kubernetes3. 壊して直して学ぶDatabase on Kubernetes4. 問い合わせ#1 「晴れ時々エラー!?」5. 問い合わせ#2 「生き返らないクラスター!?」6. 問い合わせ#3 「消えないで!テーブル!?」7. まとめ
© 2025 NTT DATA Japan Corporation 4© 2025 NTT DATA Japan Corporation1.はじまり
© 2025 NTT DATA Japan Corporation 5Database on Kubernetesは突然に⚫ カトウ君に上司の藤井さんから依頼が届いているようです!(今回の登場人物)藤井さんカトウ君 こばさんポスグレチームアプリケーションチーム依頼問い合わせ
© 2025 NTT DATA Japan Corporation 6データベース要件の確認制定日:2024/8/10 DB種別 ■ PostgreSQL □ MySQL □ Oracle(ライセンスは持ち込みのみ) ※必須1 インスタンス数 □ 1 (冗長性なし。開発環境での利用を想定) ※必須□ 2 (冗長性あり。非同期を前提とするため、ラグ・データ損失を許容)■ 3 (冗長性あり。同期を前提とするため、データ損失はゼロ)2 バックアップ □ コールドバックアップ ※必須□ オンラインバックアップ■ オンラインバックアップ+アーカイブログ (PITRに対応可能)3 保持期間 30 日間 ※必須4 申請日 西暦 2025 年 4 月 1 日 ※必須5 申請承認者 ※必須金融第一事業部 部長 xxxxx6 記入者 事業部等・担当名 金融第一事業部 ※必須氏名 yyyyy ※必須7 連絡先 事業部等・担当名■ 記入者と同じ場合はこちらをチェック2024.8版DBクラスター 作成申請書担当・グループ名 役職 氏名 担当・グループ名
© 2025 NTT DATA Japan Corporation 7想定するPostgreSQLの構成⚫ 3インスタンスで同期レプリケーションを構成し、バックアップとアーカイブを取得する。プライマリ スタンバイ① スタンバイ②Data WALアーカイブWAL Data WAL Data更新 参照WALをスタンバイに転送①、②のうち1台に、同期レプリケーションが完了すればOK定期的にWALをアーカイブバックアップ
© 2025 NTT DATA Japan Corporation 8(参考)RDSのMulti-AZ DB Cluster⚫ 3インスタンスの構成。⚫ それぞれのインスタンスが、別AZに配置される。⚫ Write以外のインスタンスでも、読み取りクエリの処理が可能。但し、更新ラグが発生する。⚫ エンドポイントは下記の3種類。• Read/Write• Readのみ• 個別インスタンスhttps://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/multi-az-db-clusters-concepts.html#multi-az-db-clusters-concepts-overview
© 2025 NTT DATA Japan Corporation 9© 2025 NTT DATA Japan Corporation2.つくって学ぶDatabase on Kubernetes
© 2025 NTT DATA Japan Corporation 10KubernetesにおけるPostgreSQL Operatorとは⚫ Kubernetes上でのデータベース運用を補助する機能が実装されている。• レプリケーションを使った高可用性構成、障害時切り替え等をYAMLで簡単に設定できる。• バックアップ/リストアも設定可能で、クラウドストレージと連携できる。PostgreSQL Operatorプライマリ スタンバイ スタンバイプライマリ向けService
© 2025 NTT DATA Japan Corporation 11PostgreSQL Operatorの比較⚫ PostgreSQL向けにも複数のOperatorが存在。今回はCloudNativePGを利用する。名称 開発主体 ライセンス 備考PGO Crunchy Data Apache 2.0 *• 古参Operatorの1つ。機能は十分揃っている。• 従来のPostgreSQL向けOSSを組み合わせた構成。• コンテナイメージの商用利用が実質できない。postgres-operator Zalando MIT• 古参Operatorの1つ。機能は十分揃っている。• 従来のPostgreSQL向けOSSを組み合わせた構成。• Kubernetesに詳しいエンジニアが利用しやすい。CloudNativePG EDB Apache 2.0• PostgreSQL開発で有名なEDBによるOperator。• EDBが提供されているマネージドサービス内部でも利用されている。• 2025年、CNCF Sandbox Projectに。StackGres OnGres AGPL 3• 充実した管理UIを提供。• ライセンスがネックとなる可能性あり。Percona Operatorfor PostgreSQLPercona Apache 2.0• MySQLやPostgreSQLの開発で有名なPerconaのOperator。• PGOをフォークして開発。完全OSSでの利用が可能。• 比較的新しいOperator。
© 2025 NTT DATA Japan Corporation 12PostgreSQL on Kubernetesのシステム構成⚫ GKE上でCloudNativePGを用いて、以下の構成のPostgreSQL on Kubernetesを構築する。SnapshotSnapshotSnapshotRWRROPSSWALをGCSにアーカイブ
© 2025 NTT DATA Japan Corporation 13(例)PostgreSQLクラスター用のYAML⚫ 3インスタンス⚫ 同期レプリケーションの設定⚫ データストレージ⚫ WAL用のストレージ⚫ バックアップ設定
© 2025 NTT DATA Japan Corporation 14© 2025 NTT DATA Japan Corporation3.壊して直して学ぶDatabase on Kubernetes
© 2025 NTT DATA Japan Corporation 15①壊して直して学ぶ:Podの障害SnapshotSnapshotSnapshotRWRROPSSPrimary Podの障害
© 2025 NTT DATA Japan Corporation 16①Primary Podの疑似障害⚫ クラスタの状態を確認⚫ Primary Podを削除$ kubectl cnpg status test-dbInstances statusName Current LSN Replication role Status QoS Manager Version Node---- ----------- ---------------- ------ --- --------------- ----test-db-1 0/6055A58 Primary OK BestEffort 1.25.1 gke-cluster-bb3caaa1-hdsvtest-db-2 0/6055A58 Standby (sync) OK BestEffort 1.25.1 gke-cluster-bb3caaa1-2swntest-db-3 0/6055A58 Standby (sync) OK BestEffort 1.25.1 gke-cluster-bb3caaa1-zpcm$ kubectl delete pod test-db-1pod "test-db-1" deleted
© 2025 NTT DATA Japan Corporation 17①Primary Pod障害の確認と復旧⚫ CloudNativePGのログ⚫ クラスタの状態を確認$ kubectl cnpg status test-dbInstances statusName Current LSN Replication role Status QoS Manager Version Node---- ----------- ---------------- ------ --- --------------- ----test-db-2 0/70066E0 Primary OK BestEffort 1.25.1 gke-cluster-bb3caaa1-2swntest-db-1 0/70066E0 Standby (sync) OK BestEffort 1.25.1 gke-cluster-bb3caaa1-hdsvtest-db-3 0/70066E0 Standby (sync) OK BestEffort 1.25.1 gke-cluster-bb3caaa1-zpcm{"level":"info","ts":"2025-05-19T00:54:27.598548554Z","msg":"Current primary isn't healthy, initiating afailover","controller":"cluster","controllerGroup":"postgresql.cnpg.io","controllerKind":"Cluster","Cluster":{"name":"test-db","namespace":"default"},"namespace":"default","name":"test-db","reconcileID":"a90e0a46-6bf1-4f36-9dca-b83f6bb5567e"}{"level":"info","ts":"2025-05-19T00:54:27.740028855Z","msg":"Failing over","controller":"cluster","controllerGroup":"postgresql.cnpg.io","controllerKind":"Cluster","Cluster":{"name":"test-db","namespace":"default"},"namespace":"default","name":"test-db","reconcileID":"a90e0a46-6bf1-4f36-9dca-b83f6bb5567e","newPrimary":"test-db-2"}
© 2025 NTT DATA Japan Corporation 18②壊して直して学ぶ:Podの障害SnapshotSnapshotSnapshotRWRROPSSStandby Podの障害
© 2025 NTT DATA Japan Corporation 19②Standby Podの疑似障害⚫ クラスタの状態を確認⚫ Standby Podを削除$ kubectl delete pod test-db-1pod "test-db-1" deleted$ kubectl cnpg status test-dbInstances statusName Current LSN Replication role Status QoS Manager Version Node---- ----------- ---------------- ------ --- --------------- ----test-db-2 0/9000000 Primary OK BestEffort 1.25.1 gke-cluster-bb3caaa1-2swntest-db-1 0/9000000 Standby (sync) OK BestEffort 1.25.1 gke-cluster-bb3caaa1-hdsvtest-db-3 0/9000000 Standby (sync) OK BestEffort 1.25.1 gke-cluster-bb3caaa1-zpcm
© 2025 NTT DATA Japan Corporation 20②Standby Pod障害の確認と復旧⚫ CloudNativePGのログ⚫ クラスタの状態を確認{“level”:“info”,"ts":"2025-05-19T01:06:20.510661896Z","msg":"Creating new Pod to reattach a PVC","controller":"cluster","controllerGroup":"postgresql.cnpg.io","controllerKind":"Cluster","Cluster":{"name":"test-db","namespace":"default"},"namespace":"default","name":"test-db","reconcileID":"9812324d-b86d-4d21-a43d-39fb6ac7f77b","pod":"test-db-1","pvc":"test-db-1"}{"level":"info","ts":"2025-05-19T01:06:31.80588422Z","msg":"Setting replica label","controller":"cluster","controllerGroup":"postgresql.cnpg.io","controllerKind":"Cluster","Cluster":{"name":"test-db","namespace":"default"},"namespace":"default","name":"test-db","reconcileID":"eb962e67-b7a2-4ba0-9bce-29b5c4de5049","pod":"test-db-1"}{"level":"info","ts":"2025-05-19T01:06:37.768017501Z","msg":"Cluster has become healthy","controller":"cluster","controllerGroup":"postgresql.cnpg.io","controllerKind":"Cluster","Cluster":{"name":"test-db","namespace":"default"},"namespace":"default","name":"test-db","reconcileID":"c47b81a5-dc5b-4c9c-9673-edfbd7dfac6e"}$ kubectl cnpg status test-dbInstances statusName Current LSN Replication role Status QoS Manager Version Node---- ----------- ---------------- ------ --- --------------- ----test-db-2 0/9000000 Primary OK BestEffort 1.25.1 gke-cluster-bb3caaa1-2swntest-db-1 0/9000000 Standby (sync) OK BestEffort 1.25.1 gke-cluster-bb3caaa1-hdsvtest-db-3 0/9000000 Standby (sync) OK BestEffort 1.25.1 gke-cluster-bb3caaa1-zpcm
© 2025 NTT DATA Japan Corporation 21⚫ CloudNativePGはデフォルトでノード障害に耐えられる設定となっている。ゾーン障害に備えたPodの配置戦略(podAntiAffinity)ノードPSSゾーンノードPゾーンSSノードPSSノード障害で全滅 ノード障害に耐性 ゾーン障害に耐性enablePodAntiAffinity:truetopologyKey:kubernetes.io/hostnameenablePodAntiAffinity:false enablePodAntiAffinity:truetopologyKey:topology.kubernetes.io/zone
© 2025 NTT DATA Japan Corporation 22⚫ 特定のラベルをもつノードにスケジューリングする。⚫ データベースは特定HWが設定されたノードにスケジューリングしたい場合などに有用。• DB高速化のためにメモリ増強、高速SSDを搭載など• 今後はGPU搭載なども要件として登場するかもしれない性能も考慮したPodの配置戦略(nodeSelector)nttdata.com/role: db nttdata.com/role: app
© 2025 NTT DATA Japan Corporation 23CloudNativePGでの設定方法apiVersion: postgresql.cnpg.io/v1kind: Clustermetadata:name: pgcluster-prodspec:affinity:enablePodAntiAffinity: truetopologyKey: kubernetes.io/hostnamepodAntiAffinityType: requirednodeSelector:nttdata.com/role: db⚫ podAntiAffinityを有効化⚫ ホスト名で分散⚫ 条件を満たすことが必須⚫ データベース用ノードに⚫ GKEノードプールにラベルを設定済み
© 2025 NTT DATA Japan Corporation 24③壊して直して学ぶ:Nodeの障害SnapshotSnapshotSnapshotRWRROPSSPrimary Podが存在するノードの障害
© 2025 NTT DATA Japan Corporation 25③Nodeの疑似障害⚫ クラスタの状態を確認⚫ Primary Podのあるノードを削除$ kubectl delete node gke-cluster-bb3caaa1-2swnnode "gke-cluster-kato-default-pool-bb3caaa1-2swn" deleted$ kubectl cnpg status test-dbInstances statusName Current LSN Replication role Status QoS Manager Version Node---- ----------- ---------------- ------ --- --------------- ----test-db-2 0/9000000 Primary OK BestEffort 1.25.1 gke-cluster-bb3caaa1-2swntest-db-1 0/9000000 Standby (sync) OK BestEffort 1.25.1 gke-cluster-bb3caaa1-hdsvtest-db-3 0/9000000 Standby (sync) OK BestEffort 1.25.1 gke-cluster-bb3caaa1-zpcm
© 2025 NTT DATA Japan Corporation 26③Node障害の確認と復旧⚫ CloudNativePGのログ⚫ クラスタの状態を確認{"level":"info","ts":"2025-05-19T01:33:40.453415481Z","msg":"Current primary isn't healthy, initiating afailover","controller":"cluster","controllerGroup":"postgresql.cnpg.io","controllerKind":"Cluster","Cluster":{"name":"test-db","namespace":"default"},"namespace":"default","name":"test-db","reconcileID":"3e4c576c-1e4a-4b0d-9bd0-3fd129e86716"}{"level":"info","ts":"2025-05-19T01:33:40.718655379Z","msg":"Failing over","controller":"cluster","controllerGroup":"postgresql.cnpg.io","controllerKind":"Cluster","Cluster":{"name":"test-db","namespace":"default"},"namespace":"default","name":"test-db","reconcileID":"3e4c576c-1e4a-4b0d-9bd0-3fd129e86716","newPrimary":"test-db-1"}$ kubectl cnpg status test-dbInstances statusName Current LSN Replication role Status QoS Manager Version Node---- ----------- ---------------- ------ --- --------------- ----test-db-1 0/B000000 Primary OK BestEffort 1.25.1 gke-cluster-bb3caaa1-hdsvtest-db-2 0/B000000 Standby (sync) OK BestEffort 1.25.1 gke-cluster-bb3caaa1-td3ttest-db-3 0/B000000 Standby (sync) OK BestEffort 1.25.1 gke-cluster-bb3caaa1-zpcmz
© 2025 NTT DATA Japan Corporation 27ここまでのまとめ⚫ PostgreSQL Operatorは複数あるので、要件に合わせて選択しましょう。• 机上での比較だとあまり差異がわからないので、実際に使ってみることも重要⚫ すべての障害への対策は不可能だが、何が許容できる・できないかを整理することが重要。• Pod障害/ノード障害/ゾーン障害/リージョン障害• RPO/RTO⚫ パフォーマンスの観点からデータベースPodはアプリケーションPodとは別のノードにスケジューリングすることも考える。• 大容量メモリ・高いIO性能/低遅延・広帯域の安定したネットワークが必要• 他Podとのリソース競合を避ける
© 2025 NTT DATA Japan Corporation 28© 2025 NTT DATA Japan Corporation4.#1 晴れ時々エラー
© 2025 NTT DATA Japan Corporation 29#1 エラーになったり、ならなかったり?(更新時にエラーが発生している画面)(同じ画面、同じレコードでも成功することもある)(エラー時のサーバ側ログ)
© 2025 NTT DATA Japan Corporation 30#1 アプリケーションと動作確認時の接続経路⚫ PoC的な位置づけで、本番時の接続と異なる経路でテストを行っていた。APLSnapshotSnapshotSnapshotRWRROPSS動作確認?
© 2025 NTT DATA Japan Corporation 31#1 Serviceの比較(CloudNativePGが生成したService) (外部からの接続用に作成したService)
© 2025 NTT DATA Japan Corporation 32#1 Podのラベルを確認する⚫ プライマリを指すためのSelectorは cnpg.io/instanceRole=primary⚫ cnpg.io/podRole=instance は全てのインスタンスを指す。⚫ cnpg.io/podRole=instance も「読取可能な何処かに繋がる」エンドポイントで使われている。(プライマリPodのラベル) (スタンバイPodのラベル)
© 2025 NTT DATA Japan Corporation 33#1 まとめ⚫ データベースのクラスターにおいて、各インスタンスの役割理解は重要。⚫ Database on Kubernetesでは、それらの役割はLabelで表現され、Operatorが管理する。• カスタムエンドポイントを追加する場合には、Operatorの仕様を理解しないと、今回のようにトラブルが発生する可能性あり。⚫ Read/Write、Read、ReadOnlyなどのエンドポイントは、殆どのOperatorで生成されるため、アプリケーションはどのクエリを何処に投げるかをきちんと考えて設計する。• 全てRead/Writeというのも良くない。• Readを分散するために、ReadOnlyエンドポイントの活用は重要。
© 2025 NTT DATA Japan Corporation 34© 2025 NTT DATA Japan Corporation5.#2 生き返らないクラスター
© 2025 NTT DATA Japan Corporation 35#2 PostgreSQLクラスターの状態を確認⚫ エラーの原因!?⚫ プライマリが落ちて、スタンバイも昇格していない
© 2025 NTT DATA Japan Corporation 36#2 CloudNativePGでWAL領域があふれると、⚫ 基本的に同じディスク構成となるため、フェイルオーバしてもそちらもあふれる。⚫ そのため、CloudNativePGではWALあふれでフェイルオーバしない仕様となっている。プライマリ スタンバイ① スタンバイ②Data WAL WAL Data WAL Dataこの仕様がない場合、プライマリからスタンバイへフェイルオーバして、切り替わり先で障害が発生する。それが再度フェイルオーバを引き起こし、クラスター内でぱたぱた切り替わるような状態となる。DBではもっとも避けるべき状況の1つ。
© 2025 NTT DATA Japan Corporation 37#2 PVC/PVのResizeとは⚫ Volume拡張では、PVに対応するストレージの拡張だけではなく、コンテナ内のファイルシステムで利用できるサイズも拡張される。SnapshotSnapshotSnapshotRWRROPSS
© 2025 NTT DATA Japan Corporation 38#2 PVCの拡張作業$ kubectl patch pvc production-db-2-wal -p "{¥"spec¥":{¥"resources¥":{¥"requests¥":{¥"storage¥": ¥"5Gi¥"}}}}"• PVCの確認。WAL用PVCは全て2Gi。• kubectl patchでPVCを拡張PVCの確認。• PVC、PVともに拡張されていることを確認。
© 2025 NTT DATA Japan Corporation 39#2 まとめ⚫ データベースで高可用性構成を組んでも、フェイルオーバされないケースは存在する。• (今回のような)ディスクあふれのケース• 全インスタンスに関わる致命的なパラメータの誤り⚫ そうした際、Kubernetesリソースを変更する正しい手順を理解しておくことは重要。• ボリューム拡張では、PVのサイズを直接編集してはいけない。• ファイルシステムの拡張等、一連の処理が動かない可能性あり• PVCのサイズを拡張し、以降はKubernetesおよびCSIドライバーが担当。⚫ こんなことにならないように、そもそもディスク使用量の監視をしましょう。
© 2025 NTT DATA Japan Corporation 41© 2025 NTT DATA Japan Corporation6.#3 消えないで!テーブル!?
© 2025 NTT DATA Japan Corporation 42⚫ 過去の任意の時点の状態にデータベースをリカバリする機能⚫ ベースバックアップとWAL(更新ログ)を組み合わせて実現#3 PITR(Point-In-Time Recovery)とはベースバックアップWAL(更新ログ)この時点にリカバリベースバックアップにWALを適用することでリカバリ
© 2025 NTT DATA Japan Corporation 43#3 CloudNativePGにおけるPITRの注意点⚫ ベースバックアップの保存先として、オブジェクトストレージとVolumeSnapshotを選択できる。⚫ インプレースのPITRはサポートしておらず新規クラスターとしてリカバリされるバックアップ既存クラスター 新規クラスターバックアップクラスタークラスターSnapshotVolumeSnapshotインプレースリカバリ新規クラスターとしてリカバリ
© 2025 NTT DATA Japan Corporation 44#3 バックアップ設定とテーブル削除日時⚫ 毎日0時00分00秒にVolumeSnapshotを取得⚫ 2025年5月23日15時00分01秒にテーブル削除⚫ オブジェクトストレージにWALを保存apiVersion: postgresql.cnpg.io/v1kind: ScheduledBackupmetadata:name: production-db-backupspec:schedule: "0 0 0 * * *"backupOwnerReference: selfcluster:name: production-db5月22日0時00分00秒5月23日0時00分00秒5月23日15時00分01秒VolumeSnapshotVolumeSnapshotテーブル削除backup.yaml
© 2025 NTT DATA Japan Corporation 45#3 リカバリのフローproduction-dbのバックアップ削除したテーブルのダンプファイル1. 新規クラスターをテーブル削除直前にPITRproduction-dbrecovery-db2. テーブルデータをpg_dumpで抽出3. 抽出したデータを元のクラスターにpg_restoreで復旧⚫ pg_dump:PostgreSQLデータベースのバックアップを取得するツール⚫ pg_restore:pg_dumpで作成したバックアップをリストアするツール
© 2025 NTT DATA Japan Corporation 46#3 リカバリー用DBのYAMLapiVersion: postgresql.cnpg.io/v1kind: Clustermetadata:name: recovery-dbspec:instances: 1bootstrap:recovery:backup:name: production-db-backuprecoveryTarget:targetTime: "2025-05-23 15:00:00.000000+09"recovery-db.yaml⚫ テーブルデータを抽出するだけなので1インスタンスで作成⚫ bootstrapセクションにバックアップとリストアの情報を設定⚫ 新規クラスター名
© 2025 NTT DATA Japan Corporation 47#3 PITR実行時のログ⚫ recovery-dbのログ⚫ recovery-dbの状態$ kubectl logs recovery-db-1{"level":"info","ts":"2025-05-20T12:20:03.561931773Z","logger":"postgres","msg":"record","logging_pod":"recovery-db-1","record":{"log_time":"2025-05-20 12:20:03.561UTC","process_id":"26","session_id":"682c7373.1a","session_line_num":"3","session_start_time":"2025-05-2012:20:03 UTC","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"redo starts at 0/3000028","backend_type":"startup","query_id":"0"}}…{"level":"info","ts":"2025-05-20T12:20:03.562299787Z","logger":"postgres","msg":"record","logging_pod":"recovery-db-1","record":{"log_time":"2025-05-20 12:20:03.561UTC","process_id":"26","session_id":"682c7373.1a","session_line_num":"5","session_start_time":"2025-05-2012:20:03 UTC","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"redo done at 0/30000F8 system usage: CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00s","backend_type":"startup","query_id":"0"}}$ kubectl get pod recovery-db-1NAME READY STATUS RESTARTS AGErecovery-db-1 1/1 Running 0 35s
© 2025 NTT DATA Japan Corporation 48#3 pg_dump/pg_restoreベースバックアップWAL(更新ログ)pg_dumppg_restorecustomers.dump
© 2025 NTT DATA Japan Corporation 49#3 正常にリストアできているかを確認⚫ customersテーブルのレコード数を取得⚫ 今回は1つのテーブルをリストアするだけで復旧したが、複数のテーブルをリストアしたり、テーブル間の整合性を保ちつつリカバリーするなど、様々な復旧パターンがある。$ psql –c "SELECT COUNT(*) FROM customers"count-------1352(1 row)
© 2025 NTT DATA Japan Corporation 50#3 まとめ⚫ オペミスが発生しにくい設定をしたうえで、リカバリできるようにしておくことが重要。• 自動コミット機能をオフにして、ロールバックできるようにする(PostgreSQL限定)。• オペミスをしたとしても、リカバリできるように手順をドキュメント化しておく。⚫ バックアップ・リカバリの適切な手段は環境や要件によって異なる。• それぞれの環境や要件に合わせた適切な方法を確認しておく。• バックアップを取得するだけではなく、リカバリまで必ず確認しておく。⚫ CloudNativePGではインプレースのPITRは不可。• 他のトランザクションデータを消してしまったりするので、そもそもIn-placeのリカバリは避けるべきケースが多い。
© 2025 NTT DATA Japan Corporation 51© 2025 NTT DATA Japan Corporation7.まとめ
© 2025 NTT DATA Japan Corporation 52エピローグ⚫ 色々と対応はおわったはずですが、、、(あらためて今回の登場人物)藤井さんカトウ君 こばさんポスグレチームアプリケーションチーム依頼問い合わせ
記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です。

Recommended

PDF
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
PDF
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
PDF
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
PPTX
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
PPTX
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
PDF
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
XIDを周回させてみよう
PDF
2025年現在のNewSQL (最強DB講義 #36 発表資料)
PPTX
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
PDF
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
PDF
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PPTX
オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...
PPTX
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PPTX
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
PDF
PostgreSQL13でのpg_basebackupの改善について(第13回PostgreSQLアンカンファレンス@オンライン)
PDF
Vacuum徹底解説
PDF
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
PPTX
PostgreSQL開発コミュニティに参加しよう! ~2022年版~(Open Source Conference 2022 Online/Kyoto 発...
PDF
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
アーキテクチャから理解するPostgreSQLのレプリケーション
PDF
PostgreSQLでスケールアウト
PDF
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PDF
ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
PPTX
PostgreSQLの統計情報について(第26回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
PostgreSQL - C言語によるユーザ定義関数の作り方
PDF
PostgreSQL: XID周回問題に潜む別の問題
PDF
PGOを用いたPostgreSQL on Kubernetes入門(Open Source Conference 2023 Online/Hokkaido...
PDF
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)

More Related Content

PDF
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
PDF
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
PDF
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
PPTX
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
PPTX
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
PDF
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
XIDを周回させてみよう
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
XIDを周回させてみよう

What's hot

PDF
2025年現在のNewSQL (最強DB講義 #36 発表資料)
PPTX
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
PDF
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
PDF
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PPTX
オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...
PPTX
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PPTX
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
PDF
PostgreSQL13でのpg_basebackupの改善について(第13回PostgreSQLアンカンファレンス@オンライン)
PDF
Vacuum徹底解説
PDF
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
PPTX
PostgreSQL開発コミュニティに参加しよう! ~2022年版~(Open Source Conference 2022 Online/Kyoto 発...
PDF
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
アーキテクチャから理解するPostgreSQLのレプリケーション
PDF
PostgreSQLでスケールアウト
PDF
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PDF
ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
PPTX
PostgreSQLの統計情報について(第26回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
PostgreSQL - C言語によるユーザ定義関数の作り方
PDF
PostgreSQL: XID周回問題に潜む別の問題
2025年現在のNewSQL (最強DB講義 #36 発表資料)
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
PostgreSQL13でのpg_basebackupの改善について(第13回PostgreSQLアンカンファレンス@オンライン)
Vacuum徹底解説
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
PostgreSQL開発コミュニティに参加しよう! ~2022年版~(Open Source Conference 2022 Online/Kyoto 発...
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)
アーキテクチャから理解するPostgreSQLのレプリケーション
PostgreSQLでスケールアウト
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLの統計情報について(第26回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL: XID周回問題に潜む別の問題

Similar to つくって壊して直して学ぶ Database on Kubernetes (CloudNative Days Summer 2025 発表資料)

PDF
PGOを用いたPostgreSQL on Kubernetes入門(Open Source Conference 2023 Online/Hokkaido...
PDF
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
PDF
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
PDF
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PDF
詳説探究!Cloud Native Databaseの現在地点(CloudNative Days Tokyo 2023 発表資料)
PPTX
Postgres Playground で pgbench を走らせよう!(第35回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PDF
PostgreSQL開発コミュニティに参加しよう! (オープンデベロッパーズカンファレンス(ODC)2024 発表資料)
PDF
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PDF
kubernetes(GKE)環境におけるdatadog利用
PDF
Let's scale-out PostgreSQL using Citus (Japanese)
PDF
SQL Server コンテナ入門(Kubernetes編)
PDF
Postgresql on kubernetesへの道
PDF
20191211_Apache_Arrow_Meetup_Tokyo
PDF
[db tech showcase Tokyo 2014] C31: PostgreSQLをエンタープライズシステムで利用しよう by PostgreS...
PDF
PostgreSQL9.3新機能紹介
PDF
ゆるふわLinux-HA 〜PostgreSQL編〜
PDF
SQL Server エンジニア のための コンテナ入門(k8s編)
PDF
PostgreSQL UDF in Rust(Jpn) ver.2
PDF
JTF2021w F3 postgresql frontline
PGOを用いたPostgreSQL on Kubernetes入門(Open Source Conference 2023 Online/Hokkaido...
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
詳説探究!Cloud Native Databaseの現在地点(CloudNative Days Tokyo 2023 発表資料)
Postgres Playground で pgbench を走らせよう!(第35回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PostgreSQL開発コミュニティに参加しよう! (オープンデベロッパーズカンファレンス(ODC)2024 発表資料)
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
kubernetes(GKE)環境におけるdatadog利用
Let's scale-out PostgreSQL using Citus (Japanese)
SQL Server コンテナ入門(Kubernetes編)
Postgresql on kubernetesへの道
20191211_Apache_Arrow_Meetup_Tokyo
[db tech showcase Tokyo 2014] C31: PostgreSQLをエンタープライズシステムで利用しよう by PostgreS...
PostgreSQL9.3新機能紹介
ゆるふわLinux-HA 〜PostgreSQL編〜
SQL Server エンジニア のための コンテナ入門(k8s編)
PostgreSQL UDF in Rust(Jpn) ver.2
JTF2021w F3 postgresql frontline

More from NTT DATA Technology & Innovation

PDF
PostgreSQL最新動向 ~カラムナストアから生成AI連携まで~ (Open Source Conference 2025 Tokyo/Spring ...
PDF
PostgreSQL17対応版 EXPLAINオプションについて (第49回PostgreSQLアンカンファレンス@東京 発表資料)
PDF
ストリーム処理はデータを失うから怖い?それ、何とかできますよ! 〜Apahe Kafkaを用いたストリーム処理における送達保証〜 (Open Source...
PDF
Apache Sparkに対するKubernetesのNUMAノードを意識したリソース割り当ての性能効果 (Open Source Conference ...
PDF
PostgreSQLのgitレポジトリから見える2024年の開発状況 (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
pgbenchのスレッドとクライアント (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
基礎から学ぶ PostgreSQL の性能監視 (PostgreSQL Conference Japan 2025 発表資料)
PDF
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
PDF
PostgreSQLのHTAP適応について考える (PostgreSQL Conference Japan 2024 講演資料)
PDF
パーティションのATTACH時の注意ポイント (第49回PostgreSQLアンカンファレンス@東京 発表資料)
PDF
生成AI時代のPostgreSQLハイブリッド検索 (第50回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
静かに変わってきたクラスファイルを詳細に調べて楽しむ(JJUG CCC 2024 Fall講演資料)
PDF
Java in Japan: A Journey of Community, Culture, and Global Integration (JavaO...
PDF
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
PDF
開発中の新機能 Spark Declarative Pipeline に飛びついてみたが難しかった(JEDAI DAIS Recap#2 講演資料)
PDF
SAFe実践から見えた、フレームワークより大切な組織変革の道程(Scrum Fest Sendai 2025 発表資料)
PDF
Gartnerも注目するグリーンソフトウェアの実現に向けて (Green Software Foundation Global Summit 2024 T...
PDF
DAIS2024参加報告 ~Spark中心にしらべてみた~ (JEDAI DAIS Recap 講演資料)
PDF
Unveiling the Hidden Layers of Java Class Files: Beyond Bytecode (Devnexus 2025)
PostgreSQL最新動向 ~カラムナストアから生成AI連携まで~ (Open Source Conference 2025 Tokyo/Spring ...
PostgreSQL17対応版 EXPLAINオプションについて (第49回PostgreSQLアンカンファレンス@東京 発表資料)
ストリーム処理はデータを失うから怖い?それ、何とかできますよ! 〜Apahe Kafkaを用いたストリーム処理における送達保証〜 (Open Source...
Apache Sparkに対するKubernetesのNUMAノードを意識したリソース割り当ての性能効果 (Open Source Conference ...
PostgreSQLのgitレポジトリから見える2024年の開発状況 (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
pgbenchのスレッドとクライアント (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
基礎から学ぶ PostgreSQL の性能監視 (PostgreSQL Conference Japan 2025 発表資料)
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
PostgreSQLのHTAP適応について考える (PostgreSQL Conference Japan 2024 講演資料)
パーティションのATTACH時の注意ポイント (第49回PostgreSQLアンカンファレンス@東京 発表資料)
生成AI時代のPostgreSQLハイブリッド検索 (第50回PostgreSQLアンカンファレンス@オンライン 発表資料)
論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)
静かに変わってきたクラスファイルを詳細に調べて楽しむ(JJUG CCC 2024 Fall講演資料)
Java in Japan: A Journey of Community, Culture, and Global Integration (JavaO...
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
開発中の新機能 Spark Declarative Pipeline に飛びついてみたが難しかった(JEDAI DAIS Recap#2 講演資料)
SAFe実践から見えた、フレームワークより大切な組織変革の道程(Scrum Fest Sendai 2025 発表資料)
Gartnerも注目するグリーンソフトウェアの実現に向けて (Green Software Foundation Global Summit 2024 T...
DAIS2024参加報告 ~Spark中心にしらべてみた~ (JEDAI DAIS Recap 講演資料)
Unveiling the Hidden Layers of Java Class Files: Beyond Bytecode (Devnexus 2025)

つくって壊して直して学ぶ Database on Kubernetes (CloudNative Days Summer 2025 発表資料)

  • 1.
    © 2025 NTTDATA Japan Corporationつくって壊して直して学ぶDatabase on Kubernetes2025/5/23株式会社NTTデータ小林 隆浩、加藤 慎也れ
  • 2.
    © 2025 NTTDATA Japan Corporation 2今日話すこと⚫ Database(PostgreSQL) on Kubernetesを構築する際に気にするべきポイントや、実際の運用で発生するかも知れない障害とその対応を紹介する。• 「壊して」というより「壊れて学ぶ」のやり方⚫ Operatorはここ数年で進化したが、やはりDBには固有の運用があり、理解が難しい。• 例えば、バックアップやリストア• 急なDBクラスターの停止、など⚫ Kubernetesのストレージ周りの機能を使いながら、Database on Kubernetesを運用する際にそうした機能をどう活かすかについても、一緒に学んでいこう。
  • 3.
    © 2025 NTTDATA Japan Corporation 3アジェンダ1. はじまり - DB on Kubernetesは突然に -2. つくって学ぶDatabase on Kubernetes3. 壊して直して学ぶDatabase on Kubernetes4. 問い合わせ#1 「晴れ時々エラー!?」5. 問い合わせ#2 「生き返らないクラスター!?」6. 問い合わせ#3 「消えないで!テーブル!?」7. まとめ
  • 4.
    © 2025 NTTDATA Japan Corporation 4© 2025 NTT DATA Japan Corporation1.はじまり
  • 5.
    © 2025 NTTDATA Japan Corporation 5Database on Kubernetesは突然に⚫ カトウ君に上司の藤井さんから依頼が届いているようです!(今回の登場人物)藤井さんカトウ君 こばさんポスグレチームアプリケーションチーム依頼問い合わせ
  • 6.
    © 2025 NTTDATA Japan Corporation 6データベース要件の確認制定日:2024/8/10 DB種別 ■ PostgreSQL □ MySQL □ Oracle(ライセンスは持ち込みのみ) ※必須1 インスタンス数 □ 1 (冗長性なし。開発環境での利用を想定) ※必須□ 2 (冗長性あり。非同期を前提とするため、ラグ・データ損失を許容)■ 3 (冗長性あり。同期を前提とするため、データ損失はゼロ)2 バックアップ □ コールドバックアップ ※必須□ オンラインバックアップ■ オンラインバックアップ+アーカイブログ (PITRに対応可能)3 保持期間 30 日間 ※必須4 申請日 西暦 2025 年 4 月 1 日 ※必須5 申請承認者 ※必須金融第一事業部 部長 xxxxx6 記入者 事業部等・担当名 金融第一事業部 ※必須氏名 yyyyy ※必須7 連絡先 事業部等・担当名■ 記入者と同じ場合はこちらをチェック2024.8版DBクラスター 作成申請書担当・グループ名 役職 氏名 担当・グループ名
  • 7.
    © 2025 NTTDATA Japan Corporation 7想定するPostgreSQLの構成⚫ 3インスタンスで同期レプリケーションを構成し、バックアップとアーカイブを取得する。プライマリ スタンバイ① スタンバイ②Data WALアーカイブWAL Data WAL Data更新 参照WALをスタンバイに転送①、②のうち1台に、同期レプリケーションが完了すればOK定期的にWALをアーカイブバックアップ
  • 8.
    © 2025 NTTDATA Japan Corporation 8(参考)RDSのMulti-AZ DB Cluster⚫ 3インスタンスの構成。⚫ それぞれのインスタンスが、別AZに配置される。⚫ Write以外のインスタンスでも、読み取りクエリの処理が可能。但し、更新ラグが発生する。⚫ エンドポイントは下記の3種類。• Read/Write• Readのみ• 個別インスタンスhttps://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/multi-az-db-clusters-concepts.html#multi-az-db-clusters-concepts-overview
  • 9.
    © 2025 NTTDATA Japan Corporation 9© 2025 NTT DATA Japan Corporation2.つくって学ぶDatabase on Kubernetes
  • 10.
    © 2025 NTTDATA Japan Corporation 10KubernetesにおけるPostgreSQL Operatorとは⚫ Kubernetes上でのデータベース運用を補助する機能が実装されている。• レプリケーションを使った高可用性構成、障害時切り替え等をYAMLで簡単に設定できる。• バックアップ/リストアも設定可能で、クラウドストレージと連携できる。PostgreSQL Operatorプライマリ スタンバイ スタンバイプライマリ向けService
  • 11.
    © 2025 NTTDATA Japan Corporation 11PostgreSQL Operatorの比較⚫ PostgreSQL向けにも複数のOperatorが存在。今回はCloudNativePGを利用する。名称 開発主体 ライセンス 備考PGO Crunchy Data Apache 2.0 *• 古参Operatorの1つ。機能は十分揃っている。• 従来のPostgreSQL向けOSSを組み合わせた構成。• コンテナイメージの商用利用が実質できない。postgres-operator Zalando MIT• 古参Operatorの1つ。機能は十分揃っている。• 従来のPostgreSQL向けOSSを組み合わせた構成。• Kubernetesに詳しいエンジニアが利用しやすい。CloudNativePG EDB Apache 2.0• PostgreSQL開発で有名なEDBによるOperator。• EDBが提供されているマネージドサービス内部でも利用されている。• 2025年、CNCF Sandbox Projectに。StackGres OnGres AGPL 3• 充実した管理UIを提供。• ライセンスがネックとなる可能性あり。Percona Operatorfor PostgreSQLPercona Apache 2.0• MySQLやPostgreSQLの開発で有名なPerconaのOperator。• PGOをフォークして開発。完全OSSでの利用が可能。• 比較的新しいOperator。
  • 12.
    © 2025 NTTDATA Japan Corporation 12PostgreSQL on Kubernetesのシステム構成⚫ GKE上でCloudNativePGを用いて、以下の構成のPostgreSQL on Kubernetesを構築する。SnapshotSnapshotSnapshotRWRROPSSWALをGCSにアーカイブ
  • 13.
    © 2025 NTTDATA Japan Corporation 13(例)PostgreSQLクラスター用のYAML⚫ 3インスタンス⚫ 同期レプリケーションの設定⚫ データストレージ⚫ WAL用のストレージ⚫ バックアップ設定
  • 14.
    © 2025 NTTDATA Japan Corporation 14© 2025 NTT DATA Japan Corporation3.壊して直して学ぶDatabase on Kubernetes
  • 15.
    © 2025 NTTDATA Japan Corporation 15①壊して直して学ぶ:Podの障害SnapshotSnapshotSnapshotRWRROPSSPrimary Podの障害
  • 16.
    © 2025 NTTDATA Japan Corporation 16①Primary Podの疑似障害⚫ クラスタの状態を確認⚫ Primary Podを削除$ kubectl cnpg status test-dbInstances statusName Current LSN Replication role Status QoS Manager Version Node---- ----------- ---------------- ------ --- --------------- ----test-db-1 0/6055A58 Primary OK BestEffort 1.25.1 gke-cluster-bb3caaa1-hdsvtest-db-2 0/6055A58 Standby (sync) OK BestEffort 1.25.1 gke-cluster-bb3caaa1-2swntest-db-3 0/6055A58 Standby (sync) OK BestEffort 1.25.1 gke-cluster-bb3caaa1-zpcm$ kubectl delete pod test-db-1pod "test-db-1" deleted
  • 17.
    © 2025 NTTDATA Japan Corporation 17①Primary Pod障害の確認と復旧⚫ CloudNativePGのログ⚫ クラスタの状態を確認$ kubectl cnpg status test-dbInstances statusName Current LSN Replication role Status QoS Manager Version Node---- ----------- ---------------- ------ --- --------------- ----test-db-2 0/70066E0 Primary OK BestEffort 1.25.1 gke-cluster-bb3caaa1-2swntest-db-1 0/70066E0 Standby (sync) OK BestEffort 1.25.1 gke-cluster-bb3caaa1-hdsvtest-db-3 0/70066E0 Standby (sync) OK BestEffort 1.25.1 gke-cluster-bb3caaa1-zpcm{"level":"info","ts":"2025-05-19T00:54:27.598548554Z","msg":"Current primary isn't healthy, initiating afailover","controller":"cluster","controllerGroup":"postgresql.cnpg.io","controllerKind":"Cluster","Cluster":{"name":"test-db","namespace":"default"},"namespace":"default","name":"test-db","reconcileID":"a90e0a46-6bf1-4f36-9dca-b83f6bb5567e"}{"level":"info","ts":"2025-05-19T00:54:27.740028855Z","msg":"Failing over","controller":"cluster","controllerGroup":"postgresql.cnpg.io","controllerKind":"Cluster","Cluster":{"name":"test-db","namespace":"default"},"namespace":"default","name":"test-db","reconcileID":"a90e0a46-6bf1-4f36-9dca-b83f6bb5567e","newPrimary":"test-db-2"}
  • 18.
    © 2025 NTTDATA Japan Corporation 18②壊して直して学ぶ:Podの障害SnapshotSnapshotSnapshotRWRROPSSStandby Podの障害
  • 19.
    © 2025 NTTDATA Japan Corporation 19②Standby Podの疑似障害⚫ クラスタの状態を確認⚫ Standby Podを削除$ kubectl delete pod test-db-1pod "test-db-1" deleted$ kubectl cnpg status test-dbInstances statusName Current LSN Replication role Status QoS Manager Version Node---- ----------- ---------------- ------ --- --------------- ----test-db-2 0/9000000 Primary OK BestEffort 1.25.1 gke-cluster-bb3caaa1-2swntest-db-1 0/9000000 Standby (sync) OK BestEffort 1.25.1 gke-cluster-bb3caaa1-hdsvtest-db-3 0/9000000 Standby (sync) OK BestEffort 1.25.1 gke-cluster-bb3caaa1-zpcm
  • 20.
    © 2025 NTTDATA Japan Corporation 20②Standby Pod障害の確認と復旧⚫ CloudNativePGのログ⚫ クラスタの状態を確認{“level”:“info”,"ts":"2025-05-19T01:06:20.510661896Z","msg":"Creating new Pod to reattach a PVC","controller":"cluster","controllerGroup":"postgresql.cnpg.io","controllerKind":"Cluster","Cluster":{"name":"test-db","namespace":"default"},"namespace":"default","name":"test-db","reconcileID":"9812324d-b86d-4d21-a43d-39fb6ac7f77b","pod":"test-db-1","pvc":"test-db-1"}{"level":"info","ts":"2025-05-19T01:06:31.80588422Z","msg":"Setting replica label","controller":"cluster","controllerGroup":"postgresql.cnpg.io","controllerKind":"Cluster","Cluster":{"name":"test-db","namespace":"default"},"namespace":"default","name":"test-db","reconcileID":"eb962e67-b7a2-4ba0-9bce-29b5c4de5049","pod":"test-db-1"}{"level":"info","ts":"2025-05-19T01:06:37.768017501Z","msg":"Cluster has become healthy","controller":"cluster","controllerGroup":"postgresql.cnpg.io","controllerKind":"Cluster","Cluster":{"name":"test-db","namespace":"default"},"namespace":"default","name":"test-db","reconcileID":"c47b81a5-dc5b-4c9c-9673-edfbd7dfac6e"}$ kubectl cnpg status test-dbInstances statusName Current LSN Replication role Status QoS Manager Version Node---- ----------- ---------------- ------ --- --------------- ----test-db-2 0/9000000 Primary OK BestEffort 1.25.1 gke-cluster-bb3caaa1-2swntest-db-1 0/9000000 Standby (sync) OK BestEffort 1.25.1 gke-cluster-bb3caaa1-hdsvtest-db-3 0/9000000 Standby (sync) OK BestEffort 1.25.1 gke-cluster-bb3caaa1-zpcm
  • 21.
    © 2025 NTTDATA Japan Corporation 21⚫ CloudNativePGはデフォルトでノード障害に耐えられる設定となっている。ゾーン障害に備えたPodの配置戦略(podAntiAffinity)ノードPSSゾーンノードPゾーンSSノードPSSノード障害で全滅 ノード障害に耐性 ゾーン障害に耐性enablePodAntiAffinity:truetopologyKey:kubernetes.io/hostnameenablePodAntiAffinity:false enablePodAntiAffinity:truetopologyKey:topology.kubernetes.io/zone
  • 22.
    © 2025 NTTDATA Japan Corporation 22⚫ 特定のラベルをもつノードにスケジューリングする。⚫ データベースは特定HWが設定されたノードにスケジューリングしたい場合などに有用。• DB高速化のためにメモリ増強、高速SSDを搭載など• 今後はGPU搭載なども要件として登場するかもしれない性能も考慮したPodの配置戦略(nodeSelector)nttdata.com/role: db nttdata.com/role: app
  • 23.
    © 2025 NTTDATA Japan Corporation 23CloudNativePGでの設定方法apiVersion: postgresql.cnpg.io/v1kind: Clustermetadata:name: pgcluster-prodspec:affinity:enablePodAntiAffinity: truetopologyKey: kubernetes.io/hostnamepodAntiAffinityType: requirednodeSelector:nttdata.com/role: db⚫ podAntiAffinityを有効化⚫ ホスト名で分散⚫ 条件を満たすことが必須⚫ データベース用ノードに⚫ GKEノードプールにラベルを設定済み
  • 24.
    © 2025 NTTDATA Japan Corporation 24③壊して直して学ぶ:Nodeの障害SnapshotSnapshotSnapshotRWRROPSSPrimary Podが存在するノードの障害
  • 25.
    © 2025 NTTDATA Japan Corporation 25③Nodeの疑似障害⚫ クラスタの状態を確認⚫ Primary Podのあるノードを削除$ kubectl delete node gke-cluster-bb3caaa1-2swnnode "gke-cluster-kato-default-pool-bb3caaa1-2swn" deleted$ kubectl cnpg status test-dbInstances statusName Current LSN Replication role Status QoS Manager Version Node---- ----------- ---------------- ------ --- --------------- ----test-db-2 0/9000000 Primary OK BestEffort 1.25.1 gke-cluster-bb3caaa1-2swntest-db-1 0/9000000 Standby (sync) OK BestEffort 1.25.1 gke-cluster-bb3caaa1-hdsvtest-db-3 0/9000000 Standby (sync) OK BestEffort 1.25.1 gke-cluster-bb3caaa1-zpcm
  • 26.
    © 2025 NTTDATA Japan Corporation 26③Node障害の確認と復旧⚫ CloudNativePGのログ⚫ クラスタの状態を確認{"level":"info","ts":"2025-05-19T01:33:40.453415481Z","msg":"Current primary isn't healthy, initiating afailover","controller":"cluster","controllerGroup":"postgresql.cnpg.io","controllerKind":"Cluster","Cluster":{"name":"test-db","namespace":"default"},"namespace":"default","name":"test-db","reconcileID":"3e4c576c-1e4a-4b0d-9bd0-3fd129e86716"}{"level":"info","ts":"2025-05-19T01:33:40.718655379Z","msg":"Failing over","controller":"cluster","controllerGroup":"postgresql.cnpg.io","controllerKind":"Cluster","Cluster":{"name":"test-db","namespace":"default"},"namespace":"default","name":"test-db","reconcileID":"3e4c576c-1e4a-4b0d-9bd0-3fd129e86716","newPrimary":"test-db-1"}$ kubectl cnpg status test-dbInstances statusName Current LSN Replication role Status QoS Manager Version Node---- ----------- ---------------- ------ --- --------------- ----test-db-1 0/B000000 Primary OK BestEffort 1.25.1 gke-cluster-bb3caaa1-hdsvtest-db-2 0/B000000 Standby (sync) OK BestEffort 1.25.1 gke-cluster-bb3caaa1-td3ttest-db-3 0/B000000 Standby (sync) OK BestEffort 1.25.1 gke-cluster-bb3caaa1-zpcmz
  • 27.
    © 2025 NTTDATA Japan Corporation 27ここまでのまとめ⚫ PostgreSQL Operatorは複数あるので、要件に合わせて選択しましょう。• 机上での比較だとあまり差異がわからないので、実際に使ってみることも重要⚫ すべての障害への対策は不可能だが、何が許容できる・できないかを整理することが重要。• Pod障害/ノード障害/ゾーン障害/リージョン障害• RPO/RTO⚫ パフォーマンスの観点からデータベースPodはアプリケーションPodとは別のノードにスケジューリングすることも考える。• 大容量メモリ・高いIO性能/低遅延・広帯域の安定したネットワークが必要• 他Podとのリソース競合を避ける
  • 28.
    © 2025 NTTDATA Japan Corporation 28© 2025 NTT DATA Japan Corporation4.#1 晴れ時々エラー
  • 29.
    © 2025 NTTDATA Japan Corporation 29#1 エラーになったり、ならなかったり?(更新時にエラーが発生している画面)(同じ画面、同じレコードでも成功することもある)(エラー時のサーバ側ログ)
  • 30.
    © 2025 NTTDATA Japan Corporation 30#1 アプリケーションと動作確認時の接続経路⚫ PoC的な位置づけで、本番時の接続と異なる経路でテストを行っていた。APLSnapshotSnapshotSnapshotRWRROPSS動作確認?
  • 31.
    © 2025 NTTDATA Japan Corporation 31#1 Serviceの比較(CloudNativePGが生成したService) (外部からの接続用に作成したService)
  • 32.
    © 2025 NTTDATA Japan Corporation 32#1 Podのラベルを確認する⚫ プライマリを指すためのSelectorは cnpg.io/instanceRole=primary⚫ cnpg.io/podRole=instance は全てのインスタンスを指す。⚫ cnpg.io/podRole=instance も「読取可能な何処かに繋がる」エンドポイントで使われている。(プライマリPodのラベル) (スタンバイPodのラベル)
  • 33.
    © 2025 NTTDATA Japan Corporation 33#1 まとめ⚫ データベースのクラスターにおいて、各インスタンスの役割理解は重要。⚫ Database on Kubernetesでは、それらの役割はLabelで表現され、Operatorが管理する。• カスタムエンドポイントを追加する場合には、Operatorの仕様を理解しないと、今回のようにトラブルが発生する可能性あり。⚫ Read/Write、Read、ReadOnlyなどのエンドポイントは、殆どのOperatorで生成されるため、アプリケーションはどのクエリを何処に投げるかをきちんと考えて設計する。• 全てRead/Writeというのも良くない。• Readを分散するために、ReadOnlyエンドポイントの活用は重要。
  • 34.
    © 2025 NTTDATA Japan Corporation 34© 2025 NTT DATA Japan Corporation5.#2 生き返らないクラスター
  • 35.
    © 2025 NTTDATA Japan Corporation 35#2 PostgreSQLクラスターの状態を確認⚫ エラーの原因!?⚫ プライマリが落ちて、スタンバイも昇格していない
  • 36.
    © 2025 NTTDATA Japan Corporation 36#2 CloudNativePGでWAL領域があふれると、⚫ 基本的に同じディスク構成となるため、フェイルオーバしてもそちらもあふれる。⚫ そのため、CloudNativePGではWALあふれでフェイルオーバしない仕様となっている。プライマリ スタンバイ① スタンバイ②Data WAL WAL Data WAL Dataこの仕様がない場合、プライマリからスタンバイへフェイルオーバして、切り替わり先で障害が発生する。それが再度フェイルオーバを引き起こし、クラスター内でぱたぱた切り替わるような状態となる。DBではもっとも避けるべき状況の1つ。
  • 37.
    © 2025 NTTDATA Japan Corporation 37#2 PVC/PVのResizeとは⚫ Volume拡張では、PVに対応するストレージの拡張だけではなく、コンテナ内のファイルシステムで利用できるサイズも拡張される。SnapshotSnapshotSnapshotRWRROPSS
  • 38.
    © 2025 NTTDATA Japan Corporation 38#2 PVCの拡張作業$ kubectl patch pvc production-db-2-wal -p "{¥"spec¥":{¥"resources¥":{¥"requests¥":{¥"storage¥": ¥"5Gi¥"}}}}"• PVCの確認。WAL用PVCは全て2Gi。• kubectl patchでPVCを拡張PVCの確認。• PVC、PVともに拡張されていることを確認。
  • 39.
    © 2025 NTTDATA Japan Corporation 39#2 まとめ⚫ データベースで高可用性構成を組んでも、フェイルオーバされないケースは存在する。• (今回のような)ディスクあふれのケース• 全インスタンスに関わる致命的なパラメータの誤り⚫ そうした際、Kubernetesリソースを変更する正しい手順を理解しておくことは重要。• ボリューム拡張では、PVのサイズを直接編集してはいけない。• ファイルシステムの拡張等、一連の処理が動かない可能性あり• PVCのサイズを拡張し、以降はKubernetesおよびCSIドライバーが担当。⚫ こんなことにならないように、そもそもディスク使用量の監視をしましょう。
  • 40.
    © 2025 NTTDATA Japan Corporation 41© 2025 NTT DATA Japan Corporation6.#3 消えないで!テーブル!?
  • 41.
    © 2025 NTTDATA Japan Corporation 42⚫ 過去の任意の時点の状態にデータベースをリカバリする機能⚫ ベースバックアップとWAL(更新ログ)を組み合わせて実現#3 PITR(Point-In-Time Recovery)とはベースバックアップWAL(更新ログ)この時点にリカバリベースバックアップにWALを適用することでリカバリ
  • 42.
    © 2025 NTTDATA Japan Corporation 43#3 CloudNativePGにおけるPITRの注意点⚫ ベースバックアップの保存先として、オブジェクトストレージとVolumeSnapshotを選択できる。⚫ インプレースのPITRはサポートしておらず新規クラスターとしてリカバリされるバックアップ既存クラスター 新規クラスターバックアップクラスタークラスターSnapshotVolumeSnapshotインプレースリカバリ新規クラスターとしてリカバリ
  • 43.
    © 2025 NTTDATA Japan Corporation 44#3 バックアップ設定とテーブル削除日時⚫ 毎日0時00分00秒にVolumeSnapshotを取得⚫ 2025年5月23日15時00分01秒にテーブル削除⚫ オブジェクトストレージにWALを保存apiVersion: postgresql.cnpg.io/v1kind: ScheduledBackupmetadata:name: production-db-backupspec:schedule: "0 0 0 * * *"backupOwnerReference: selfcluster:name: production-db5月22日0時00分00秒5月23日0時00分00秒5月23日15時00分01秒VolumeSnapshotVolumeSnapshotテーブル削除backup.yaml
  • 44.
    © 2025 NTTDATA Japan Corporation 45#3 リカバリのフローproduction-dbのバックアップ削除したテーブルのダンプファイル1. 新規クラスターをテーブル削除直前にPITRproduction-dbrecovery-db2. テーブルデータをpg_dumpで抽出3. 抽出したデータを元のクラスターにpg_restoreで復旧⚫ pg_dump:PostgreSQLデータベースのバックアップを取得するツール⚫ pg_restore:pg_dumpで作成したバックアップをリストアするツール
  • 45.
    © 2025 NTTDATA Japan Corporation 46#3 リカバリー用DBのYAMLapiVersion: postgresql.cnpg.io/v1kind: Clustermetadata:name: recovery-dbspec:instances: 1bootstrap:recovery:backup:name: production-db-backuprecoveryTarget:targetTime: "2025-05-23 15:00:00.000000+09"recovery-db.yaml⚫ テーブルデータを抽出するだけなので1インスタンスで作成⚫ bootstrapセクションにバックアップとリストアの情報を設定⚫ 新規クラスター名
  • 46.
    © 2025 NTTDATA Japan Corporation 47#3 PITR実行時のログ⚫ recovery-dbのログ⚫ recovery-dbの状態$ kubectl logs recovery-db-1{"level":"info","ts":"2025-05-20T12:20:03.561931773Z","logger":"postgres","msg":"record","logging_pod":"recovery-db-1","record":{"log_time":"2025-05-20 12:20:03.561UTC","process_id":"26","session_id":"682c7373.1a","session_line_num":"3","session_start_time":"2025-05-2012:20:03 UTC","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"redo starts at 0/3000028","backend_type":"startup","query_id":"0"}}…{"level":"info","ts":"2025-05-20T12:20:03.562299787Z","logger":"postgres","msg":"record","logging_pod":"recovery-db-1","record":{"log_time":"2025-05-20 12:20:03.561UTC","process_id":"26","session_id":"682c7373.1a","session_line_num":"5","session_start_time":"2025-05-2012:20:03 UTC","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"redo done at 0/30000F8 system usage: CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00s","backend_type":"startup","query_id":"0"}}$ kubectl get pod recovery-db-1NAME READY STATUS RESTARTS AGErecovery-db-1 1/1 Running 0 35s
  • 47.
    © 2025 NTTDATA Japan Corporation 48#3 pg_dump/pg_restoreベースバックアップWAL(更新ログ)pg_dumppg_restorecustomers.dump
  • 48.
    © 2025 NTTDATA Japan Corporation 49#3 正常にリストアできているかを確認⚫ customersテーブルのレコード数を取得⚫ 今回は1つのテーブルをリストアするだけで復旧したが、複数のテーブルをリストアしたり、テーブル間の整合性を保ちつつリカバリーするなど、様々な復旧パターンがある。$ psql –c "SELECT COUNT(*) FROM customers"count-------1352(1 row)
  • 49.
    © 2025 NTTDATA Japan Corporation 50#3 まとめ⚫ オペミスが発生しにくい設定をしたうえで、リカバリできるようにしておくことが重要。• 自動コミット機能をオフにして、ロールバックできるようにする(PostgreSQL限定)。• オペミスをしたとしても、リカバリできるように手順をドキュメント化しておく。⚫ バックアップ・リカバリの適切な手段は環境や要件によって異なる。• それぞれの環境や要件に合わせた適切な方法を確認しておく。• バックアップを取得するだけではなく、リカバリまで必ず確認しておく。⚫ CloudNativePGではインプレースのPITRは不可。• 他のトランザクションデータを消してしまったりするので、そもそもIn-placeのリカバリは避けるべきケースが多い。
  • 50.
    © 2025 NTTDATA Japan Corporation 51© 2025 NTT DATA Japan Corporation7.まとめ
  • 51.
    © 2025 NTTDATA Japan Corporation 52エピローグ⚫ 色々と対応はおわったはずですが、、、(あらためて今回の登場人物)藤井さんカトウ君 こばさんポスグレチームアプリケーションチーム依頼問い合わせ
  • 52.

[8]ページ先頭

©2009-2025 Movatter.jp