PowerGres はオンプレミス環境に限らず、クラウドプラットフォーム上で動作させることが可能です。 本記事ではクラウドプラットフォームの一つである AWS の仮想マシンサービスである EC2 上で、シングルサーバの PowerGres を構築する手順をご紹介します。
今回の構築例では、Amazon Linux 2 に PowerGres on Linux V13 を用いますが、動作環境に当てはまる OS を EC2 インスタンスに用いれば PowerGres および PowerGres Plus はバージョン問わずクラウド上で動作させることが可能です。
なお、構築環境の前提として AWS が利用可能な状態で、VPC などのネットワークは予め設定されているものとします。
AWS Management Console にログインし、EC2 ダッシュボードにアクセスします。
[ec2-user@ec2-instance ~]$ sudo mkfs -t xfs /dev/sdb [ec2-user@ec2-instance ~]$ sudo mkdir /pg [ec2-user@ec2-instance ~]$ sudo mount /dev/sdb /pg
[ec2-user@ec2-instance ~]$ sudo mkdir /pg/data [ec2-user@ec2-instance ~]$ sudo chown postgres:postgres /pg/data [ec2-user@ec2-instance ~]$ sudo chmod 700 /pg/data [ec2-user@ec2-instance ~]$ sudo su - postgres -bash-4.2$ /opt/powergres13/bin/initdb -D /pg/data --no-locale --encoding=utf8
-bash-4.2$ /opt/powergres13/bin/pg_ctl start -D /pg/data
さて、ここからは AWS のストレージサービスを利用したバックアップ設定を紹介します。
PowerGres には WAL アーカイブを利用した増分バックアップ機能があります。増分バックアップを用いたリカバリは任意の時刻の状態に復旧が可能なので PITR(=Point In Time Recovery) と呼ばれています。
増分バックアップを用いるには「データディレクトリを保存したバックアップ」と「差分となる WAL」をバックアップする必要があります。 今回、AWS のストレージサービスを用いて前者は EBS スナップショットとして、後者は S3 にバックアップします。
EBS はボリュームごとスナップショットを作成することが可能です。スナップショットからのボリュームの作成が高速であるため早い復旧が見込めます。
スナップショットを作成するときはデータベースサーバを停止するか、バックアップモードに設定する必要があります。 バックアップモードは SQL の pg_start_backup 関数で開始し、pg_stop_backup 関数で終了します。バックアップモードを用いれば、稼働中のデータベースのデータディレクトリを安全に取得可能です。
EBS スナップショットを作成するバックアップスクリプトは以下のとおりです。ボリューム ID は EBS 画面から確認してください。事前にバックアップを行うユーザ(バックアップスクリプトを起動するユーザ)に対して、AWS CLI を利用可能な状態として、PowerGres に接続できるようにしておく必要があります。なお、今回は省略しましたが、スナップショットはタグや説明をつけておくと管理が容易になります。
-bash-4.2$ cat backup.sh /opt/powergres13/bin/psql -c "SELECT pg_start_backup(CURRENT_TIMESTAMP::text)" aws ec2 create-snapshot --volume-id 《データディレクトリのボリュームID》 /opt/powergres13/bin/psql -c "SELECT pg_stop_backup()"cronを用いて毎日23:59にバックアップするのであれば、以下のように設定します。
-bash-4.2$ crontab -e 59 23 * * * 《バックアップスクリプトパス》/backup.sh
-bash-4.2$ cat /pg/data/postgresql.conf .. archive_mode = on archive_command = 'aws s3 cp %p s3://《バケット名》/wal_archive/%f' ..
-bash-4.2$ /opt/powergres13/bin/pg_ctl restart -D /pg/data
バックアップ設定は以上です。
ここではデータディレクトリが破損した場合を想定したシミュレーションを行い、リカバリ手順を示します。 本方式のバックアップ設定では、データディレクトリのバックアップ取得後の更新も WAL アーカイブから復旧できることを確認します。
$ bash backup.sh
postgres=# create table test_table (i int); CREATE TABLE postgres=# insert into test_table values(1); INSERT 0 1 postgres=# select * from test_table; i --- 1 (1 row) postgres=# select pg_switch_wal(); pg_switch_wal --------------- 0/57010FD0 (1 row)
本方式のリカバリでは EBS スナップショットをボリューム化し既存のボリュームと交換し、データベースサーバ起動時に S3 に保存した WAL アーカイブを読み出すことになります。以下に具体的な手順を示します。
-bash-4.2$ /opt/powergres13/bin/pg_ctl stop -m i -D /pg/data waiting for server to shut down.... done server stopped
[ec2-user@ec2-instance ~]$ sudo umount /pg
[ec2-user@ec2-instance ~]$ sudo mount /dev/sdf /pg [ec2-user@ec2-instance ~]$ df -h /pg Filesystem Size Used Avail Use% Mounted on /dev/xvdf 8.0G 1.7G 6.3G 22% /pg
[ec2-user@ec2-instance ~]$ sudo su - postgres -bash-4.2$ vi /pg/data/postgresql.conf restore_command = 'aws s3 cp s3://《バケット名》/wal_archive/%f %p' -bash-4.2$ touch /pg/data/recovery.signal
-bash-4.2$ /opt/powergres13/bin/pg_ctl start -D /pg/data
-bash-4.2$ psql psql (13.10) Type "help" for help. postgres=# select * from test_table; i --- 1 (1 row)
以上で、リカバリは完了です。
今回はデータディレクトリに対応する EBS ボリュームを単体でバックアップしましたが、サーバ全体の障害に対応するにはサーバ全体を AMI(インスタンスのイメージ)として取得するのがよいです。AMI であれば EBS スナップショットも同時に取得されるので、AMI からインスタンスを起動することでサーバ全体の復旧が可能です。