我想用 postgresql 和 pgpool 创建一个配置来获得高度可用性(HA)。我想做这个:
.-----. .--------.
| | 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 |<--`
| |
`--------`
通过 Streaming Replication + pgpool-II关注 HA PostgreSQL 集群的帖子我用 vagrant 创建了 4 个虚拟机 (vm)。一个 Master(M),两个 Slave(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 提升为 Master 时,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
这个详细的博客涵盖了这个问题。
简而言之,主服务器和备用服务器都必须具有
archive_mode = on
和archive_command
,直到 9.3 删除了这个要求。