PostgreSQLのレプリケーション環境構築

2018.03.08

こんにちは、YDCのミッツです。
今回はPostgreSQLでのストリーミング・レプリケーション環境を構築する手順をご紹介します。

ストリーミング・レプリケーション

そもそもレプリケーションとはデータベースのレプリカを作成することを言います。
レプリケーションの主な目的は次の二つです。

高可用性
データベースサーバを冗長化することでシステムの稼働率を高める
負荷分散
負荷を分散することで処理性能を向上させる

PostgreSQLでレプリケーション環境を構築する手順はいくつかありますが、ここでは9.0から実装されているストリーミング・レプリケーションを紹介します。
ストリーミング・レプリケーションはマスタサーバで生成されたWAL(トランザクションログ)をデータベースの操作単位でスタンバイサーバに転送する機能です。
スタンバイサーバでは転送されたWALを適用することでマスタサーバのデータベースを再現します。
ストリーミング・レプリケーションで構築したスタンバイサーバはホット・スタンバイ機能と組み合わせることでスタンバイサーバを参照系として利用することができます。

postgres_2_1.jpg
ホット・スタンバイ機能による負荷分散

また、スタンバイサーバから他のスタンバイサーバにリレーのようにWALを転送するカスケード・レプリケーション構成を構築することができます。

postgres_2_2.jpg
カスケード・レプリケーション構成

構築の準備

前提

今回は基本的なレプリケーション環境を構築することを目的とし次の前提で構築を進めます。

  • PostgreSQLのバージョンはマスタ、スタンバイ共に9.6
  • スタンバイサーバは参照可能(ホット・スタンバイ)
  • レプリケーションの方式は同期レプリケーションとする
  • WALアーカイブはしない

同期レプリケーションとはスタンバイサーバのディスクに書き込みが行われた時点でコミットするレプリケーションの方式です。

環境

今回準備した環境は次の通りです。

ホスト名 OS IPアドレス 説明
MASTER Windows Server 2012 R2 Standard 192.168.1.1 マスタサーバ
SLAVE1 Windows Server 2012 R2 Standard 192.168.1.2 スタンバイサーバ

構築の流れ

続いて大まかな構築の流れを確認しておきます。
構築は次の手順に沿って進めていきます。

  1. 1.レプリケーション用ユーザの作成
  2. 2.マスタサーバのパラメータ設定
  3. 3.スタンバイサーバでマスタサーバのベースバックアップ取得
  4. 4.スタンバイサーバのパラメータ設定
  5. 5.スタンバイサーバの起動

レプリケーション用ユーザの作成

まずはマスタサーバでレプリケーション用ユーザを作成します。
次のコマンドを実行してください。

DOS>hostname
MASTER
DOS>psql -U postgres -c "CREATE USER rep_testusr WITH REPLICATION"
ユーザ postgres のパスワード:
CREATE ROLE

マスタサーバのパラメータ設定

続いて設定ファイルを編集することでマスタサーバのパラメータなどを設定します。
編集するファイルは次の二つです。

  • postgresql.conf
  • pg_hba.conf

これらのファイルは両方ともデフォルトで次のフォルダ配下に配置されています。
<PostgreSQLインストールフォルダ>\data\

ストリーミング・レプリケーションに関連するパラメータはいくつかありますが、
ここでは設定必須のパラメータのみ設定します。
それぞれのファイルで設定するパラメータは次の通り。

postgresql.conf

wal_level
WALの出力レベルを指定します。
選択できる出力レベルは9.5までminimal、archive、hot_standby、logicalの4段階でしたが、
9.6からarchiveとhot_standbyが統合されminimal、replica、logicalの3段階になっています。
ストリーミング・レプリケーションを構成するにはminimal以外に設定します。
今回は9.6なのでreplicaに設定します。
max_wal_senders
WALを転送するスタンバイサーバの最大数を指定します。
ただし、max_connections以上の値は指定できません。
今回、スタンバイサーバの数は1つです。しかし、今後の拡張性なども考え5に設定します。
なお、max_connectionsはデフォルトで100です。
wal_keep_segments
pg_xlog配下に保持する最小WALセグメント数を指定するパラメータです。
レプリケーション遅延が発生した場合、マスタ側で転送前のWALが削除されることを防ぐために設定します。
今回は8に設定します。
synchronous_standby_names
同期レプリケーション対象のスタンバイサーバを指定します。
カンマ区切りで複数指定でき、リスト内で先頭に書かれているサーバが同期レプリケーション対象となります。
同期レプリケーション対象のサーバと通信が途切れた場合、リスト内で次に指定されたサーバが同期レプリケーション対象に変わります。
*を指定した場合は全てのスタンバイサーバが対象となります。ここでは*を指定します。

pg_hba.conf

このファイルではスタンバイサーバからマスタサーバのデータベースへの接続を許可する設定を追加します。
作成したレプリケーション用ユーザにreplicationという名称の仮想データベースへの接続権限を与えます。
IPアドレスにはスタンバイ・サーバのアドレスを指定してください。
METHODはtrustとします。
trustは接続を無条件で許可する方式で、PostgreSQLデータベースサーバに接続できる全てのユーザが、任意のPostgreSQLユーザとしてパスワードなしで接続可能になります。

# TYPE DATABASE USER ADDRESS METHOD

# IPv4 local connections:
host all all 127.0.0.1/32 md5
host replication rep_testusr 192.168.1.2/24 trust

スタンバイサーバでマスタサーバのベースバックアップ取得

マスタサーバの設定が出来たらスタンバイサーバでマスタサーバのベースバックアップを取得します。
バックアップの取得前にPostgreSQLを一旦停止し、スタンバイサーバのデータ用フォルダを空にしておきます。
今回はWindows環境なのでPostgreSQLを停止するにはサービスの一覧画面から「postgresql-x64-9.6」という名称のサービスを停止します。
サービスを停止したらOSコマンドでデータ用フォルダの中身を削除します。
本環境では全てデフォルト設定でインストールしたためデータ用フォルダは次のパスになっています。
C:\Program Files\PostgreSQL\9.6\data
準備が整ったらスタンバイサーバで次のコマンドを実行しバックアップを取得します。

DOS>hostname
SLAVE1
DOS>pg_basebackup -R -h MASTER -p 5432 -U rep_testusr -D "C:\Program Files\PostgreSQL\9.6\data"
NOTICE: WAL アーカイブが有効になっていません。要求されたすべての WAL セグメントが別の方法でコピーされ、バックアップが完了できることを確認してください。

「NOTICE:」以下のメッセージはWALアーカイブを有効にしていないために表示されています。
無視して問題ありません。
pg_basebackupコマンドは9.1で追加されたコマンドで簡単かつ高速にベースバックアップを取得できます。
また、-Rを付けて実行することでスタンバイサーバのみに必要な設定ファイルrecovery.confをバックアップ取得時に作成することが可能です。

スタンバイサーバのパラメータ設定

バックアップを取得したらスタンバイサーバのパラメータを設定します。
編集するファイルは次の二つです。

  • postgresql.conf
  • recovery.conf

今回pg_basebackup実行時-Rを付けたためrecovery.confは作成済みですが、
存在しない場合はテキストエディタで作成する必要があります。

postgresql.conf

synchronous_standby_names
マスタサーバの設定を引き継いでコピーされています。
スタンバイサーバで同期レプリケーション対象を指定することはありません。
不要な設定なのでコメントアウトして無効にします。
hot_standby
スタンバイで問い合わせ処理を受け付け可能にするか設定します。
今回は参照可能にするためonに設定します。

recovery.conf

最低限必要な項目は下記ですが、pg_basebackupの-Rオプションで作成されたrecovery.confでは
これらの項目は設定済みのため特に編集する必要はありません。

standby_mode
PostgreSQLがスタンバイモードで起動することを指定する項目です。
onに設定します。
primary_conninfo
マスタサーバへの接続情報を記載します。

スタンバイデータベースの起動

ここまででストリーミング・レプリケーションの準備は整いました。
あとはスタンバイデータベースを起動すれば構築は完了です。

DOS>pg_ctl start -D "C:\Program Files\PostgreSQL\9.6\data"
サーバは起動中です。
2018-02-07 15:05:07 JST LOG: ログ出力をログ収集プロセスにリダイレクトしています
2018-02-07 15:05:07 JST ヒント: ここからのログ出力はディレクトリ"pg_log"に現れます。

マスタへのデータ挿入、スタンバイでの参照

環境が構築できました。簡単なテストとしてマスタへのデータ挿入がスタンバイに反映されることを確認してみます。

DOS>hostname
MASTER
DOS>psql -U postgres
ユーザ postgres のパスワード:
psql (9.6.6)
"help" でヘルプを表示します.

postgres=# create table test_tbl(
postgres(# test_col date
postgres(# );
CREATE TABLE
postgres=# insert into test_tbl values(now());
INSERT 0 1
postgres=# select * from test_tbl;
test_col
------------
2018-02-13
(1 行)

マスタサーバにデータを挿入できました。
続いてスタンバイサーバにデータが連携されているか確認します。
また、念のため、書き込みできないことを確認しておきます。

DOS>hostname
SLAVE1
DOS>psql -U postgres
ユーザ postgres のパスワード:
psql (9.6.6)
"help" でヘルプを表示します.

postgres=# select * from test_tbl;
test_col
------------
2018-02-13
(1 行)

postgres=# insert into test_tbl values(now());
ERROR: リードオンリーのトランザクションでは INSERT を実行できません

上の結果からスタンバイサーバでデータを参照できること、データが反映されていることを確認できます。
また、書き込みもできないよう制御されているので、スタンバイサーバはホット・スタンバイとして正常に機能していると言えそうです。

フェイルオーバー

続いてフェイルオーバーを試してみます。
スタンバイサーバをマスタに昇格するには9.1で追加されたpg_ctl promoteコマンドが便利です。

DOS>hostname
SLAVE1

DOS>pg_ctl promote -D "C:\Program Files\PostgreSQL\9.6\data"
サーバを昇進中です。

スタンバイサーバが書き込み可能になっているか試します。


DOS>hostname
SLAVE1

DOS>psql -U postgres
ユーザ postgres のパスワード:
psql (9.6.6)
"help" でヘルプを表示します.

postgres=# insert into test_tbl values(now());
INSERT 0 1
postgres=# select * from test_tbl;
test_col
------------
2018-02-13
2018-02-13
(2 行)

昇格前は書き込みできませんでしたが、昇格後は書き込み可能になっています。
なお、この状態でマスタサーバに書き込みしてしまうとスタンバイサーバにデータを反映させられないため、
トランザクションが完了せず、待ちが発生してしまいますのでご注意ください。

まとめ

ストリーミング・レプリケーションのご紹介は以上になります。
リアルタイムに同期でき、常に参照可能なスタンバイサーバを標準機能で構築できる機能は魅力的ではないでしょうか。
あまり時間もかかりませんので今後PostgreSQLを使用する予定があれば一度お試しください。

Standby Expressに関するお問合わせ

  • TEL 042-333-6217
  • FAX 042-352-6101
  • LINE
  • Mail