KEMBAR78
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン) | PDF
© 2020 NTT DATA Corporation 1 © 2020 NTT DATA Corporation
第14回 PostgreSQLアンカンファレンス@オンライン
PostgreSQL13での
レプリケーション関連の改善について
2020年6月25日
株式会社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 の改善について
© 2020 NTT DATA Corporation 4
PostgreSQL13 での
レプリケーション関連の改善について
© 2020 NTT DATA Corporation 5
PostgreSQL 13
• 現在コミュニティで開発中の最新バージョン
• 5月21日 β1リリース。機能一覧はリリースノートから
https://postgresql.org/docs/devel/release-13.html
• 10~11月に正式リリースの予定
今日紹介する内容は、正式リリースまでの間に
変更となる可能性があることにご注意ください!!
© 2019 NTT DATA Corporation 6
ストリーミングレプリケーション (物理レプリケーション)
マスタでのデータベースの更新結果を、WALでスタンバイにレプリケーション(複製)
マスタでは更新・参照SQL、スタンバイでは参照SQLのみ実行可能
⑤リカバリ
マスタ スタンバイ
クライアント①更新SQL
②WAL書込
③WAL転送
④WAL書込
© 2020 NTT DATA Corporation 7
新機能(1)
レプリケーション接続先を手軽に再設定
© 2020 NTT DATA Corporation 8
レプリケーション接続先の設定
スタンバイ側で、primary_conninfoパラメータに
レプリケーション接続先を設定
$ cat $PGDATA/postgresql.conf
primary_conninfo = 'host=x.x.x.x port=5432 user=repuser'
マスタ スタンバイ
WAL転送
接続要求
x.x.x.x:5432
© 2020 NTT DATA Corporation 9
レプリケーション接続先を再設定するときの課題 (v12以前)
マスタ
スタンバイ
新マスタ
フェイル
オーバ
WAL転送
接続要求
レプリケーション接続先を再設定するには、スタンバイの再起動が必要
x.x.x.x:5432
y.y.y.y:9999
primary_conninfo = 'host=y.y.y.y port=9999 user=repuser'
再起動
© 2020 NTT DATA Corporation 10
レプリケーション接続先を手軽に再設定 (v13以降)
マスタ
スタンバイ
新マスタ
フェイル
オーバ
WAL転送
接続要求
v13から、設定ファイルの再読み込みで、レプリケーション接続先を再設定可能に!
x.x.x.x:5432
y.y.y.y:9999
primary_conninfo = 'host=y.y.y.y port=9999 user=repuser'
設定ファイル再読み込み
$ pg_ctl $PGDATA reload
© 2020 NTT DATA Corporation 11
レプリケーション接続先を手軽に再設定 (v13以降)
primary_conninfoを空にして設定ファイルを再読み込みすることで、
スタンバイ側でWAL受信を一時停止(walreceiverを停止)可能に!
マスタ スタンバイ
WAL転送
接続要求
x.x.x.x:5432
primary_conninfo = ''
設定ファイル再読み込み
$ pg_ctl $PGDATA reload
一時停止
© 2020 NTT DATA Corporation 12
(参考) 複数のレプリケーション接続先の設定
マスタ
スタンバイ
新マスタ
フェイル
オーバ
WAL転送
接続要求
v10から、複数のレプリケーション接続先を事前に設定して、
自動的に接続先を切り替えることも可能
x.x.x.x:5432
y.y.y.y:9999
primary_conninfo = 'host=x.x.x.x,y.y.y.y port=5432,9999 user=repuser'
接続に成功するまで、
設定された接続先へ
の接続を順番に試す
© 2020 NTT DATA Corporation 13
新機能(2)
レプリケーションスロットで保持できる
WALの最大サイズを設定可能に
© 2020 NTT DATA Corporation 14
レプリケーションで発生するエラー
ERROR: requested WAL segment 0000000100000000000000A7 has already been removed
☞スタンバイに未転送のWALファイルをマスタが削除したため、レプリケーションを継続できない
マスタ スタンバイ
WAL転送
接続要求
スタンバイにどのWALファイルまで
転送済か考慮することなく、
古い不要なWALファイルを判断して削除
© 2020 NTT DATA Corporation 15
エラーを回避するための対策その① (v9.0以降)
wal_keep_segmentsパラメータで最低限保持するWALファイルの数を指定
☞マスタ/スタンバイ間の差分がwal_keep_segments内に収まればエラーを回避できる
マスタ スタンバイ
WAL転送
接続要求
wal_keep_segmentsで指定された個数分は
WALファイルが残るように考慮して、
古い不要なWALファイルを削除
© 2020 NTT DATA Corporation 16
エラーを回避するための対策その① (v9.0以降)
wal_keep_segmentsの課題
① エラーを完全には回避できない。
マスタ/スタンバイ間の差分がwal_keep_segmentsを超えると、未転送
のWALファイルがマスタで削除されて、レプリケーションを継続できない
② スタンバイがマスタに十分追いついているとき、転送済の古いWALファイルは
削除してもよいのに、wal_keep_segmentsの設定により削除できない
(保持される)
© 2020 NTT DATA Corporation 17
エラーを回避するための対策その② (v9.4以降)
スタンバイにどのWALファイルまで転送済みかをレプリケーションスロットで管理
マスタ スタンバイ
WAL転送
接続要求
スタンバイにどのWALファイルまで
転送済か考慮して、
古い不要なWALファイルを判断して削除
レプリケーションスロットの作成
SELECT pg_create_physical_replication_slot('repslot');
レプリケーションスロット利用の設定
primary_slot_name = 'repslot'
© 2020 NTT DATA Corporation 18
エラーを回避するための対策その② (v9.4以降)
レプリケーションスロットの課題
① 未転送のWALファイルをずっと削除できない。
スタンバイが遅延/停止すると、未転送のため削除できないWALファイルがマ
スタ側に蓄積され続ける。
WALの書き出し先がディスクフルになると、マスタ側のPostgreSQLは
PANIC終了する。
© 2020 NTT DATA Corporation 19
エラーを回避するための対策その③ (v13以降)
レプリケーションスロットで保持できるWALファイルの最大サイズを
max_slot_wal_keep_sizeパラメータで設定可能に!
マスタ スタンバイ
WAL転送
接続要求
スタンバイにどのWALファイルまで転送済かと
マスタ側で保持できるWALファイル数を考慮して、
古い不要なWALファイルを判断して削除
レプリケーションスロットの作成とWALファイル保持上限の設定
SELECT pg_create_physical_replication_slot('repslot');
max_slot_wal_keep_size = '1GB'
レプリケーションスロット利用の設定
primary_slot_name = 'repslot'
© 2020 NTT DATA Corporation 20
エラーを回避するための対策の比較
対策
利用できる
バージョン
未転送WALの削除
を回避できるか?
未転送WALを上限
なく保持するか?
転送済WALをすぐ
に削除できるか?
wal_keep_segments 9.0以降
できないこともある
⇨ レプリケーション
失敗のリスクあり
上限がある
できない
⇨ 必要以上にディ
スク消費あり
レプリケーションスロット 9.4以降 完全にできる
上限はない
⇨ マスタPANIC終
了のリスクあり
できる
レプリケーションスロット +
max_slot_wal_keep_size
13以降
できないこともある
⇨ レプリケーション
失敗のリスクあり
上限がある できる
© 2020 NTT DATA Corporation 21
まとめ
© 2020 NTT DATA Corporation 22
まとめ
PostgreSQL13から、レプリケーション関連で
1. レプリケーション接続先を手軽に再設定
2. レプリケーションスロットで保持できる
WALの最大サイズを設定
できるようになります。
v13βで、ぜひ機能をお試しいただければ!!
© 2020 NTT DATA Corporation本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です。

PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)

  • 1.
    © 2020 NTTDATA Corporation 1 © 2020 NTT DATA Corporation 第14回 PostgreSQLアンカンファレンス@オンライン PostgreSQL13での レプリケーション関連の改善について 2020年6月25日 株式会社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 の改善について
  • 4.
    © 2020 NTTDATA Corporation 4 PostgreSQL13 での レプリケーション関連の改善について
  • 5.
    © 2020 NTTDATA Corporation 5 PostgreSQL 13 • 現在コミュニティで開発中の最新バージョン • 5月21日 β1リリース。機能一覧はリリースノートから https://postgresql.org/docs/devel/release-13.html • 10~11月に正式リリースの予定 今日紹介する内容は、正式リリースまでの間に 変更となる可能性があることにご注意ください!!
  • 6.
    © 2019 NTTDATA Corporation 6 ストリーミングレプリケーション (物理レプリケーション) マスタでのデータベースの更新結果を、WALでスタンバイにレプリケーション(複製) マスタでは更新・参照SQL、スタンバイでは参照SQLのみ実行可能 ⑤リカバリ マスタ スタンバイ クライアント①更新SQL ②WAL書込 ③WAL転送 ④WAL書込
  • 7.
    © 2020 NTTDATA Corporation 7 新機能(1) レプリケーション接続先を手軽に再設定
  • 8.
    © 2020 NTTDATA Corporation 8 レプリケーション接続先の設定 スタンバイ側で、primary_conninfoパラメータに レプリケーション接続先を設定 $ cat $PGDATA/postgresql.conf primary_conninfo = 'host=x.x.x.x port=5432 user=repuser' マスタ スタンバイ WAL転送 接続要求 x.x.x.x:5432
  • 9.
    © 2020 NTTDATA Corporation 9 レプリケーション接続先を再設定するときの課題 (v12以前) マスタ スタンバイ 新マスタ フェイル オーバ WAL転送 接続要求 レプリケーション接続先を再設定するには、スタンバイの再起動が必要 x.x.x.x:5432 y.y.y.y:9999 primary_conninfo = 'host=y.y.y.y port=9999 user=repuser' 再起動
  • 10.
    © 2020 NTTDATA Corporation 10 レプリケーション接続先を手軽に再設定 (v13以降) マスタ スタンバイ 新マスタ フェイル オーバ WAL転送 接続要求 v13から、設定ファイルの再読み込みで、レプリケーション接続先を再設定可能に! x.x.x.x:5432 y.y.y.y:9999 primary_conninfo = 'host=y.y.y.y port=9999 user=repuser' 設定ファイル再読み込み $ pg_ctl $PGDATA reload
  • 11.
    © 2020 NTTDATA Corporation 11 レプリケーション接続先を手軽に再設定 (v13以降) primary_conninfoを空にして設定ファイルを再読み込みすることで、 スタンバイ側でWAL受信を一時停止(walreceiverを停止)可能に! マスタ スタンバイ WAL転送 接続要求 x.x.x.x:5432 primary_conninfo = '' 設定ファイル再読み込み $ pg_ctl $PGDATA reload 一時停止
  • 12.
    © 2020 NTTDATA Corporation 12 (参考) 複数のレプリケーション接続先の設定 マスタ スタンバイ 新マスタ フェイル オーバ WAL転送 接続要求 v10から、複数のレプリケーション接続先を事前に設定して、 自動的に接続先を切り替えることも可能 x.x.x.x:5432 y.y.y.y:9999 primary_conninfo = 'host=x.x.x.x,y.y.y.y port=5432,9999 user=repuser' 接続に成功するまで、 設定された接続先へ の接続を順番に試す
  • 13.
    © 2020 NTTDATA Corporation 13 新機能(2) レプリケーションスロットで保持できる WALの最大サイズを設定可能に
  • 14.
    © 2020 NTTDATA Corporation 14 レプリケーションで発生するエラー ERROR: requested WAL segment 0000000100000000000000A7 has already been removed ☞スタンバイに未転送のWALファイルをマスタが削除したため、レプリケーションを継続できない マスタ スタンバイ WAL転送 接続要求 スタンバイにどのWALファイルまで 転送済か考慮することなく、 古い不要なWALファイルを判断して削除
  • 15.
    © 2020 NTTDATA Corporation 15 エラーを回避するための対策その① (v9.0以降) wal_keep_segmentsパラメータで最低限保持するWALファイルの数を指定 ☞マスタ/スタンバイ間の差分がwal_keep_segments内に収まればエラーを回避できる マスタ スタンバイ WAL転送 接続要求 wal_keep_segmentsで指定された個数分は WALファイルが残るように考慮して、 古い不要なWALファイルを削除
  • 16.
    © 2020 NTTDATA Corporation 16 エラーを回避するための対策その① (v9.0以降) wal_keep_segmentsの課題 ① エラーを完全には回避できない。 マスタ/スタンバイ間の差分がwal_keep_segmentsを超えると、未転送 のWALファイルがマスタで削除されて、レプリケーションを継続できない ② スタンバイがマスタに十分追いついているとき、転送済の古いWALファイルは 削除してもよいのに、wal_keep_segmentsの設定により削除できない (保持される)
  • 17.
    © 2020 NTTDATA Corporation 17 エラーを回避するための対策その② (v9.4以降) スタンバイにどのWALファイルまで転送済みかをレプリケーションスロットで管理 マスタ スタンバイ WAL転送 接続要求 スタンバイにどのWALファイルまで 転送済か考慮して、 古い不要なWALファイルを判断して削除 レプリケーションスロットの作成 SELECT pg_create_physical_replication_slot('repslot'); レプリケーションスロット利用の設定 primary_slot_name = 'repslot'
  • 18.
    © 2020 NTTDATA Corporation 18 エラーを回避するための対策その② (v9.4以降) レプリケーションスロットの課題 ① 未転送のWALファイルをずっと削除できない。 スタンバイが遅延/停止すると、未転送のため削除できないWALファイルがマ スタ側に蓄積され続ける。 WALの書き出し先がディスクフルになると、マスタ側のPostgreSQLは PANIC終了する。
  • 19.
    © 2020 NTTDATA Corporation 19 エラーを回避するための対策その③ (v13以降) レプリケーションスロットで保持できるWALファイルの最大サイズを max_slot_wal_keep_sizeパラメータで設定可能に! マスタ スタンバイ WAL転送 接続要求 スタンバイにどのWALファイルまで転送済かと マスタ側で保持できるWALファイル数を考慮して、 古い不要なWALファイルを判断して削除 レプリケーションスロットの作成とWALファイル保持上限の設定 SELECT pg_create_physical_replication_slot('repslot'); max_slot_wal_keep_size = '1GB' レプリケーションスロット利用の設定 primary_slot_name = 'repslot'
  • 20.
    © 2020 NTTDATA Corporation 20 エラーを回避するための対策の比較 対策 利用できる バージョン 未転送WALの削除 を回避できるか? 未転送WALを上限 なく保持するか? 転送済WALをすぐ に削除できるか? wal_keep_segments 9.0以降 できないこともある ⇨ レプリケーション 失敗のリスクあり 上限がある できない ⇨ 必要以上にディ スク消費あり レプリケーションスロット 9.4以降 完全にできる 上限はない ⇨ マスタPANIC終 了のリスクあり できる レプリケーションスロット + max_slot_wal_keep_size 13以降 できないこともある ⇨ レプリケーション 失敗のリスクあり 上限がある できる
  • 21.
    © 2020 NTTDATA Corporation 21 まとめ
  • 22.
    © 2020 NTTDATA Corporation 22 まとめ PostgreSQL13から、レプリケーション関連で 1. レプリケーション接続先を手軽に再設定 2. レプリケーションスロットで保持できる WALの最大サイズを設定 できるようになります。 v13βで、ぜひ機能をお試しいただければ!!
  • 23.
    © 2020 NTTDATA Corporation本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です。