PostgreSQL 日志中的 strage 消息在 Kubernetes 中运行时"incomplete startup packet"



我有一个在Kubernetes上运行的PostgreSQL独立服务器。我注意到我在日志中收到了以下消息:

incomplete startup packet

现在我读了一些关于web和StackOverflow的文章,它似乎与试图连接到服务以检查其状态的客户端有关。出于这个原因,我写了一个这样的活力和准备检查:

readinessProbe:
exec:
command:
- /postgresql/readiness.sh
initialDelaySeconds: 45
timeoutSeconds: 5
periodSeconds: 10
livenessProbe:
exec:
command:
- /postgresql/liveness.sh
initialDelaySeconds: 45
timeoutSeconds: 5
periodSeconds: 10

其中脚本/postgresql/liveness.sh是这样的:

#!/bin/sh
if [ $(ps -ef | grep -v grep | grep postgres | wc -l) -lt 11 ]; then
exit 1
else
exit 0
fi

CCD_ 2是这样的:

#!/bin/sh
su - user -c "/var/user/packages/postgres-11.9/bin/psql -p 2544 -d postgres -c "SELECT 1"" > /dev/null 2>&1

问题是,我仍然在日志中看到消息,并且不知道如何检查这两个探测器是否工作。有什么建议吗?

我发现了问题。如果您在Kubernetes上部署PostgreSQL,并将其作为云平台上的服务公开,则需要使用负载均衡器。这个负载均衡器检查应用程序的健康状况。将健康数据包发送到PostgreSQL端口,由于它不是有效的PostgreSQL命令,应用程序会用上面的消息进行回复。

IBMCloud没有提供任何解决方案,我认为这个消息可以忽略。为了让它不那么烦人,只需将间隔检查设置为正确的值(在我的情况下是60秒,而不是5秒(。值越高,它就越不烦人,然而,它对故障的反应也就越小。

此外,为了避免不受控制的Kubernetes探针始终提供:

  • 准备就绪探测器
  • 活性探针
  • 启动探测器

在我的问题中,您可以看到如何为PostgreSQL定义它。唯一没有提到的是启动探针,你可以用这种方式定义:

startProbe:
exec:
command:
- /postgresql/liveness.sh
initialDelaySeconds: 45
timeoutSeconds: 5
periodSeconds: 10

for startProbe可以使用相同的liveness脚本,因为当所有进程都启动并运行时,可以认为应用程序已启动。然而,一个有效且已启动的流程并不意味着它能够接受连接,这就是准备就绪调查的作用所在。

我无法告诉您是什么导致了您的情况下的消息,但如果有东西建立了到数据库服务器的TCP连接,然后发送垃圾而不是有效的启动数据包,则会收到错误消息。

PostgreSQL服务器将消息的前四个字节解释为消息的长度。如果消息短于此,则会出现该错误。

您可以更改log_line_prefix,以便PostgreSQL记录客户端IP地址(%h(,然后您就知道了连接的来源。你必须弄清楚那台机器上是什么干的。通常,它是一个监控程序,只检查firTCP连接,而不实际建立数据库连接。

最新更新