首页 > 数据库 >TCP KEEPALIVE以获得更好的POSTGRESQL体验

TCP KEEPALIVE以获得更好的POSTGRESQL体验

时间:2024-05-11 15:21:31浏览次数:24  
标签:POSTGRESQL 数据库 TCP 服务器 KEEPALIVE 连接 空闲 keepalive

一、数据库连接断开的原因

连接断开的可能原因有多种:

1、数据库服务器崩溃

如果服务器由于某种原因崩溃,要调查服务器是否存在问题,您应该首先查看 PostgreSQL 日志,看看是否可以找到匹配的崩溃报告。

2、客户端放弃的连接

如果客户端在没有正确关闭数据库连接的情况下退出,服务器在网络套接字上通信时将收到文件结束或错误。通过v14 中引入的新会话统计信息,您可以跟踪 中此类“废弃”数据库连接的数量pg_stat_database.sessions_abandoned

例如,如果应用程序服务器发生故障并重新启动,它通常不会关闭与数据库服务器的连接。这并不令人担忧,当服务器尝试向客户端发送

数据时,数据库服务器会很快检测到它。但如果数据库会话空闲,服务器进程正在等待客户端发送下一条语句(可以看到pg_stat_activity

wait_event)。那么服务器不会立即注意到客户端不再存在!这种挥之不去的后端进程会占用一个进程槽,并可能导致您超出

max_connections

PostgreSQL v14 引入了一个新参数idle_session_timeout,该参数会在一段时间后关闭空闲连接。但这也会终止“健康”的空闲连接,

因此这不是一个很好的解决方案。TCP keepalive 为这个问题提供了更好的解决方案。

3、网络组件关闭的连接

有时,数据库连接的两端都会遇到相同的问题:每一端都看到另一端“挂断了它们”。在这种情况下,问题出在数据库客户端和服务器之

间。

如果确实存在连接问题,网络连接可能会断开。在软件层面上你无法改变这一点。但很多时候,断开连接是由防火墙或路由器的配置方式

引起的。网络组件可能必须“记住”每个打开连接的状态,而其资源是有限的。因此,“忘记”并删除闲置较长时间的连接似乎是权宜之计。

由于当今的许多 TCP 流量都是通过 HTTP 进行的,并且 HTTP 是无状态的,因此这通常不是问题。如果您的 HTTP 连接断开,您只需为下

一个请求建立一个新连接,这并不是很昂贵。但数据库不同:

  • 建立数据库连接的成本很高
  • 数据库连接不是无状态的;例如,通过关闭连接,您会丢失打开的事务、临时表和准备好的语句
  • 数据库会话空闲较长时间是正常的,例如,如果您正在使用连接池,或者当客户端正在等待长时间运行的分析查询的结果时

这就是TCP持久连接发挥作用的地方,它可以用来保持空闲连接打开。

二、TCP keepalive

Keepalive 是 TCP 协议的一项功能。当您在 TCP 网络套接字上设置该SO_KEEPALIVE选项时,一旦套接字空闲,计时器就会开始运行。当

保活空闲时间到期且套接字上没有进一步活动时,内核将向通信对方发送“保活数据包”。如果对方应答,则认为连接良好,并且计时器再

次开始运行。

如果没有应答,内核在发送另一个持久连接分组之前,会等待持久连接间隔时间。此过程重复进行,直到发送的keepalive报文数量达到

keepalive计数。之后,该连接被视为死亡连接,试图使用该网络套接字将导致错误。

注意,发送keepalive消息的是操作系统内核,而不是应用程序(数据库服务器或客户端)。应用程序不知道这个过程。

TCP keepalive 有两个目的:

防止网络连接处于空闲状态

检测通信的另一端是否离开而没有关闭网络连接

三、使用 TCP keepalive 使空闲数据库会话保持活动状态

为了防止防火墙和路由器关闭空闲连接,我们需要为持久连接空闲时间设置一个低得多的值。然后在连接关闭之前发送keepalive报文。

即使数据库客户端和服务器都没有发送任何数据,这也会让出错的网络组件相信连接没有空闲。

对于这种情况,keepalive计数和keepalive间隔是不相关的。我们所需要的就是让第一个keepalive数据包足够早地发送。

四、使用 TCP keepalive 检测死连接

对于这种情况,减少持久连接空闲时间通常是不够的。如果服务器以75秒的间隔发送9个keepalive报文,则需要超过10分钟才能检测到死

连接。所以我们也会减少keepalive计数,或者keepalive间隔,或者两者都减少——就像在这个例子中一样。

还有一个问题没有解决:即使操作系统检测到网络连接中断,数据库服务器也不会注意到,除非它尝试使用网络套接字。如果它正在等待

客户端的请求,请求会立即执行。但是如果服务器忙于执行一个长时间运行的SQL语句,它不会注意到死亡连接,直到查询完成并尝试将

结果返回给客户端!为了防止这种情况发生,PostgreSQL v14引入了新的参数client_connection_check_interval,该参数目前只在

Linux上支持。设置此参数会导致服务器定期“轮询”套接字,即使它还没有要发送的内容。这样,它可以检测到关闭的连接并中断SQL语句

的执行。

标签:POSTGRESQL,数据库,TCP,服务器,KEEPALIVE,连接,空闲,keepalive
From: https://www.cnblogs.com/zhenren001/p/18186548

相关文章

  • Python-PostgreSQL主键自动填充报错:SAWarning: Column x is marked as a member of th
    importdatetimefromsqlalchemyimportColumn,String,inspect,Integerfromsqlalchemy.ext.declarativeimportdeclarative_basefromsqlalchemy.ormimportsessionmakerfromsqlalchemyimportcreate_engineengine=create_engine(DATABASE_URL)Base=decla......
  • 故障分析 | TCP 缓存超负荷导致的 MySQL 连接中断
    1.背景在执行跑批任务的过程中,应用程序遇到了一个问题:部分任务的数据库连接会突然丢失,导致任务无法完成。从数据库的错误日志中,发现了 Abortedconnection 的信息,这说明客户端和服务器之间的通信被异常中断了。2.分析为了找出问题的原因,我们首先根据经验,分析了可能导致连接被......
  • TCP长连接/HTTP长连接/HTTP长(短)轮询
     TCP长连接/HTTP长连接/HTTP长轮询TCP长连接VSHTTP长连接TCP长连接和HTTP长连接是两个相关但概念上有所区别的技术。TCP长连接TCP(TransmissionControlProtocol)是互联网传输层的一个面向连接的协议,它提供可靠的数据传输服务。在TCP连接中,长连接是指客户端和服务器建立连......
  • ModbusTcp和ModbusRtu全面理解
    一、何为Modbus通信协议1.1Modbus基本介绍Modbus是一种通信协议,是Modicon公司(现在的施耐德电气SchneiderElectric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(Defacto),并且现在是工业电子设备之间常用的连接方式M......
  • socket TCP 网络编程 笔记
    1.宏观目的:实现简单的TCP通信我们需要server.c和client.c2.server.c/**socket*bind*listen*accept*send/recv*/#include<stdio.h>#include<sys/types.h>#include<sys/socket.h>#include<string.h>#include<netinet/in.h>......
  • 用PHP连接postgreSQL时遇到的问题
    先说说我的环境的版本,apache是2.4的,postgreSQL为目前最新的16版本,php刚开始为7版本。第一个问题是PDO连接PostgreSQL报错,SCRAMauthenticationrequireslibpqversion10orabovein这个问题是libpq的版本过低,要版本10以上,(至于libpq是什么,我目前也不懂)后来我检查了php版本发......
  • postgresql中视图建立,字段拼接,同一个表的多行之间的多个字段相减
    首先表是这样的CREATETABLEpublic.tb_realtime_data( s_idvarchar(48)NOTNULL, sensor_namevarchar(48)NULL, sensor_index_codevarchar(48)NULL, sensor_valuenumeric(20,10)NULL, statistics_statusint4NULL, alarm_timetimestampNOTNULL, create_time......
  • CentOS中使用tcpdump抓包 转载
    安装:yuminstalltcpdump命令使用:监听特定网卡tcpdump抓取第一块网卡所有数据包 [root@server110tcpdump]#tcpdumptcpdump:verboseoutputsuppressed,use-vor-vvforfullprotocoldecodelisteningoneth0,link-typeEN10MB(Ethernet),capturesize65535by......
  • vue3.4中KeepAlive的一个bug
    KeepAlive可以缓存组件,在不使用include时没有任何问题,可以正常缓存。但是一旦使用了include,如果动态组件中没有导入ref函数,缓存功能就消失了比如editcom.vue<template><input></template><scriptsetup>import{ref}from'vue'</script><style></style&g......
  • PostgreSQL和Oracle两种数据库区别
    PostgreSQL和Oracle是两个备受欢迎的关系型数据库管理系统(RDBMS)。它们都提供了强大的功能和广泛的应用领域。然而,在选择使用哪个数据库管理系统时,需要考虑各自的特点和适用场景。本文将详细比较PostgreSQL和Oracle,并探讨在不同情况下应该选择哪个数据库管理系统。PostgreSQLPos......