postgresql 复制 | slave/recovery 服务器停机时应用程序冻结

postgresql replication | application freezes when slave/recovery server goes down

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

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

来自 'master' 服务器:

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)

...在 'slave' 上:

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)

我了解我应该将我的远程从属数据库提升为主角色的过程,但我似乎遇到的问题是现在有 2 或 3 次网络 link 到远程从属服务器已关闭,应用程序完全 "freezes up"(例如页面加载但不允许用户登录),尽管主数据库仍在运行且 运行。我启用了 wal 归档以确保当发生这种情况时,数据会被保留,直到恢复 link 并且可以发送事务日志......但我不明白为什么我的主 pgsql 实例似乎锁定,因为从属实例脱机...有点破坏复制的整个概念,所以我认为我一定做错了什么?

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

synchronous_standby_names是否设置在主服务器上?

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

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