预防客户端bad connection连接

今天微信群遇到一个问题,PostgreSQL 10主备同步进程出现故障,备库出现致命错误:

FATAL: could not connect to primary server: FATAL: the database system is in recovery mode
FATAL: could not connect to primary server: FATAL: the database system is in recovery mode
FATAL: could not connect to primary server: FATAL: the database system is in recovery mode
FATAL: could not connect to primary server: FATAL: the database system is in recovery mode
FATAL: could not connect to primary server: FATAL: the database system is in recovery mode
FATAL: could not connect to primary server: count not connect to server: Connection refused
...

主库错误信息如下:

LOG: incomplete startup packet
LOG: incomplete startup packet
LOG: incomplete startup packet
LOG: incomplete startup packet
...
FATAL: could not write lock file "postmaster.pid": No space left on device
...
FATAL: the database system is in starting up
FATAL: the database system is in starting up
...
FATAL: unsupported frontend protocol 1234.5680: server supports 2.0 to 3.0
...

从主库的错误日志信息看,有大量的“incomplete startup packet”信息,以及磁盘空间不足的提示基本可以推断问题的原因:频繁的客户端连接使用了不规范的消息格式导致数据库服务器大量记录“incomplete startup packet”到日志文件,引起磁盘空间写满。

“incomplete startup packet”问题背景

每个连接到postmaster主进程的客户端连接,都会在服务器端创建一个后端进程。然后,客户端连接会发起startup packet。每个连接到PostgreSQL服务器的客户端连接都需要先发送一个startup message。在startup packet包里的startup message信息用于建立客户端后端进程。

在实际的PostgreSQL部署环境中,可能会有不同的工具,包括监控工具、安全扫描工具、端口扫描工具、HA套件等去连接PosgreSQL默认监听的5432端口。

PostgreSQL服务器接下来开始处理这些到来的客户端连接,去建立各自的client-server通道。但是有些工具(尤其是一些监控软件)并非都遵守良好的消息格式

PostgreSQL服务器会在日志文件中对每个不遵守消息格式的“bad connection”记录一条日志。

incomplete startup packet

这可能会引起日志文件增长以及io问题。

场景复现

使用nc工具对11和12版本做对比测试,可以很清楚的复现这个问题

nc -zv 192.168.99.223 5432
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 192.168.99.223:5432.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.

可观察到版本11出现如下信息:

LOG:  incomplete startup packet

版本12正常。

PostgreSQL 12的release note也有相关描述

E.6.3.1.5. Monitoring
Prevent logging “incomplete startup packet” if a new connection is immediately closed (Tom Lane)
This avoids log spam from certain forms of monitoring.

解决方法

  • 升级到PostgreSQL 12版本及以上
  • 日志文件循环处理,按时间和大小覆盖
  • 使用工具定期过滤处理关键字
保持联系

本人组建了一个技术交流群:PG乐知乐享交流群。欢迎关注文章的小伙伴随缘加入,进群请加本人微信skypkmoon并备注PG乐知乐享。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
当使用Nginx作为反向代理服务器时,502 Bad Gateway错误表示Nginx无法从上游服务器(例如应用程序服务器)获取有效的响应。这可能是由于以下几个原因引起的: 1. 上游服务器故障:502错误通常是由于上游服务器(例如应用程序服务器)无法正常工作或响应超时引起的。这可能是由于服务器崩溃、网络问题或配置错误等原因导致的。 2. Nginx配置错误:502错误也可能是由于Nginx配置错误引起的。例如,配置中指定的上游服务器地址或端口不正确,或者Nginx无法与上游服务器建立连接。 3. 缓冲区溢出:如果上游服务器的响应超过了Nginx缓冲区的大小限制,也可能导致502错误。这通常发生在处理大型文件或响应时。 解决502 Bad Gateway错误的方法包括: 1. 检查上游服务器:确保上游服务器正常工作,并且可以通过其他方式访问。如果上游服务器出现故障,需要修复或重启服务器。 2. 检查Nginx配置:检查Nginx配置文件中关于上游服务器的配置项,确保地址、端口和协议等设置正确。可以使用命令`nginx -t`来检查配置文件的语法错误。 3. 调整缓冲区大小:如果502错误是由于缓冲区溢出引起的,可以尝试增加Nginx配置中的缓冲区大小。可以通过修改`proxy_buffer_size`和`proxy_buffers`等配置项来实现。 4. 日志分析:查看Nginx的错误日志文件,通常位于`/var/log/nginx/error.log`,以获取更详细的错误信息。日志中可能会提供有关具体问题的线索,帮助进一步排查和解决502错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值