© 2020 NTT DATA Corporation 1 © 2020 NTT DATA Corporation 第15回 PostgreSQLアンカンファレンス@オンライン オンライン物理バックアップの 排他モードと非排他モードについて 2020年7月30日 株式会社NTTデータ 藤井雅雄 @fujii_masao
© 2020 NTT DATA Corporation 2 藤井 雅雄 @fujii_masao Database Technical Lead @ NTTデータ データベース研究開発、PostgreSQL 技術支援 PostgreSQLコミッタ レプリケーション(非同期 / 同期 / カスケード / クォーラムコミット) WAL圧縮、バックアップ進捗 pg_bigm(全文検索モジュール)コミッタ 自己紹介
© 2020 NTT DATA Corporation 3 本講演について 講演資料は、後日、NTTデータのSlideShareアカウント上で公開予定です。 https://www.slideshare.net/nttdata-tech 以前のアンカンファレンスの講演資料は公開済です。 PostgreSQL 13 での pg_stat_statements の改善について PostgreSQL 13 での pg_basebackup の改善について PostgreSQL 13 での レプリケーション関連 の改善について
© 2020 NTT DATA Corporation 4 オンライン物理バックアップの 排他モードと非排他モードについて
© 2020 NTT DATA Corporation 5 PostgreSQLで利用できるバックアップ手法 バックアップ 論理バックアップ (SQLダンプ) pg_dump / pg_dumpall 物理バックアップ オフラインバックアップ (コールドバックアップ) 独自スクリプト(pg_ctl stop + rsyncなど) オンラインバックアップ (ホットバックアップ) pg_basebackup 外部ツール(pg_rman、 Barmanなど) 独自スクリプト (pg_start_backup + pg_stop_backup) 排他モード 非排他モード
© 2020 NTT DATA Corporation 6 PostgreSQLで利用できるバックアップ手法 バックアップ 論理バックアップ (SQLダンプ) pg_dump / pg_dumpall 物理バックアップ オフラインバックアップ (コールドバックアップ) 独自スクリプト(pg_ctl stop + rsyncなど) オンラインバックアップ (ホットバックアップ) pg_basebackup 外部ツール(pg_rman、 Barmanなど) 独自スクリプト (pg_start_backup + pg_stop_backup) 排他モード 非排他モード 今日取り上げるバックアップ手法
© 2020 NTT DATA Corporation 7 ご存じでしょうか? 非排他的な手法が推奨され、 排他的な手法は推奨されず、将来的に削除されます。 https://www.postgresql.jp/document/current/html/continuous-archiving.html#BACKUP-LOWLEVEL-BASE-BACKUP
© 2020 NTT DATA Corporation 8 排他モード ① バックアップモードの開始 $ psql -c "SELECT pg_start_backup('mybackup')" ② DBクラスタのバックアップ OSコマンドやスナップショットなどを使って、DBクラスタと全テーブルスペースを物理的にバックアップ $ cp -a $PGDATA /tblspc1 /tblspc2 /backup ③ バックアップモードの終了 $ psql -c "SELECT pg_stop_backup()"
© 2020 NTT DATA Corporation 9 非排他モード ① バックアップモードの開始 $ psql =# SELECT pg_start_backup('mybackup', false, false) ② DBクラスタのバックアップ OSコマンドやスナップショットなどを使って、DBクラスタと全テーブルスペースを物理的にバックアップ $ cp -a $PGDATA /tblspc1 /tblspc2 /backup ③ バックアップモードの終了 =# SELECT pg_stop_backup(false); ④ backup_labelとtablespace_mapのバックアップ pg_stop_backup()の戻り値の内容から backup_labelとtablespace_mapの2つのファイルを作成して、バックアップに含める ・第3引数にfalseを指定 ・pg_start_backupを実行したセッションを pg_stop_backupまで維持 ・第1引数にfalseを指定 ・pg_start_backupを実行したセッションで pg_stop_backupを実行
© 2020 NTT DATA Corporation 10 非排他モード =# SELECT * FROM pg_stop_backup(false); lsn | labelfile | spcmapfile -----------+---------------------------------------------------------------+------------------------------- 0/3000138 | START WAL LOCATION: 0/3000028 (file 000000010000000000000003)+| 16386 /dav/head-pgsql/tblspc2+ | CHECKPOINT LOCATION: 0/3000060 +| 16385 /dav/head-pgsql/tblspc1+ | BACKUP METHOD: streamed +| | BACKUP FROM: master +| | START TIME: 2020-07-06 23:55:11 JST +| | LABEL: mybackup +| | START TIMELINE: 1 +| | | (1 row) backup_label tablespace_map ④-2 backup_labelとtablespace_mapをバックアップに格納 $ mv backup_label tablespace_map /backup ④-1 pg_stop_backup()の戻り値からbackup_labelとtablespace_mapのファイルを作成
© 2020 NTT DATA Corporation 11 排他モードと非排他モードの比較 排他モード 非排他モード 利用可能なバージョン 8.0以降 9.6以降 バックアップの 同時実行可能数 1 複数 pg_start_backupと pg_stop_backupを 実行するセッション 同じまたは異なるセッション  バックアップ中のセッション断による影響はない  pg_stop_backupを忘れるとバックアップ モードは終了しない(次回のバックアップ取得 が失敗する) 同じセッション  セッション断によりバックアップが失敗する (pg_start_backupからやり直し)  セッションが切れればバックアップモードは終了 する backup_labelと tablespace_mapの 作成 pg_start_backupがDBクラスタ内に作成  DBクラスタをバックアップすれば、各ファイルは 自動的にバックアップに含まれる  バックアップ中にPostgreSQLがクラッシュす ると、クラッシュリカバリが失敗する可能性があ る(backup_labelがDBクラスタ内にある状 態でクラッシュリカバリが始まるため) pg_stop_backupからユーザが作成  ユーザが各ファイルをバックアップに含める必要 がある  左記のリカバリ失敗の可能性はない(DBクラ スタ内にbackup_labelは存在しないため)
© 2020 NTT DATA Corporation 12 排他モードでバックアップ中にクラッシュした場合のリカバリ失敗について pg_start_backup CHECKPOINT 1 2 3 4 5 ? WALファイル 凡例 クラッシュ CHECKPOINT pg_stop_backup 各操作とWAL生成の流れ クラッシュリカバリでは 最新CHECKPOINT 以降のWALを適用 backup_labelがある状態で クラッシュリカバリが始まると、 pg_start_backup以降の WALを適用 • backup_labelが pg_start_backup以降 のWAL適用を指示  ②~④のWALが削除済だと リカバリ失敗  未削除の場合もリカバリ時間 が長くなる
© 2020 NTT DATA Corporation 13 ご存じでしょうか? 非排他的な手法が推奨され、 排他的な手法は推奨されず、将来的に削除されます。 https://www.postgresql.jp/document/current/html/continuous-archiving.html#BACKUP-LOWLEVEL-BASE-BACKUP
© 2020 NTT DATA Corporation 14 排他モードを削除するパッチ v14で排他モードを削除するパッチが提案されている Remove deprecated exclusive backup mode https://commitfest.postgresql.org/28/1913/ 削除についてまだ議論中だが、v14で削除となる可能性が高い(ように見える) • リカバリ失敗のリスクを危険視する開発者が多い • 排他モードを利用中のユーザがいるため削除に反対する意見もあるが少数 • 「排他モードは将来的に削除」とv9.6で明記してから、v14リリース時には5年経過済 排他モードが削除されても問題ないでしょうか?
© 2020 NTT DATA Corporation 15 排他モードの削除に備えて 1. pg_basebackupまたは外部ツールに移行できるのであれば移行する 2. 独自スクリプトを改修して、非排他モードに移行する 3. (排他モードの必要性を強くコミュニティで主張して、排他モードを削除させない)
© 2020 NTT DATA Corporation 16 排他モードから非排他モードへの移行例 $ psql -c "SELECT pg_start_backup('test')" $ cp -a /pgdata/data /backup $ psql -c "SELECT pg_stop_backup()" $ psql -f backup.sql SELECT pg_start_backup('test', false, false); ¥! cp -a /pgdata/data /backup SELECT pg_file_write('/tmp/backup_label', labelfile, false), pg_file_write('/tmp/tablespace_map', spcmapfile, false) FROM pg_stop_backup(false); ¥! mv /tmp/backup_label /tmp/tablespace_map /backup/data 排 他 モ ー ド 非 排 他 モ ー ド ・同一セッション内でpg_start_backupと pg_stop_backupを簡単に実行できるように、 バックアップのすべての操作をpsql内で実行する ・OSコマンドはpsqlメタコマンドの¥!を介して実行 ・pg_stop_backupからのbackup_labelと tablespace_mapの作成には、 pg_file_write関数を使う ・pg_file_write関数を使うにはadminpackの エクステンションをCREATE EXTENSIONする 必要がある(セキュリティ上の問題がないかは要確認)
© 2020 NTT DATA Corporation 17 まとめ pg_start_backupとpg_stop_backupを使ったバックアップには 排他モードと非排他モードがある 排他モードは将来的に削除される予定 (v14で削除の可能性がある)
© 2020 NTT DATA Corporation本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です。

オンライン物理バックアップの排他モードと非排他モードについて(第15回PostgreSQLアンカンファレンス@オンライン 発表資料)

  • 1.
    © 2020 NTTDATA Corporation 1 © 2020 NTT DATA Corporation 第15回 PostgreSQLアンカンファレンス@オンライン オンライン物理バックアップの 排他モードと非排他モードについて 2020年7月30日 株式会社NTTデータ 藤井雅雄 @fujii_masao
  • 2.
    © 2020 NTTDATA Corporation 2 藤井 雅雄 @fujii_masao Database Technical Lead @ NTTデータ データベース研究開発、PostgreSQL 技術支援 PostgreSQLコミッタ レプリケーション(非同期 / 同期 / カスケード / クォーラムコミット) WAL圧縮、バックアップ進捗 pg_bigm(全文検索モジュール)コミッタ 自己紹介
  • 3.
    © 2020 NTTDATA Corporation 3 本講演について 講演資料は、後日、NTTデータのSlideShareアカウント上で公開予定です。 https://www.slideshare.net/nttdata-tech 以前のアンカンファレンスの講演資料は公開済です。 PostgreSQL 13 での pg_stat_statements の改善について PostgreSQL 13 での pg_basebackup の改善について PostgreSQL 13 での レプリケーション関連 の改善について
  • 4.
    © 2020 NTTDATA Corporation 4 オンライン物理バックアップの 排他モードと非排他モードについて
  • 5.
    © 2020 NTTDATA Corporation 5 PostgreSQLで利用できるバックアップ手法 バックアップ 論理バックアップ (SQLダンプ) pg_dump / pg_dumpall 物理バックアップ オフラインバックアップ (コールドバックアップ) 独自スクリプト(pg_ctl stop + rsyncなど) オンラインバックアップ (ホットバックアップ) pg_basebackup 外部ツール(pg_rman、 Barmanなど) 独自スクリプト (pg_start_backup + pg_stop_backup) 排他モード 非排他モード
  • 6.
    © 2020 NTTDATA Corporation 6 PostgreSQLで利用できるバックアップ手法 バックアップ 論理バックアップ (SQLダンプ) pg_dump / pg_dumpall 物理バックアップ オフラインバックアップ (コールドバックアップ) 独自スクリプト(pg_ctl stop + rsyncなど) オンラインバックアップ (ホットバックアップ) pg_basebackup 外部ツール(pg_rman、 Barmanなど) 独自スクリプト (pg_start_backup + pg_stop_backup) 排他モード 非排他モード 今日取り上げるバックアップ手法
  • 7.
    © 2020 NTTDATA Corporation 7 ご存じでしょうか? 非排他的な手法が推奨され、 排他的な手法は推奨されず、将来的に削除されます。 https://www.postgresql.jp/document/current/html/continuous-archiving.html#BACKUP-LOWLEVEL-BASE-BACKUP
  • 8.
    © 2020 NTTDATA Corporation 8 排他モード ① バックアップモードの開始 $ psql -c "SELECT pg_start_backup('mybackup')" ② DBクラスタのバックアップ OSコマンドやスナップショットなどを使って、DBクラスタと全テーブルスペースを物理的にバックアップ $ cp -a $PGDATA /tblspc1 /tblspc2 /backup ③ バックアップモードの終了 $ psql -c "SELECT pg_stop_backup()"
  • 9.
    © 2020 NTTDATA Corporation 9 非排他モード ① バックアップモードの開始 $ psql =# SELECT pg_start_backup('mybackup', false, false) ② DBクラスタのバックアップ OSコマンドやスナップショットなどを使って、DBクラスタと全テーブルスペースを物理的にバックアップ $ cp -a $PGDATA /tblspc1 /tblspc2 /backup ③ バックアップモードの終了 =# SELECT pg_stop_backup(false); ④ backup_labelとtablespace_mapのバックアップ pg_stop_backup()の戻り値の内容から backup_labelとtablespace_mapの2つのファイルを作成して、バックアップに含める ・第3引数にfalseを指定 ・pg_start_backupを実行したセッションを pg_stop_backupまで維持 ・第1引数にfalseを指定 ・pg_start_backupを実行したセッションで pg_stop_backupを実行
  • 10.
    © 2020 NTTDATA Corporation 10 非排他モード =# SELECT * FROM pg_stop_backup(false); lsn | labelfile | spcmapfile -----------+---------------------------------------------------------------+------------------------------- 0/3000138 | START WAL LOCATION: 0/3000028 (file 000000010000000000000003)+| 16386 /dav/head-pgsql/tblspc2+ | CHECKPOINT LOCATION: 0/3000060 +| 16385 /dav/head-pgsql/tblspc1+ | BACKUP METHOD: streamed +| | BACKUP FROM: master +| | START TIME: 2020-07-06 23:55:11 JST +| | LABEL: mybackup +| | START TIMELINE: 1 +| | | (1 row) backup_label tablespace_map ④-2 backup_labelとtablespace_mapをバックアップに格納 $ mv backup_label tablespace_map /backup ④-1 pg_stop_backup()の戻り値からbackup_labelとtablespace_mapのファイルを作成
  • 11.
    © 2020 NTTDATA Corporation 11 排他モードと非排他モードの比較 排他モード 非排他モード 利用可能なバージョン 8.0以降 9.6以降 バックアップの 同時実行可能数 1 複数 pg_start_backupと pg_stop_backupを 実行するセッション 同じまたは異なるセッション  バックアップ中のセッション断による影響はない  pg_stop_backupを忘れるとバックアップ モードは終了しない(次回のバックアップ取得 が失敗する) 同じセッション  セッション断によりバックアップが失敗する (pg_start_backupからやり直し)  セッションが切れればバックアップモードは終了 する backup_labelと tablespace_mapの 作成 pg_start_backupがDBクラスタ内に作成  DBクラスタをバックアップすれば、各ファイルは 自動的にバックアップに含まれる  バックアップ中にPostgreSQLがクラッシュす ると、クラッシュリカバリが失敗する可能性があ る(backup_labelがDBクラスタ内にある状 態でクラッシュリカバリが始まるため) pg_stop_backupからユーザが作成  ユーザが各ファイルをバックアップに含める必要 がある  左記のリカバリ失敗の可能性はない(DBクラ スタ内にbackup_labelは存在しないため)
  • 12.
    © 2020 NTTDATA Corporation 12 排他モードでバックアップ中にクラッシュした場合のリカバリ失敗について pg_start_backup CHECKPOINT 1 2 3 4 5 ? WALファイル 凡例 クラッシュ CHECKPOINT pg_stop_backup 各操作とWAL生成の流れ クラッシュリカバリでは 最新CHECKPOINT 以降のWALを適用 backup_labelがある状態で クラッシュリカバリが始まると、 pg_start_backup以降の WALを適用 • backup_labelが pg_start_backup以降 のWAL適用を指示  ②~④のWALが削除済だと リカバリ失敗  未削除の場合もリカバリ時間 が長くなる
  • 13.
    © 2020 NTTDATA Corporation 13 ご存じでしょうか? 非排他的な手法が推奨され、 排他的な手法は推奨されず、将来的に削除されます。 https://www.postgresql.jp/document/current/html/continuous-archiving.html#BACKUP-LOWLEVEL-BASE-BACKUP
  • 14.
    © 2020 NTTDATA Corporation 14 排他モードを削除するパッチ v14で排他モードを削除するパッチが提案されている Remove deprecated exclusive backup mode https://commitfest.postgresql.org/28/1913/ 削除についてまだ議論中だが、v14で削除となる可能性が高い(ように見える) • リカバリ失敗のリスクを危険視する開発者が多い • 排他モードを利用中のユーザがいるため削除に反対する意見もあるが少数 • 「排他モードは将来的に削除」とv9.6で明記してから、v14リリース時には5年経過済 排他モードが削除されても問題ないでしょうか?
  • 15.
    © 2020 NTTDATA Corporation 15 排他モードの削除に備えて 1. pg_basebackupまたは外部ツールに移行できるのであれば移行する 2. 独自スクリプトを改修して、非排他モードに移行する 3. (排他モードの必要性を強くコミュニティで主張して、排他モードを削除させない)
  • 16.
    © 2020 NTTDATA Corporation 16 排他モードから非排他モードへの移行例 $ psql -c "SELECT pg_start_backup('test')" $ cp -a /pgdata/data /backup $ psql -c "SELECT pg_stop_backup()" $ psql -f backup.sql SELECT pg_start_backup('test', false, false); ¥! cp -a /pgdata/data /backup SELECT pg_file_write('/tmp/backup_label', labelfile, false), pg_file_write('/tmp/tablespace_map', spcmapfile, false) FROM pg_stop_backup(false); ¥! mv /tmp/backup_label /tmp/tablespace_map /backup/data 排 他 モ ー ド 非 排 他 モ ー ド ・同一セッション内でpg_start_backupと pg_stop_backupを簡単に実行できるように、 バックアップのすべての操作をpsql内で実行する ・OSコマンドはpsqlメタコマンドの¥!を介して実行 ・pg_stop_backupからのbackup_labelと tablespace_mapの作成には、 pg_file_write関数を使う ・pg_file_write関数を使うにはadminpackの エクステンションをCREATE EXTENSIONする 必要がある(セキュリティ上の問題がないかは要確認)
  • 17.
    © 2020 NTTDATA Corporation 17 まとめ pg_start_backupとpg_stop_backupを使ったバックアップには 排他モードと非排他モードがある 排他モードは将来的に削除される予定 (v14で削除の可能性がある)
  • 18.
    © 2020 NTTDATA Corporation本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です。