postgresql复制|当从属/恢复服务器停机时,应用程序冻结

postgresql复制|当从属/恢复服务器停机时,应用程序冻结,postgresql,database-replication,Postgresql,Database Replication,我支持由小型企业托管的应用程序,该应用程序基于web,在后端使用pgsql数据库 Postgres设置为复制到非现场备用服务器,据我所知,该服务器工作正常,当我查询远程服务器时,它显示它正在恢复中,等等 从“主”服务器: postgres=# table pg_stat_replication ; pid | usesysid | usename | application_name | client_addr | client_hostname | client_port |

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

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)

我理解需要将我的远程从属数据库升级为主数据库的过程,但我似乎遇到的问题是,现在有2到3次远程从属服务器的网络链接断开,应用程序完全“冻结”(例如,页面加载但不允许用户登录),尽管主数据库仍然处于运行状态。我启用了wal存档,以确保在发生类似情况时,数据会被保留,直到链接恢复,事务日志可以发送…但我不明白为什么我的主pgsql实例似乎会被锁定,因为从实例脱机…有点破坏了整个复制概念,所以我想我一定是做错了什么?

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

是在主服务器上设置的吗

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


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

发生“不允许用户登录”时,请提供日志中的错误。还有-一个小时的延迟足以让人担心,我想就我所知,这不是一个小时的“延迟”,而是因为数据库中的任何事务都已经进行了很长时间。感谢反馈,似乎这确实是问题所在。