起因背景
PostgreSQL是一个客户端/服务器风格的关系型数据库管理系统,采用多进程架构。
每个连接到postmaster(默认监听5432端口)主进程的客户端连接,都会在服务器端创建一个后端进程。
然后,客户端连接会发起startup packet。每个连接到PostgreSQL服务器的客户端连接都需要先发送一个startup message。在startup packet包里的startup message信息用于建立客户端后端进程。
在实际的PostgreSQL部署环境中,可能会有不同的工具,包括监控工具、安全扫描工具、端口扫描工具、HA套件等去连接PosgreSQL默认监听的5432端口。
PostgreSQL服务器接下来开始处理这些到来的客户端连接,去建立各自的client-server通道。但是上面这些工具出于各自的目的并非都遵守良好的消息格式。
PostgreSQL服务器会在日志文件中对每个不遵守消息格式的“bad connection”记录一条日志。
incomplete startup packet
这可能会引起日志文件增长以及io问题。
注意: PostgreSQL数据库里不会存储这些“bad connection”的信息,信息记录在日志文件里,如果我们需要,可以使用外部工具,如file_fdw去解析处理。
场景复现
使用11和12版本做对比观测,打开终端一启动11
/opt/pg11/bin/pg_ctl start -D /home/postgres/data5411/
打开终端二启动12
/opt/pg124/bin/pg_ctl start -D /home/postgres/data5412/
打开终端三测试
nc -zv 192.168.99.223 5411
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 192.168.99.223:5411.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.
nc -zv 192.168.99.223 5412
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 192.168.99.223:5412.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.
可观察终端一,版本11出现如下信息:
2020-12-02 21:05:11.505 CST [3286] LOG: incomplete startup packet
终端二,版本12无输出。
查看版本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.
建议
如果不想日志中出现“incomplete startup packet”,请升级PostgreSQL到12,低版本可使用工具定期过滤处理。
保持联系
从2019年12月开始写第一篇文章,分享的初心一直在坚持,本人现在组建了一个PG乐知乐享交流群,欢迎关注我文章的小伙伴加我微信进群吹牛唠嗑,交流技术。