web-dev-qa-db-ja.com

プライマリのタイムライン2がリカバリターゲットのタイムライン1と一致しません

高さの可用性(HA)を取得するために、postgresqlとpgpoolで構成を作成したいと思います。私はこれをしたいです:

  .-----.                  .--------.
  |     |           W      |   DB   |
  | APP |-----+----------->| MASTER |----.
  |     |     |            |        |    |
  `-----`     |            `--------`    | STREAMING REPLICATION
              |            .--------.    |
              |     R      |   DB   |    |
              +----------->| SLAVE1 |<---+      
              |            |        |    |
              |            `--------`    |
              |            .--------.    |
              |     R      |   DB   |    |
              `----------->| SLAVE2 |<---`
                           |        |
                           `--------`
after failover:

  .-----.                  .--------.
  |     |                  |   DB   |
  | APP |-----+----        | MASTER |
  |     |     |            |  FAIL  |
  `-----`     |            `--------`
              |            .--------.
              |    W/R     |   DB   |
              +----------->| SLAVE1 |---.          
              |            |        |   |
              |            `--------`   |
              |            .--------.   | STREAMING REPLICATION
              |     R      |   DB   |   |
              `----------->| SLAVE2 |<--`
                           |        |
                           `--------`

HA PostgreSQL Clusterのストリーミングレプリケーション+ pgpool-II の投稿に従って、vagrantを使用して4つの仮想マシン(vm)を作成します。 1つのマスター(M)、2つのスレーブ(S1およびS2)、およびその他のpgpool(APP)。 APPでいくつかのクエリを実行すると、すべて正常に動作します。マスターを停止すると、S1がMに昇格し、S2に新しいマスターができます。しかし、これは私に問題を引き起こします。このエラーの意味がわかりません。どうすれば修正できるか迷ってしまいます。

2014-08-18 17:04:56 UTC FATAL:  timeline 2 of the primary does not match recovery target timeline 1

使ってます:

  • postgres 9.1
  • pgpool 3.1.1-1

[〜#〜]更新[〜#〜]

このエラーは、S1がマスターに昇格したときにS2によって発行されます。

更新2

ノードのIPアドレス:

M  - 192.168.1.10
S1 - 192.168.1.11
S2 - 192.168.1.12
APP- 192.168.1.13

これは、S1とS2のrecovery.confファイル構成です。

standby_mode = 'on'
primary_conninfo = 'Host=192.168.1.10 port=5432 user=replicator password=replicator'
trigger_file = '/tmp/postgresql.trigger.5432'

更新3

これが/etc/pgpool2/pgpool.confファイルへの私のバックエンドです:

...
backend_hostname0 = '192.168.1.10'
backend_port0 = 5432
backend_weight0 = 0
backend_data_directory0 = '/var/lib/postgresql/9.1/main'
backend_flag0 = 'ALLOW_TO_FAILOVER'

backend_hostname1 = '192.168.1.11'
backend_port1 = 5432
backend_weight1 = 0
backend_data_directory1 = '/var/lib/postgresql/9.1/main'
backend_flag1 = 'ALLOW_TO_FAILOVER'

backend_hostname2 = '192.168.1.12'
backend_port2 = 5432
backend_weight2 = 0
backend_data_directory2 = '/var/lib/postgresql/9.1/main'
backend_flag2 = 'ALLOW_TO_FAILOVER'


#------------------------------------------------------------------------------
# FAILOVER AND FAILBACK
#------------------------------------------------------------------------------

failover_command = '/var/lib/postgresql/bin/failover.sh %d %M %m'

そしてそれはfailover.shファイルです:

#!/bin/sh
FALLING_NODE=$1
OLD_MASTER=$2
NEW_MASTER=$3
SLAVE1='slave1'
SLAVE2='slave2'
if test $FALLING_NODE -eq 0
then
ssh -T $SLAVE1 touch /tmp/postgresql.trigger.5432
ssh -T $SLAVE1 "while test ! -f /var/lib/postgresql/9.1/main/recovery.done; $
ssh -T $SLAVE2 "sed -i 's/192.168.1.10/192.168.1.11/' /var/lib/postgresql/9.$
ssh -T $SLAVE2 /etc/init.d/postgresql restart
/usr/sbin/pcp_attach_node 10 localhost 9898 pgpool pgpool 2
fi
4
Robert

この問題は この詳細なブログ でカバーされています。

つまり、マスターサーバーとスタンバイサーバーはすべてarchive_mode = onarchive_command、9.3までは、この要件が削除されています。

4
Craig Ringer