KITA Eng.

北海道でサーバー技術者として歩み出したひとが綴るblog。

UbuntuでPostgreSQLのストリーミングレプリケーションをするときの微妙にはまる!?落とし穴

PostgreSQL 9.5でストリーミングレプリケーションの構築を試してみました。いわゆるDBのマスター&スレーブ構成ってやつでしょうか。 これ→25.2. ログシッピングスタンバイサーバ

その作業の中で、普通ははまらないであろう落とし穴に落ちたので記録しておきます。

僕の落ちた落とし穴に落ちる可能姓のある人

僕が落ちた落とし穴に落ちる可能姓があるのは、以下の様な状況の人です。

  • OSがUbuntu
  • PostgreSQLをパッケージでインストールしている
  • 複数のバージョンのPostgreSQLがインストールされている
    (しかもマスタースレーブ構成を構築するPostgreSQLが一番最初にインストールしたバージョンじゃない)
  • /etc/postgresql-common/user_clustersで使用するPostgreSQLのバージョンを指定していない

ということが重なると今回の落とし穴に落ちる可能姓が大きいです。

はまった落とし穴

PostgreSQL 9.4での情報ですが、以下の方法の通り進めていきました。 hkou.hatenablog.com

ちなみに、Let's Postgresのページでも同様のやり方説明がありました。 lets.postgresql.jp

マスター側の設定は何事もなく終了し、「ベースバックアップをスレーブに転送する」をしようと、

user@localhost:~$ sudo su - postgres
postgres@localhost:~$ pg_basebackup -h exsample.com -U replicationuser -D /var/lib/pgsql/9.5/main/ -P -v --xlog
Password:
pg_basebackup: incompatible server version 9.5.1

という挙動を示してくれました。 pg_basebackup: incompatible server version 9.5.1

何事ぞ。

ejje.weblio.jp

どうやらバージョンが違うといっているようですが、マスター側のDBは9.5.1だし、スレーブ側でも、

postgres@localhost:~$ psql --version
psql (PostgreSQL) 9.5.1

といわれます。 スレーブDB側の環境では確かに9.4、9.5の二つが動いていますが・・・。一応、Google先生に問い合わせてみるもそれらしい回答がない・・・。困ったなぁと思ったときに、そういえばUbuntuのPostgrSQLってなんだか特殊なんだったということを思い出しました。

lets.postgresql.jp

上にあるように複数バージョンのPostgreSQLを運用しやすいように?なんかうまいことやってくれているらしいのですが、これが時にやっかいごとを招くようです。

落とし穴からの飛び出し方

落とし穴に入っているかは、このコマンドを叩いてみれば一発です。pg_basebackupのバージョンを確認してみます。pg_basebackupの説明ページでほとんど使うことはないだろうけどみたいに紹介されているオプション-vが役立つときです。

postgres@localhost:~$ pg_basebackup -v
pg_basebackup (PostgreSQL) 9.4.6

なんで9.4.6なの!?

理由はちょっと置いといて、Ubuntu で PostgreSQL を使ってみよう(続編) — Let's Postgresが言うには、 /usr/lib/postgresql/version/binにそれぞれのオリジナルの実行ファイルがあるようなので、

postgres@localhost:~$ /usr/lib/postgresql/9.5/bin/pg_basebackup -h exsample.com -U replicationuser -D /var/lib/pgsql/9.5/main/ -P -v --xlog
Password: 
transaction log start point: 0/7000028 on timeline 1
151435/151435 kB (100%), 1/1 tablespace                                         
transaction log end point: 0/7000130
pg_basebackup: base backup completed

ということでうまくいきました。 ちなみに、/etc/postgresql-common/user_clustersで使用するPostgreSQLのバージョンを指定していれば、問題ないようです。

その後の作業は上のリンク先の通りにやったら無事完了でした。めでたしめでたし。