PowerGres

技術記事 | PowerGres Plusで障害直前の状態に復旧してみよう

PowerGres体験記

はじめに

本稿ではPowerGres Plus独自のWAL二重化機能について紹介します。

WAL二重化機能は障害発生時のデータ復旧に関わる機能で、PostgreSQL のWALアーカイブ機能だけではカバーできない、障害発生直前の状態までの復旧を可能とします。

目次

1. WAL二重化とは

まず、PostgreSQL はベースバックアップと、WALアーカイブを利用したリカバリが可能です。これはPITRと呼ばれ、バックアップされた範囲であれば指定した時刻の状態にデータベースを戻すことが可能です。ベースバックアップはpg_basebackup コマンドで作成でき、WALアーカイブはデータベースが使用している先行書き込みログである WALをPostgreSQL サーバが定期的にコピーして作成されます。

ただ、これにはひとつ問題点があります。

WALアーカイブは、定期的に作成されるとはいえ、常に最新とは限らないからです。

例えば、データベースが更新された直後にデータベースのディスクに障害が発生してWALが壊れた場合、WALアーカイブにこの更新情報は残らない場合があります。

対して、WAL の二重化では、データベースが使用している WAL と全く同じ WAL を別の領域に出力する機能です。 これにより、障害発生時にデータベースとともに使用中の WAL が失われても、バックアップ格納ディレクトリに保管している、二重化された WAL を使用して、障害直前の最新状態に復旧する事が可能となります。

つまり、「ベースバックアップ」と、「WALアーカイブ」に加えて、「二重化されたWAL」を全て利用して復旧するということです。

2. バックアップ設定

ここからは実際にPowerGres Plus でWAL二重化を用いたバックアップの設定を行っていきます。本記事ではPowerGresのGUI管理ツールであるPowerGres Administration Toolを用いて設定を行います。

まず、障害復旧に必要なWALアーカイブと二重化されたWALの2つは、サーバ作成時に「バックアップディレクトリ(オプション)」で指定したバックアップディレクトリの配下にサーバ起動後、自動的なバックアップが開始されます。

(サーバの作成については「PowerGres 体験記 インストールしてみよう」を参考にしてください。)

このとき、バックアップディレクトリはデータディレクトリと異なるディスクに指定することで、ディスク障害が発生した場合、共倒れとなるリスクを減らすことができます。

新しいサーバ 画面

続いて、ベースバックアップはオンラインバックアップを実行することで作成できます。

オンラインバックアップはPowerGres Administration Tool から管理できます。

左のメニューから「バックアップ・リストア」を選択します。

バックアップ・リストアのジョブの一覧が表示されます。「新しいオンラインバックアップジョブ」を選択します。

バックアップ・リストア 画面

新しいオンラインバックアップジョブの入力項目が表示されます。

新しいオンラインバックアップジョブ 画面

ジョブ名とバックアップを取得するユーザ「postgres」のパスワードを入力して「作成」します。

なお定期的にベースバックアップを作成したい場合、「スケジュールを有効にする」をチェックして「頻度」「開始時間」を入力すれば可能です。

新しいオンラインバックアップジョブ 画面 入力後

サーバの再起動が求められるので、「OK」を選択します。

新しいオンラインバックアップジョブ 確認画面「サーバを再起動してもよろしいですか?」

ジョブの一覧が表示されます。オンラインバックアップのジョブとして追加されていることが確認できます。

ベースバックアップを作成するために「実行」を選択します。

バックアップ・リストア 画面 「成功!新しいバックアップジョブが正常に作成されました。」メッセージ表示

ベースバックアップの作成が開始します。「最新の情報に更新」を選択して進捗を表示します。

バックアップジョブを表示 画面 「成功!バックアップジョブが正常に開始されました。」メッセージ表示

ベースバックアップの作成が稼働中と表示されます。再度「最新の情報に更新」を選択して進捗を表示します。

バックアップジョブを表示 画面ベースバックアップの作成「稼働中」の表示

ベースバックアップの作成が成功と表示されます。(タイミングによっては稼働中を経由せずに成功と表示される場合もあります。)

バックアップジョブを表示 画面 ベースバックアップの作成「成功」の表示

ベースバックアップも、WALアーカイブや二重化されたWALと同様にバックアップディレクトリの配下に作成されます。

これで「ベースバックアップ」、「WALアーカイブ」、「二重化されたWAL」の全てが同じディレクトリ配下に揃った状態になります。

3. 障害発生シミュレーション

ここからは障害復旧を以下手順でシミュレーションします。

  1. 復旧対象となる環境を作成
  2. ベースバックアップを作成
  3. WALアーカイブを進めた後にテーブルを更新
  4. その直後にサーバを強制停止(障害発生をシミュレート)
  5. 二重化されたWALを利用することで最後の更新まで復旧できることを確認

まずは、データベースを「PowerGres 体験記 インストールしてみよう」と同じ構成

SET search_path = testschema;
SELECT * FROM employee;

で作成します。サーバは「powergresplus」と名前を付けて作成して、データベース、スキーマ、テーブルを作成した結果、下記のような表示となります。

SQL問い合わせを実行(psql) 画面

ベースバックアップを作成します。先ほどの「オンラインバックアップ」の章で説明した内容を実施します。すでに一度実行し、オンラインバックアップジョブが一覧に表示される場合は、「実行」を選択して再度作成してください。

バックアップジョブを表示 画面 ベースバックアップの作成「成功」の表示

データベースを更新します。

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();
SQL問い合わせを実行(psql) 画面

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;
SQL問い合わせを実行(psql) 画面

障害発生をシミュレートするためにここでは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}

4. 障害復旧

ここからはPowerGres Administration Toolを用いて、障害発生後のデータベース復旧を試みます。

PowerGres Administration Tool の左のメニューから「サーバ」を選択します。

復旧対象となる「powergresplus」が停止していることが確認できます。

「新しいサーバ」を選択します。

サーバ 画面

新しいサーバの入力項目が表示されます。

ここでの作成方法は「ベースバックアップからデータベースクラスタを復旧」を選択します。各項目の入力後、「次へ」を選択します。

新しいサーバ 画面

リカバリの入力項目が表示されます。

リカバリ 画面

リカバリ元のバックアップディレクトリに障害が発生したサーバのバックアップディレクトリを入力して「次へ」を選択します。

リカバリ 画面 リカバリ元のバックアップディレクトリ 入力後

リカバリの新たな入力項目が表示されます。

リカバリ画面 リカバリの新たな入力項目 表示後

今回はスーパーユーザ名だけを入力して「次へ」を選択します。

リカバリ 画面 スーパーユーザ名 入力後

サーバの一覧が表示されます。追加されていることが確認できます。

サーバ 画面「成功!新しいサーバが正常に追加されました。リカバリを完了するためにサーバを起動してください。」メッセージ表示

「起動」を選択します。

サーバ 画面「成功!サーバが正常に起動しました。」メッセージ表示

起動した「powergresplus-restore」サーバに接続して下記SQLを実行すると、最後のWALアーカイブより後に実行された最後の更新データまで復旧できていることが確認できます。

SET search_path = testschema;
SELECT * FROM employee;
SQL問い合わせを実行(psql) 画面

5. まとめ

PostgreSQLの標準機能のみでは、障害発生直前の更新データを完全に復旧することはできず、データ損失のリスクが残ります。

一方、ここまで示してきたとおり、PowerGres PlusのWAL二重化機能を用いれば障害直前の状態まで復旧することが可能です。データの確実な保全が求められる業務システムにおいて、有事の備えとして極めて有効な機能です。

PowerGres Plusの採用を、ぜひご検討ください。

製品・サービスに関するお問い合わせ
03-5979-2701

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

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

ページトップへ