KingbaseES 數據庫連接斷開問題排查思路


用戶在使用數據庫過程中,經常會發現如果會話空閑一段時間,會話有可能斷開,需要重連。這個問題影響因素很多,包括數據庫參數設置、操作系統參數、防火牆等。以下介紹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 ,以數據庫設置為准。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM