PostgreSQLでOracle Data Guard 並みの高可用性を実現！PG-REXを使おう！

この記事は [NTTテクノクロス Advent Calendar 2018](https://qiita.com/advent-calendar/2018/ntt-tx) の23日目の記事です。

# はじめに
こんにちは！NTTテクノクロスで [PostgreSQLを中心とした業務をこなしています](https://www.ntt-tx.co.jp/products/osscloud/service/migration/?utm_source=qiita&utm_medium=ac2018&utm_campaign=23) 、中村です。
みなさんの PostgreSQLは今日も元気でしょうか？

システムの導入や移行などでデータベース製品を選定する際には、その製品がどの程度の可用性を担保できるのか、気にしますよね？
もちろん、PostgreSQLにも可用性を高めるためのやり方というものが存在します。

というわけで、今回は、そんなPostgreSQLの可用性を担う、[PG-REX](https://ja.osdn.net/projects/pg-rex/) ソリューション について紹介していきたいと思います！

# PG-REXとは？
PG-REXは、以下の製品の機能を組み合わせたソリューションです。

* PostgreSQL本体の**<font color=red>同期レプリケーション機能</font>**
* Pacemakerの**<font color=red>障害監視およびフェイルオーバ機能</fnt>**

PG-REXを導入することで、PostgreSQLの可用性を高めることができます。

また、このソリューションで使用する PostgreSQL、PacemakerともにOSS製品です。

PostgreSQL本体はコミュニティが提供している PostgreSQLのパッケージをそのまま使用しますので、PostgreSQL本体のバージョンアップは随時適用できます。

## データを保護する！
**★ PG-REXでは、データベースのデータを2重化することで、データの保護を行います。**

PG-REXは「マスタ」「スレーブ」の2台のPostgreSQLで構成し、データの更新ができるのは「マスタ」のPostgreSQLのみです。「スレーブ」に対してデータの更新はできません。
「マスタ」に対して発生した更新は、PostgreSQLのデータ同期機能によって「スレーブ」に反映されます。
![pgrex_001.png](https://qiita-image-store.s3.amazonaws.com/0/318431/ab7bcd59-c2aa-6601-2e81-f90dcf974b2a.png)

これによって、「マスタ」と「スレーブ」のデータベースは常に同じデータを保持するように維持されます。

## 障害発生時に、自動で切り替える！
**★ PG-REXでは、障害が発生してもPostgreSQLを継続利用できます。**

PG-REXでは、「マスタ」のPostgreSQLまたは「マスタ」のサーバに障害が発生した場合に、自動的に障害を検知し、「スレーブ」を「新マスタ」に切り替えます。
クライアントからの接続先はVIP（仮想IP）で提供するため、サーバが切り替わっても、クライアントからの接続先は変わりません。
![pgrex_002.png](https://qiita-image-store.s3.amazonaws.com/0/318431/122029a7-b975-959f-e053-92c606be6334.png)

障害を検知するのは、Pacemakerです。
Pacemakerでは、次の障害を検知し、自動的に「マスタ」を切り離し「スレーブ」を「新マスタ」に切り替えます。

## PG-REXで検知する障害とは？
PG-REX で検知する障害は以下のとおりで、障害を検知するとフェイルオーバーします。

* ノード故障(停止)
* ディスク故障
* PostgreSQL停止
* LAN故障(接続障害)

LAN故障の場合は挙動のバリエーションがあり、クライアントからPostgreSQLへのアクセスに用いる「S-LAN（運用LAN）」の障害の場合は、フェイルオーバーを実施しますが、PG-REXのマスタノード・スレーブノード間でのみ使用するLANについては、障害を検知してもフェイルオーバーしません。
これは、「S-LAN」が故障してしまうと、PostgreSQLのサービスが使用できないためです。

PG-REXのマスタノード・スレーブノード間でのみ使用するLANとは、Pacemakerがお互いの死活監視を行うために使用する「IC-LAN（インターコネクトLAN）」と、PostgreSQLが同期レプリケーションのデータ転送ために使用する「D-LAN（DBレプリケーションLAN）」のことを指します。

# Oracle Data Guard と PG-REX を比較してみた
PG-REXがリリースされて、個人的に最も大きなメリットとして感じたのは、「Oracle Data Guard を導入しているシステムの移行先として有力な候補ができた！」ということです。

ここで、Oracle Data Guard と PG-REX をちょっと比較してみましょう。

**表：Oracle Data Guard と PG-REX の機能比較**

|比較項目|Oracle Data Guard|PG-REX|
|--------|------------------|--------|
|**<font color=blue>データの同期</font>**|同期・非同期|同期|
|**<font color=blue>スレーブDBの参照</font>**|可能(参照専用)|可能(参照専用)|
|**<font color=blue>障害検知・切替え</font>**|自動|自動|
|**<font color=blue>複数のスレーブ</font>**|可能|可能（※１）|
|**<font color=blue>ディザスタリカバリ</font>**|可能|可能（※２）|

Oracle Data Guard を導入する主要な目的は、データベースノードの障害発生時に、サービスのダウンタイムを短くすることなので、Oracle Data Guard と PG-REX の機能はほぼ同等といえます。

Data Guard と同等の機能を利用できるなら、今までは難しいと思っていた運用用件もクリアでき、Oracle から PostgreSQL への移行も視野に入る可能性も広がるのではないでしょうか？

※１
複数のスレーブ（マルチスレーブ）の構成はPostgreSQL本体が提供する機能です。

※２
PG-REXのスレーブから、遠隔地のスレーブにカスケードレプリケーションします。
カスケードレプリケーションはPostgreSQL本体が提供する機能です。

# まとめ
今回の記事ではPG-REXの概要を紹介しました。

PG-REX導入の際には、障害検知までの時間など、いくつかのパラメータのチューニングが必要ですが、数年間にわたる利用実績もあり、安心してオススメできるソリューションです。

PG-REXの資材やドキュメントは以下からダウンロードできますので、詳細を確認したい場合は、ドキュメントを参照してみてください。
[PG-REX プロジェクト日本語トップページ - OSDN] (https://ja.osdn.net/projects/pg-rex/)

それでは！