PowerGres

技術情報 | PowerGres体験記 | AWS上でPowerGresを構築してみよう

 

AWS上でPowerGresを構築してみよう

PowerGres はオンプレミス環境に限らず、クラウドプラットフォーム上で動作させることが可能です。 本記事ではクラウドプラットフォームの一つである AWS の仮想マシンサービスである EC2 上で、シングルサーバの PowerGres を構築する手順をご紹介します。

今回の構築例では、Amazon Linux 2 に PowerGres on Linux V13 を用いますが、動作環境に当てはまる OS を EC2 インスタンスに用いれば PowerGres および PowerGres Plus はバージョン問わずクラウド上で動作させることが可能です。

なお、構築環境の前提として AWS が利用可能な状態で、VPC などのネットワークは予め設定されているものとします。

構築手順

[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 スナップショットでデータディレクトリをバックアップ

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
S3でWALアーカイブ
-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 からインスタンスを起動することでサーバ全体の復旧が可能です。

まとめ

本記事では、PowerGres を AWS 上に構築する手順およびバックアップ・リカバリ手順を示しました。今回は仮想マシンを提供している EC2サービスを用いてデータベースを構築しましたが、AWS にはデータベースそのものを提供するマネージドDBサービス(RDS)もあるので簡単にDB構築/運用を行いたいのであればそれらのサービスを用いるのも選択肢のうちの一つです。しかし、PowerGres など RDS 対応していない DB エンジンを用いたかったり、運用のカスタマイズ性を求めるのであれば今回のように EC2 を利用することにメリットがあります。ストレージサービスにおいても EBS や S3 の他にも多様なサービスがあるので、要件や仕様によって適切なサービスを選択することが重要になります。
製品・サービスに関するお問い合わせ
03-5979-2701

お問い合せ受付時間 月 - 金 10:00 - 17:00

メールフォームでのお問い合わせ

ページトップへ