用户在使用数据库过程中,经常会发现如果会话空闲一段时间,会话有可能断开,需要重连。这个问题影响因素很多,包括数据库参数设置、操作系统参数、防火墙等。以下介绍KingbaseES针对该问题的排查思路。

一、数据库参数检查

test=# select name,setting from sys_settings where name='client_idle_timeout';     
        name         | setting 
---------------------+---------
 client_idle_timeout | 0

参数 client_idle_timeout 表示允许客户端空闲的时长,在值以内,连接不会断开。如果该值为 0 ,则表示没有连接空闲限制。

二、检查系统防火墙及网络设置

这里包括主机自身的防火墙,以及内网的防火墙,还有交换机的空闲超时时间设置。

确认数据库所在主机的防火墙:

[root@dbhost03 extension]# systemctl status firewalld.service 
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)

内网防火墙,或交换机的配置需要网络管理员确认。

三、keepalive 参数,避免空闲断开

当建立TCP链接后,如果应用程序或者上层协议一直不发送数据,或者隔很长一段时间才发送数据,当链接很久没有数据报文传输时就需要通过keepalive机制去确定对方是否在线,链接是否需要继续保持。当超过一定时间没有发送数据时,TCP会自动发送一个数据为空的报文给对方,如果对方回应了报文,说明对方在线,链接可以继续保持,如果对方没有报文返回,则在重试一定次数之后认为链接丢失,就不会释放链接。

相关操作系统参数如下:

net.ipv4.tcp_keepalive_time:单位秒,表示发送探测报文之前的链接空闲时间,默认为7200。
net.ipv4.tcp_keepalive_intvl:单位秒,表示两次探测报文发送的时间间隔,默认为75。
net.ipv4.tcp_keepalive_probes:表示探测的次数

通过keepalive 可以探测客户端进程是否存在,如果客户端进程不存在,服务器端的进程就没必要保持。如果设置更小的 tcp_keepalive_time,就可以更频繁的与客户端通信,避免因为空闲时间过长而被交换机断开。

同样,数据库也有这三个参数:

test=# select name,setting from sys_settings where name like '%keepalive%'; 
          name           | setting 
-------------------------+---------
 tcp_keepalives_count    | 0
 tcp_keepalives_idle     | 0
 tcp_keepalives_interval | 0

默认为 0 , 表示参照操作系统设置。如果,不为 0 ,以数据库设置为准。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐