PG-REXが上手く起動しないときの解決策

※ブログからの移植です。(2019/11/27投稿)


業務でPG-REX(var11)を触ったので、自分用のtipsをまとめます。
エラーメッセージは記憶で書いてるので、若干異なる可能性があります。  

PG-REXとは
--------

* postgresqlでクラスタ構成を組むときに使う補助アプリケーションです。
* クラスタ管理するpacemaker/corosyncに加えDB回りの補助をしてくれます。

* [pacemaker応援キャラクター](https://linux-ha.osdn.jp/wp/archives/121)が地味に豪華な件。[入門動画(1話のみ)](https://linux-ha.osdn.jp/wp/archives/712)もある
* postgresqlの同期レプリケーション使用、障害時に自動フェールオーバー
* ※AWSとかのマネージドサービスだとサードパーティのクラスタツールを使わない選択ができます。

参考になる情報
-------

大体この辺を見れば仕組みや使い方が分かります。

* [公式ドキュメント](https://ja.osdn.net/projects/pg-rex/releases/p14960)(v9.5だけど..)11.0の最新版はパッケージ内にあるかも？
* [PG-REXで学ぶPacemaker運用の実例](https://www.slideshare.net/kazuhcurry/pgrexpacemaker)
* [Pacemaker + PostgreSQL レプリケーション構成(PG-REX)のフェイルオーバー高速化](https://www.slideshare.net/kazuhcurry/osc2014-kyoto)
* [PostgreSQLとPacemakerによる高可用ソリューション PG-REX 9.6 の構築](https://qiita.com/U_ikki/items/5698e2c774f7882e31c0)

PG-REXが起動しない！
-------------

### Step1:masterが起動しない

正常パターン ※root権限での実行が必要です。

    # pg-rex_master_start
    root@192.168.2.2's password:
    パスワードが入力されました
    1. Pacemaker および Corosync が停止していることを確認
    ...[OK]
    2. 稼働中の Master が存在していないことを確認
    ...[OK]
    3. 起動禁止フラグの存在を確認
    ...[OK]
    4. /var/lib/pacemaker/cib 配下の cib ファイルを削除
    ...[OK]
    5. Pacemaker 起動
    ...[OK]
    6. crm ファイルの反映
    ...[OK]
    7. Master の起動確認
    ...[OK]
    ノード(pgrex01)が Master として起動しました


    # crm_mon -fA
    省略
    (masterサーバがonlineと表示されること)

#### slaveとの接続は大丈夫か？

    1. Pacemaker および Corosync が停止していることを確認
    ...[OK]
    2. 稼働中の Master が存在していないことを確認
    ...[NG]相手ノードのSSH接続に失敗

* rootアカウントで直接SSH接続ができるか？
* 設定ファイル「IPアドレスやホスト名回り」を再確認

    * インポートするcrmファイル
    * /etc/corosync/corosync.confなど

#### postgresqlのみで起動するか？

    7. Master の起動確認
    ...[NG]600秒経ちましたがPostgreSQL が起動していません

待った挙句失敗という悲しいパターンです。

大体postgresqlを起動すると失敗する

    # su - postgresql
    postgres$ pg_ctl start
    サーバの起動完了を待っています....
    ：
    サーバ起動失敗

上記のよう起動失敗となります。PG-REXの問題ではなくpostgresqlの問題となります。  
postgresql.logなどを確認しましょう。
※初期設定では、PGDATA/pg_log/以下に「postgresql-%Y-%m-%d_%H%M%S.log」のファイル名でログファイルが生成されます。  

下記のようになれば、解決できる可能性は高いです。  

    # su - postgresql
    postgres$ pg_ctl start
    サーバの起動完了を待っています....
    ：(略)
    完了
    サーバ起動完了
    postgres$ pg_ctl stop
    サーバ停止処理の完了を待っています....完了
    サーバは停止しました

### Step2:slaveが起動しない

なんだかんだmasterは上手く起動しやすいです。はまるのがslaveです。

#### postgresqlのみで起動するか？

これはmasterと同じです。

#### masterのwalが進んでいるか？

    4. /var/lib/pacemaker/cib 配下の cib ファイルを削除
    ...[NG]slaveのwalアーカイビングがmasterより進んでいます
    (receive-walが...だったような気もする...)

最初これでかなりはまったのですが、結論を言うとmasterのDBに動きが無いとこうなる可能性があります。
余談ですがDBバックアップのbarmanもDBに動きが無いと上手くいかないケースがあります  

##### 対策：DBを進める(walファイルを作成)

* (システムが動いていてDBが進むのであれば)少し時間を置く ※大体検証時でDBに動きが無いときが多いと思いますが。
* psqlにて[checkpoint;](https://www.postgresql.jp/document/11/html/sql-checkpoint.html)を実行

    * やってもダメな時もあったのが微妙なところ...

* [pgbench](https://www.postgresql.jp/document/11/html/pgbench.html)を実行
* testテーブルにデータをinsertしまくる(邪道感)
* 参考[PostgreSQL WALログの仕組みとタイミングを理解したい](https://qiita.com/kimullaa/items/e7bed14aaa680126b81a)
* 他にも良い手があると思います。。。

---

おわりに。
-----

これでDBのクラスタ構成もどんとこいです(震え声) 
クラウドのマネージドサービスだと考えなくてもよいのがいいところですよね。(walの仕組みとかは知っておいて損じゃないと思います。)
postgresqlのバージョンが上がり、レプリケーションの仕組みが簡素になったことで、PG-REXもシンプルになってきたようです。