postgresql复制|当从属/恢复服务器出现故障时应用程序冻结

时间:2017-05-08 18:43:56

标签: postgresql database-replication

我在后端使用pgsql数据库支持由小型企业,基于Web的ROR应用程序托管的应用程序。

Postgres设置为复制到异地备用服务器,据我所知,工作正常,当我查询远程服务器时,它显示它正处于恢复状态等。

来自'主'服务器:

postgres=# table pg_stat_replication ;
  pid  | usesysid | usename | application_name |  client_addr   | client_hostname | client_port |         backend_start
        |   state   | sent_location | write_location | flush_location | replay_location | sync_priority | sync_state
-------+----------+---------+------------------+----------------+-----------------+-------------+-----------------------
--------+-----------+---------------+----------------+----------------+-----------------+---------------+------------
 18660 |  1281085 | rep     | postgresql2      | 192.168.81.155 |                 |       43824 | 2017-05-07 11:42:43.15
0057-04 | streaming | 3/B5243418    | 3/B5243418     | 3/B5243418     | 3/B5243150      |             1 | sync
(1 row)

......和'奴隶':

postgres=# select pg_is_in_recovery();
 pg_is_in_recovery
-------------------
 t
(1 row)

postgres=# select now() - pg_last_xact_replay_timestamp() AS replication_delay;
 replication_delay
-------------------
 01:02:14.885511
(1 row)

我理解所涉及的过程是否必须将我的远程从属DB升级为master的角色,但我似乎遇到的问题是,现在有2到3次到远程从属服务器的网络链接已经关闭,尽管主数据库仍在启动并运行,但应用程序完全“冻结”(例如页面加载但不允许用户登录)。我启用了wal归档,以确保在发生类似这样的事情时保留数据,直到链接恢复并且可以发送事务日志...但我不明白为什么我的主pgsql实例似乎锁定因为奴隶实例脱机...有点打败整个复制概念,所以我认为我一定做错了什么?

1 个答案:

答案 0 :(得分:1)

最可能的解释是您只使用两个节点进行同步复制。

主服务器上是否设置了synchronous_standby_names

如果唯一的同步备用服务器不可用,则主服务器上不能提交任何事务,数据修改事务将“挂起”,这可以解释您观察到的行为。

对于同步复制,您至少需要两个从属。