遇到炫技的面试官,千万别这样答!
参考文档点击文末阅读原文打开; 推荐《最好的PostgreSQL学习镜像》;
PostgreSQL数据库正在执行long query时, 客户端异常断开, 会怎么样?面试官炫技时才会问的刁钻问题,网上根本找不到答案!
肿么办,高情商的你会怎么回答?
情况1, PostgreSQL数据库正在执行long query时, 如果客户端(主动/被动)断开与PostgreSQL的socket连接, 或者中间网络设备断开了这条连接, 请问PG数据库有什么反应?
1、继续执行long query 2、直到执行完long query, 然后send data, 发现socket连接不正常 3、断开连接
有没有什么方法让PG更快的发现客户端连接已经断了? 立即终止执行long query呢?
有, 例如配置
tcp_keepalives_idle = 10s# 如果这个socket连接10s都没有数据, 操作系统内核将发起心跳包tcp_keepalives_interval = 5s# 如果心跳包没有收到客户端回包, 间隔5s后再次发送tcp_keepalives_count = 3# 重试3次还没有收到回包, 操作系统内核将这个socket置为close状态. 当前配置也就是10+5+5+5=25s后发现问题并close socket.client_connection_check_interval = 10s# PG 14引入的参数. 数据库每10s检查socket状态, 如果发现close, 则停止正在执行的query, 释放数据库服务端的socket.
如果没有配置client_connection_check_interval的话, 要等数据库进入等待客户端消息或向客户端发送消息时, 才能发现socket问题, 也就是long query执行完.
情况2, PostgreSQL数据库正在执行long query时, 如果客户端(主动并发起SIG cancel 信号, 不管它怎么发的, 例如通过Libpq协议)断开与PostgreSQL的socket连接, 请问PG数据库有什么反应?
这里提到了cancel 信号, 那就要分2种情况
1、如果PostgreSQL 处于不接收中断信号的执行过程, 则暂不响应中断信号, query会继续执行完. 2、如果PostgreSQL 处于可接收中断信号的执行过程, 则会立即cancel query.
参考
https://www.cybertec-postgresql.com/en/tcp-keepalive-for-a-better-postgresql-experience/
https://www.cnblogs.com/ddlearning/p/16169170.html
https://www.postgresql.org/docs/14/runtime-config-connection.html#GUC-CLIENT-CONNECTION-CHECK-INTERVAL
client_connection_check_interval (integer)
Sets the time interval between optional checks that the client is still connected, while running queries. The check is performed by polling the socket, and allows long running queries to be aborted sooner if the kernel reports that the connection is closed.
This option is currently available only on systems that support the non-standard POLLRDHUP extension to the poll system call, including Linux.
If the value is specified without units, it is taken as milliseconds. The default value is 0, which disables connection checks. Without connection checks, the server will detect the loss of the connection only at the next interaction with the socket, when it waits for, receives or sends data.
For the kernel itself to detect lost TCP connections reliably and within a known timeframe in all scenarios including network failure, it may also be necessary to adjust the TCP keepalive settings of the operating system, or the tcp_keepalives_idle, tcp_keepalives_interval and tcp_keepalives_count settings of PostgreSQL.
《PostgreSQL 哪些状态不可中断 - 杀不掉的QUERY和会话》
《如何防止远程程序与RDS PG连接中断》
《PostgreSQL 16 devel preview - 增加中断处理, 解决某些杀不死问题, Add CHECK_FOR_INTERRUPTS in ExecInsert's speculative insertion loop》
《PostgreSQL 14 preview - check_client_connection_interval , 协议层支持心跳包, 如果客户端已离线 可以 快速中断 运行中的长SQL - Detect POLLHUP/POLLRDHUP while running queries》
文末彩蛋:国产数据库周边生态
当然一款数据库要流行起来, 除了自己要强大, 还离不开生态. 用好周边生态工具, 管理水平战胜90%老司机!!! 下面简单介绍一下国产数据库周边生态.
1、管控软件
鸣嵩(前阿里云数据库总经理 / 研究员)等大佬们创业创办的云猿生, 核心产品是KubeBlocks. 他们的理念是让管理数据库和搭积木一样简单, 如果你要管理很多套并且种类(OLTP\OLAP\NoSQL\KV\TS\MQ等)很多的数据库产品, 推荐首选.
https://github.com/apecloud/kubeblocks
PG中文社区核心委员唐成老师的公司乘数开源的Clup, 专用管理PostgreSQL和PolarDB的集群管理软件, 如果你要管理很多套数据库, 推荐选择. 并且Clup还提供了企业版、自研的连接池、分布式存储、一体机、备份平台等, 是企业用户推荐之选.
https://www.csudata.com/
若航老司机开源的pigsty, 集成了300多个PG插件的PG集群和PolarDB集群管理软件, 如果你要管理很多套PG或PolarDB数据库, 且对插件有特别多的需求, 推荐选择.
https://pigsty.cc/zh/
2、审计监控诊断优化
翟总(曾经是我背后的男人)到海信聚好看后研发的 DBdoctor, 采用ebpf技术, 在对数据库几乎没有影响的情况下实时监控数据库和服务器的各项指标, 发现和诊断问题根因非常方便.
https://www.dbdoctor.cn/
天舟老哥的核心产品Bytebase 是位于您和数据库之间的中间件。它是数据库 DevOps 的 GitLab/GitHub,专为开发人员、DBA 和平台工程师打造。
https://bytebase.cc/docs/introduction/what-is-bytebase/
PawSQL, SQL优化和诊断产品.
D-Smart, Oracle老前辈白老大出品, 专注企业级市场, 将业界顶级DBA经验的产品化作品, 产品功能包括数据库监控、诊断、优化等.
https://www.modb.pro/db/567140
3、国产数据库IDE
IDE是开发者的必备工具,例如社区有pgAdmin, 国产IDE则可以看看老程序猿达刚老师的DeskUI:
https://www.deskui.com
4、数据同步&迁移&备份恢复
NineData, 老领导出去创业做的产品, 产品涵盖了数据同步、迁移、备份、比对、devops、chatDBA等.
https://www.ninedata.cloud/home
DSG, 非常老牌的数据库同步迁移企业级产品, 支持各种数据库的异构和同构迁移, 用他们的话说, 没有dsg搞不定的迁移, 比goldengate还牛.
https://www.dsgdata.com/
公开课
如果你对PolarDB学习感兴趣可以阅读这个公开课系列:
除了PolarDB还非常值得关注的几款PG栈国产数据库:
HaloDB(基于PG兼容PostgreSQL、Oracle、MySQL. http://www.halodbtech.com/ )、 IvorySQL(基于开源PG兼容PG、Oracle. https://www.ivorysql.org/zh-cn/ )、 ProtonBase(云原生分布式数仓. https://protonbase.com/ )、 成都文武数据库(https://ww-it.cn)
参考文档点击阅读原文获得
感谢关注我的github (https://github.com/digoal/blog) 及视频号: