‘TLS connections’¶
説明¶
- TLSサーバーは、リモートホストへのプロトコル接続にSSHを使用する代替手段です。
2.37 リリースからサポートされています。
このセクションでは、 Use Case 2 で説明されているような専用リポジトリホストからpgBackRestを実行するために使用される構成を調べますが、SSH接続ではなくTLSを使用します。
リポジトリホストが backup-srv と呼ばれる デモ クラスター(Rocky Linux 8で EDBPostgresAdvancedServer バージョン14を使用)をセットアップし、_Streaming Replication_の3つのPostgresノード: pg1-srv 、 pg2-srv 、 pg3-srv 。
リポジトリホストで専用ユーザーを作成する¶
pgbackrest
ユーザーは、バックアップとアーカイブのリポジトリを所有するために作成されます。すべてのユーザーがリポジトリを所有できますが、混乱を避けるために
postgres または enterprisedb を使用しないことをお勧めします。
backup-srv にユーザーとリポジトリの場所を作成します。
$ sudo groupadd pgbackrest
$ sudo adduser -g pgbackrest -n pgbackrest
$ sudo chown pgbackrest: /var/log/pgbackrest
- リポジトリは、バックアップサーバーから到達可能である必要があります。
first use case で説明されているさまざまなサポートされているタイプにあります。
たとえば、バックアップとアーカイブをローカルに保存する /backup_space
を作成しましょう。
$ sudo mkdir /backup_space
$ sudo chown pgbackrest: /backup_space
証明書の生成¶
TLSサーバーの実装は証明書に依存しています。
この例では、 * 独自のルート認証局(CA)を作成します。 * Postgresノードとバックアップサーバーのキーと証明書を生成します。
$ mkdir certs && cd certs
$ openssl req -new -x509 -days 365 -nodes -out ca.crt -keyout ca.key -subj "/CN=root-ca"
$ openssl req -new -nodes -out backup-srv.csr -keyout backup-srv.key -subj "/CN=backup-srv"
$ openssl req -new -nodes -out pg1-srv.csr -keyout pg1-srv.key -subj "/CN=pg1-srv"
$ openssl req -new -nodes -out pg2-srv.csr -keyout pg2-srv.key -subj "/CN=pg2-srv"
$ openssl req -new -nodes -out pg3-srv.csr -keyout pg3-srv.key -subj "/CN=pg3-srv"
$ openssl x509 -req -in backup-srv.csr -days 365 -CA ca.crt -CAkey ca.key -CAcreateserial -out backup-srv.crt
$ openssl x509 -req -in pg1-srv.csr -days 365 -CA ca.crt -CAkey ca.key -CAcreateserial -out pg1-srv.crt
$ openssl x509 -req -in pg2-srv.csr -days 365 -CA ca.crt -CAkey ca.key -CAcreateserial -out pg2-srv.crt
$ openssl x509 -req -in pg3-srv.csr -days 365 -CA ca.crt -CAkey ca.key -CAcreateserial -out pg3-srv.crt
$ rm *.csr
次に、各サーバーに展開する必要があります(ca.crt +
server_name.crt + server_name.key )。
これは、ホスト間の共有フォルダーを使用した例です。
# on backup-srv
$ sudo -u pgbackrest mkdir ~pgbackrest/certs
$ sudo cp `hostname`.* ~pgbackrest/certs
$ sudo cp ca.crt ~pgbackrest/certs
$ sudo chown -R pgbackrest: ~pgbackrest/certs
$ sudo chmod -R og-rwx ~pgbackrest/certs
# on pg1-srv, pg2-srv and pg3-srv
$ sudo -u enterprisedb mkdir ~enterprisedb/certs
$ sudo cp `hostname`.* ~enterprisedb/certs
$ sudo cp ca.crt ~enterprisedb/certs
$ sudo chown -R enterprisedb: ~enterprisedb/certs
$ sudo chmod -R og-rwx ~enterprisedb/certs
構成¶
demo というスタンザの構成を準備します。
backup-srv pgBackRest構成ファイルを更新します。
# /etc/pgbackrest.conf
[global]
# repo details
repo1-path=/backup_space
repo1-retention-full=2
# general options
process-max=2
log-level-console=info
log-level-file=debug
start-fast=y
delta=y
# tls server options
tls-server-address=*
tls-server-cert-file=/home/pgbackrest/certs/backup-srv.crt
tls-server-key-file=/home/pgbackrest/certs/backup-srv.key
tls-server-ca-file=/home/pgbackrest/certs/ca.crt
tls-server-auth=pg1-srv=demo
tls-server-auth=pg2-srv=demo
tls-server-auth=pg3-srv=demo
[demo]
pg1-host=pg1-srv
pg1-host-user=enterprisedb
pg1-path=/var/lib/edb/as14/data
pg1-host-type=tls
pg1-host-cert-file=certs/backup-srv.crt
pg1-host-key-file=certs/backup-srv.key
pg1-host-ca-file=certs/ca.crt
pg1-srv 、 pg2-srv 、および pg3-srv pgBackRest構成ファイルを更新します。
# /etc/pgbackrest.conf
[global]
repo1-host=backup-srv
repo1-host-user=pgbackrest
repo1-host-type=tls
repo1-host-cert-file=/var/lib/edb/certs/pg1-srv.crt
repo1-host-key-file=/var/lib/edb/certs/pg1-srv.key
repo1-host-ca-file=/var/lib/edb/certs/ca.crt
# general options
process-max=2
log-level-console=info
log-level-file=debug
# tls server options
tls-server-address=*
tls-server-cert-file=/var/lib/edb/certs/pg1-srv.crt
tls-server-key-file=/var/lib/edb/certs/pg1-srv.key
tls-server-ca-file=/var/lib/edb/certs/ca.crt
tls-server-auth=backup-srv=demo
[demo]
pg1-path=/var/lib/edb/as14/data
pg1-user=enterprisedb
pg1-port=5444
(注:明らかに、 pg2-srv の_pg2-srv_と pg3-srv の_pg3-srv_を調整します。)
クライアントは、証明書を検証し、証明書のCN(Common
Name)をtls-server-auth
で構成されたサーバー上のリストと照合することにより、サーバーで承認されます。
tls-server-auth
オプションを繰り返すことで、必要な数のスタンザに対して、または
tls-server-auth=*
を指定することにより、すべてのスタンザに対してCNを承認できます。
アイデアは、各ホストでTLSサーバーを実行して、他のホストからの要求を処理することです。例では、リポジトリーホストで実行されている
backup
コマンドは、Postgresノードで実行されているTLSサーバーのクライアントとして機能します。
Postgresノードで実行されているarchive-push
コマンドは、リポジトリーホストで実行されているTLSサーバーのクライアントとして機能します。
EDB Postgres Advanced Server コマンドを使用してTLSサーバーを起動でき、SIGINTシグナル(Control+C)で終了するまで実行されます。
PGDGパッケージでまだ行われていない場合は、 backup-srv サーバーでサービスファイルを作成します。
# /etc/systemd/system/pgbackrest.service
[Unit]
Description=pgBackRest Server
After=network.target
StartLimitIntervalSec=0
[Service]
Type=simple
User=pgbackrest
Restart=always
RestartSec=1
ExecStart=/usr/bin/pgbackrest server
ExecStartPost=/bin/sleep 3
ExecStartPost=/bin/bash -c "[ ! -z $MAINPID ]"
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
サーバーを起動して、実行されていることを確認します。
$ sudo systemctl daemon-reload
$ sudo systemctl enable pgbackrest
$ sudo systemctl start pgbackrest
$ pgbackrest server-ping
server-ping
コマンドは、認証が試行されないため、生存確認としてのみ機能します。
tls-*
の構成を変更した場合は、プロセスを終了/再起動することを忘れないでください。
次に、この構成を使用して、 pg1-srv 、 pg2-srv 、および pg3-srv で同じ手順(サービスの構成とスタート)を適用します。
# /etc/systemd/system/pgbackrest.service
[Unit]
Description=pgBackRest Server
After=network.target
StartLimitIntervalSec=0
[Service]
Type=simple
User=enterprisedb
Restart=always
RestartSec=1
ExecStart=/usr/bin/pgbackrest server
ExecStartPost=/bin/sleep 3
ExecStartPost=/bin/bash -c "[ ! -z $MAINPID ]"
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
次に、 postgresql.conf ファイル( pg1-srv
)でPostgresアーカイブを構成しましょう。
listen_addresses = *
archive_mode = on
archive_command = pgbackrest --stanza=demo archive-push %p
これらの変更を加えた後、バックアップを実行する前に、Postgresインスタンスを再起動する必要があります。
最後にスタンザを作成し、 backup-srv で構成を確認しましょう。
$ sudo -iu pgbackrest pgbackrest --stanza=demo stanza-create
...
P00 INFO: stanza-create command end: completed successfully
$ sudo -iu pgbackrest pgbackrest --stanza=demo check
...
P00 INFO: check command end: completed successfully
バックアップを実行する¶
すべてが正常に動作している場合、最初のバックアップを作成できます。
$ sudo -iu pgbackrest pgbackrest --stanza=demo --type=full backup
P00 INFO: backup command begin 2.38: ..
P00 INFO: execute non-exclusive pg_start_backup(): backup begins after the requested
immediate checkpoint completes
P00 INFO: backup start archive = 000000010000000000000004, lsn = 0/4000060
P00 INFO: check archive for prior segment 000000010000000000000003
P00 INFO: execute non-exclusive pg_stop_backup() and wait for all WAL segments to archive
P00 INFO: backup stop archive = 000000010000000000000004, lsn = 0/4000138
P00 INFO: check archive for segment(s) 000000010000000000000004:000000010000000000000004
P00 INFO: new backup label = 20220308-143110F
P00 INFO: full backup size = 56.5MB, file total = 1691
P00 INFO: backup command end: completed successfully
info コマンドは、
pgBackRestが正しく構成されている任意のサーバーから実行できます。
# From the Postgres node
$ sudo -iu enterprisedb pgbackrest --stanza=demo info
stanza: demo
status: ok
cipher: none
db (current)
wal archive min/max (14): 000000010000000000000002/000000010000000000000004
full backup: 20220308-143110F
timestamp start/stop: 2022-03-08 14:31:10 / 2022-03-08 14:31:20
wal start/stop: 000000010000000000000004 / 000000010000000000000004
database size: 56.5MB, database backup size: 56.5MB
repo1: backup set size: 9.1MB, backup size: 9.1MB
# From the backup server
$ sudo -iu pgbackrest pgbackrest --stanza=demo info
stanza: demo
status: ok
cipher: none
db (current)
wal archive min/max (14): 000000010000000000000002/000000010000000000000004
full backup: 20220308-143110F
timestamp start/stop: 2022-03-08 14:31:10 / 2022-03-08 14:31:20
wal start/stop: 000000010000000000000004 / 000000010000000000000004
database size: 56.5MB, database backup size: 56.5MB
repo1: backup set size: 9.1MB, backup size: 9.1MB
ストリーミングレプリケーション用にサーバーを準備する¶
pg1-srv で、レプリケーション用の特定のユーザーを作成します。
$ sudo -iu enterprisedb psql -d postgres
postgres=# CREATE ROLE replic_user WITH LOGIN REPLICATION PASSWORD mypwd;
pg_hba.conf を構成します。
host replication replic_user pg2-srv scram-sha-256
host replication replic_user pg3-srv scram-sha-256
構成をリロードします。
$ sudo systemctl reload edb-as-14.service
pg2-srv および pg3-srv で~enterprisedb/.pgpass
を構成します。
$ sudo -iu enterprisedb
$ echo "*:*:replication:replic_user:mypwd" >> ~enterprisedb/.pgpass
$ chown enterprisedb: ~enterprisedb/.pgpass
$ chmod 0600 ~enterprisedb/.pgpass
スタンバイサーバーをセットアップする¶
- pg2-srv と pg3-srv で
/etc/pgbackrest.confを調整して、 recovery-option を追加します。アイデアは、restoreコマンドで_Streaming
Replication_接続文字列を自動的に構成することです。
recovery-option=primary_conninfo=host=pg1-srv user=replic_user
次に、 info
コマンドを実行して、構成が正しいことを確認します。上記と同じ出力が出力されます。
pg2-srv および pg3-srv で pg1-srv サーバーから取得したバックアップを復元します。
$ sudo -iu enterprisedb pgbackrest --stanza=demo --type=standby restore
P00 INFO: restore command begin 2.38: ...
P00 INFO: repo1: restore backup set 20220308-143110F, recovery will start at ...
P00 INFO: write updated /var/lib/edb/as14/data/postgresql.auto.conf
P00 INFO: restore global/pg_control
(performed last to ensure aborted restores cannot be started)
P00 INFO: restore size = 56.5MB, file total = 1691
P00 INFO: restore command end: completed successfully
復元すると、postgresql.auto.conf ファイルに情報が追加されます。
# Recovery settings generated by pgBackRest restore on ...
primary_conninfo = host=pg1-srv user=replic_user
restore_command = pgbackrest --stanza=demo archive-get %f "%p"
--type=standby
オプションは、Postgresがスタンバイモードで起動するために必要なstandby.signal
を作成します。あとはPostgresインスタンスを起動するだけです。
$ sudo systemctl enable edb-as-14.service
$ sudo systemctl start edb-as-14.service
レプリケーション設定が正しい場合、 pg1-srv サーバーでこれらのプロセスが表示されます。
$ sudo -u enterprisedb ps -o pid,cmd fx
PID CMD
30594 /usr/edb/as14/bin/edb-postmaster -D /var/lib/edb/as14/data
...
31436 \_ postgres: walsender replic_user ... streaming 0/5001FB0
31439 \_ postgres: walsender replic_user ... streaming 0/5001FB0
30222 /usr/bin/pgbackrest server
これで、セーフティネットとして_ストリーミングレプリケーション_とアーカイブリカバリを使用する3ノードクラスターができました。
スタンバイサーバーからバックアップを取る¶
backup-srv のpgBackRest構成ファイルの[demo]
スタンザセクションに、次の設定を追加します。
pg2-host=pg2-srv
pg2-host-user=enterprisedb
pg2-path=/var/lib/edb/as14/data
pg2-host-type=tls
pg2-host-cert-file=certs/backup-srv.crt
pg2-host-key-file=certs/backup-srv.key
pg2-host-ca-file=certs/ca.crt
pg3-host=pg3-srv
pg3-host-user=enterprisedb
pg3-path=/var/lib/edb/as14/data
pg3-host-type=tls
pg3-host-cert-file=certs/backup-srv.crt
pg3-host-key-file=certs/backup-srv.key
pg3-host-ca-file=certs/ca.crt
backup-standby=y
次に、構成で見つかった最初のスタンバイサーバーからデータを取得してバックアップを実行します。
$ sudo -iu pgbackrest pgbackrest --stanza=demo --type=full backup
P00 INFO: backup command begin 2.38: ...
P00 INFO: execute non-exclusive pg_start_backup(): backup begins after the requested
immediate checkpoint completes
P00 INFO: backup start archive = 000000010000000000000006, lsn = 0/6000028
P00 INFO: wait for replay on the standby to reach 0/6000028
P00 INFO: replay on the standby reached 0/6000028
P00 INFO: check archive for prior segment 000000010000000000000005
P00 INFO: execute non-exclusive pg_stop_backup() and wait for all WAL segments to archive
P00 INFO: backup stop archive = 000000010000000000000006, lsn = 0/6000138
P00 INFO: check archive for segment(s) 000000010000000000000006:000000010000000000000006
P00 INFO: new backup label = 20220308-145104F
P00 INFO: full backup size = 56.5MB, file total = 1691
P00 INFO: backup command end: completed successfully
結論¶
TLSサーバーは、リモート操作のためのSSHの代替を提供します。この新機能は、パフォーマンスとユーザーエクスペリエンスを大幅に向上させることができるコンテナ化された世界に完全に適合します。