天天看點

avoid local TIME_WAIT when use port_probe in sky_pg_cluster by set setsockopt :SO_LINGER

一個postgresql master-slave ha叢集, 主節點被莫名的failover了.

在standby上看到的一些日志(/tmp/sky_pg_cluster.log)

在出現異常前, 經常有port_probe報出來的 connect failed的錯誤.

對應的時間點, 在資料庫日志中發現有53300的報錯, 這種報錯說明連接配接數用光了.

剩餘連接配接時給超級使用者預留的.

錯誤對應 :

探測端口的port_probe.c代碼如下 

但是這個問題沒有辦法重制, 當我在一個測試環境中, 把連接配接占滿後, 使用port_probe探測端口還是能正常傳回的.

環境 :

不過, 排查這個問題倒發現了一個新的問題, 我們這個port_probe在close連接配接後, 用戶端對應的tcp會話會處于time_wait狀态.

預設逾時應該是60秒.

例如 :

是以問題來了, 如果我們探測非常頻繁的話, 可能導緻tcp端口被全部占用, 進而導緻探測失敗.

port_probe的本地大量的time_wait連接配接

遠端(資料庫端)沒有出現time_wait

要解決這個問題, 可以修改一下port_probe程式.

參考

http://blog.csdn.net/factor2000/article/details/3929816

使用強制關閉.

修改後的程式如下 :

使用這個版本就不會再出現time_wait的問題了.

另外, 通過修改核心參數, 也可以緩解這個問題, 但是沒上面直接改用戶端代碼的效果好.

http://blog.163.com/digoal@126/blog/static/163877040201362355123969/

sysctl -w net.ipv4.tcp_tw_recycle=1

sysctl -w net.ipv4.tcp_timestamps=1

繼續閱讀