本稿ではPowerGres Plus独自のWAL二重化機能について紹介します。
WAL二重化機能は障害発生時のデータ復旧に関わる機能で、PostgreSQL のWALアーカイブ機能だけではカバーできない、障害発生直前の状態までの復旧を可能とします。
まず、PostgreSQL はベースバックアップと、WALアーカイブを利用したリカバリが可能です。これはPITRと呼ばれ、バックアップされた範囲であれば指定した時刻の状態にデータベースを戻すことが可能です。ベースバックアップはpg_basebackup コマンドで作成でき、WALアーカイブはデータベースが使用している先行書き込みログである WALをPostgreSQL サーバが定期的にコピーして作成されます。
ただ、これにはひとつ問題点があります。
WALアーカイブは、定期的に作成されるとはいえ、常に最新とは限らないからです。
例えば、データベースが更新された直後にデータベースのディスクに障害が発生してWALが壊れた場合、WALアーカイブにこの更新情報は残らない場合があります。
対して、WAL の二重化では、データベースが使用している WAL と全く同じ WAL を別の領域に出力する機能です。 これにより、障害発生時にデータベースとともに使用中の WAL が失われても、バックアップ格納ディレクトリに保管している、二重化された WAL を使用して、障害直前の最新状態に復旧する事が可能となります。
つまり、「ベースバックアップ」と、「WALアーカイブ」に加えて、「二重化されたWAL」を全て利用して復旧するということです。
ここからは実際にPowerGres Plus でWAL二重化を用いたバックアップの設定を行っていきます。本記事ではPowerGresのGUI管理ツールであるPowerGres Administration Toolを用いて設定を行います。
まず、障害復旧に必要なWALアーカイブと二重化されたWALの2つは、サーバ作成時に「バックアップディレクトリ(オプション)」で指定したバックアップディレクトリの配下にサーバ起動後、自動的なバックアップが開始されます。
(サーバの作成については「PowerGres 体験記 インストールしてみよう」を参考にしてください。)
このとき、バックアップディレクトリはデータディレクトリと異なるディスクに指定することで、ディスク障害が発生した場合、共倒れとなるリスクを減らすことができます。
続いて、ベースバックアップはオンラインバックアップを実行することで作成できます。
オンラインバックアップはPowerGres Administration Tool から管理できます。
左のメニューから「バックアップ・リストア」を選択します。
バックアップ・リストアのジョブの一覧が表示されます。「新しいオンラインバックアップジョブ」を選択します。
新しいオンラインバックアップジョブの入力項目が表示されます。
ジョブ名とバックアップを取得するユーザ「postgres」のパスワードを入力して「作成」します。
なお定期的にベースバックアップを作成したい場合、「スケジュールを有効にする」をチェックして「頻度」「開始時間」を入力すれば可能です。
サーバの再起動が求められるので、「OK」を選択します。
ジョブの一覧が表示されます。オンラインバックアップのジョブとして追加されていることが確認できます。
ベースバックアップを作成するために「実行」を選択します。
ベースバックアップの作成が開始します。「最新の情報に更新」を選択して進捗を表示します。
ベースバックアップの作成が稼働中と表示されます。再度「最新の情報に更新」を選択して進捗を表示します。
ベースバックアップの作成が成功と表示されます。(タイミングによっては稼働中を経由せずに成功と表示される場合もあります。)
ベースバックアップも、WALアーカイブや二重化されたWALと同様にバックアップディレクトリの配下に作成されます。
これで「ベースバックアップ」、「WALアーカイブ」、「二重化されたWAL」の全てが同じディレクトリ配下に揃った状態になります。
ここからは障害復旧を以下手順でシミュレーションします。
まずは、データベースを「PowerGres 体験記 インストールしてみよう」と同じ構成
SET search_path = testschema; SELECT * FROM employee;
で作成します。サーバは「powergresplus」と名前を付けて作成して、データベース、スキーマ、テーブルを作成した結果、下記のような表示となります。
ベースバックアップを作成します。先ほどの「オンラインバックアップ」の章で説明した内容を実施します。すでに一度実行し、オンラインバックアップジョブが一覧に表示される場合は、「実行」を選択して再度作成してください。
データベースを更新します。
SET ROLE testuser; SET search_path = testschema; UPDATE employee SET position = 'staff' WHERE number = 1851139; INSERT INTO employee VALUES (2101027, 'PITR 最新状態太郎', 'chief', '2022-06-17'); SELECT * FROM employee;
WALアーカイブを強制的に作成するためにpg_switch_wal()を実行します。
SELECT pg_switch_wal();
WALアーカイブを進めた直後にデータベースを更新します。
SET ROLE testuser; SET search_path = testschema; UPDATE employee SET position = 'staff' WHERE number = 1782822; INSERT INTO employee VALUES (2101028, 'PITR 最新状態次郎', 'chief', '2023-04-17'); DELETE FROM employee WHERE number = 2081577; SELECT * FROM employee;
障害発生をシミュレートするためにここではPowerGres Plus を停止し、データディレクトリを別名に移動することで、障害発生とします。
[postgres@rocky9 ~]$ /opt/powergresplus16/bin/pg_ctl -m immediate -D /var/lib/pgsql/data-powerplus16.10/ stop
サーバー停止処理の完了を待っています....完了
サーバーは停止しました
[postgres@rocky9 ~]$ mv -i /var/lib/pgsql/data-powerplus16.10{,-delete}
ここからはPowerGres Administration Toolを用いて、障害発生後のデータベース復旧を試みます。
PowerGres Administration Tool の左のメニューから「サーバ」を選択します。
復旧対象となる「powergresplus」が停止していることが確認できます。
「新しいサーバ」を選択します。
新しいサーバの入力項目が表示されます。
ここでの作成方法は「ベースバックアップからデータベースクラスタを復旧」を選択します。各項目の入力後、「次へ」を選択します。
リカバリの入力項目が表示されます。
リカバリ元のバックアップディレクトリに障害が発生したサーバのバックアップディレクトリを入力して「次へ」を選択します。
リカバリの新たな入力項目が表示されます。
今回はスーパーユーザ名だけを入力して「次へ」を選択します。
サーバの一覧が表示されます。追加されていることが確認できます。
「起動」を選択します。
起動した「powergresplus-restore」サーバに接続して下記SQLを実行すると、最後のWALアーカイブより後に実行された最後の更新データまで復旧できていることが確認できます。
SET search_path = testschema; SELECT * FROM employee;
PostgreSQLの標準機能のみでは、障害発生直前の更新データを完全に復旧することはできず、データ損失のリスクが残ります。
一方、ここまで示してきたとおり、PowerGres PlusのWAL二重化機能を用いれば障害直前の状態まで復旧することが可能です。データの確実な保全が求められる業務システムにおいて、有事の備えとして極めて有効な機能です。
PowerGres Plusの採用を、ぜひご検討ください。