今天微信群遇到一个问题,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版本及以上
- 日志文件循环处理,按时间和大小覆盖
- 使用工具定期过滤处理关键字
保持联系
从2019年12月开始写第一篇文章,分享的初心一直在坚持,本人现在组建了一个PG乐知乐享交流群,欢迎关注我文章的小伙伴进群吹牛唠嗑,交流技术,互赞文章。
如果群二维码失效可以加我微信。