gpt4 book ai didi

Postgresql WalReceiver 进程等待连接主机,无论 "connect_timeout"

转载 作者:行者123 更新时间:2023-11-29 13:39:00 25 4
gpt4 key购买 nike

我正在尝试在 kubernetes 上部署一个自动化的高可用 PostgreSQL 集群。在 master 故障转移或 master 临时故障的情况下,standby 丢失流复制连接,并且在重试时,它需要很长时间才能失败并重试。

我使用 PostgreSQL 10 和流式复制(cluster-main-cluster-master-service 是一种始终路由到主服务器并且所有副本都连接到该服务进行复制的服务)。我已经尝试在 recovery.confwal_receiver_timeout< 的 primary_conninfo 中设置 connect_timeoutkeepalive 等配置 在备用的 postgresql.conf 中,但我无法使用它们取得任何进展。

首先,当 master 宕机时,复制停止并出现以下错误(状态 1):

2019-10-06 14:14:54.042 +0330 [3039] LOG:  replication terminated by primary server
2019-10-06 14:14:54.042 +0330 [3039] DETAIL: End of WAL reached on timeline 17 at 0/33000098.
2019-10-06 14:14:54.042 +0330 [3039] FATAL: could not send end-of-streaming message to primary: no COPY in progress
2019-10-06 14:14:55.534 +0330 [12] LOG: record with incorrect prev-link 0/2D000028 at 0/33000098

在调查 Postgres 事件后,我发现 WalReceiver 进程卡在 LibPQWalReceiverConnect wait_event(状态 2)中,但超时比我配置的要长得多(尽管我将 connect_timeout 设置为10秒,大约需要2分钟)。然后,它失败并出现以下错误(状态 3):

2019-10-06 14:17:06.035 +0330 [3264] FATAL:  could not connect to the primary server: could not connect to server: Connection timed out
Is the server running on host "cluster-main-cluster-master-service" (192.168.0.166) and accepting
TCP/IP connections on port 5432?

在接下来的尝试中,它成功连接了主节点(状态 4):

2019-10-06 14:17:07.892 +0330 [5786] LOG:  started streaming WAL from primary at 0/33000000 on timeline 17

我还尝试在发生卡住事件(状态 2)时终止进程,当我这样做时,它会再次启动进程并连接,然后正常传输(跳转到状态 4)。

查看netstat后,我还发现在walreceiver进程(failover case)中,有一个SYN_SENT状态的连接到old master。

最佳答案

connect_timeout 控制 PostgreSQL 等待复制连接成功的时间,但这不包括建立 TCP 连接。

要减少内核等待成功响应 TCP SYN 请求的时间,请减少重试次数。在 /etc/sysctl.conf 中,设置:

net.ipv4.tcp_syn_retries = 3

并运行 sysctl -p

这应该会显着减少时间。

过多地降低该值可能会使您的系统不太稳定。

关于Postgresql WalReceiver 进程等待连接主机,无论 "connect_timeout",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58256748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com