1. 程式人生 > 資料庫 >第28問:SIP 漂移時,會影響正在使用的資料庫連線麼?

第28問:SIP 漂移時,會影響正在使用的資料庫連線麼?

問題

我們經常使用浮動 IP(SIP,或叫 VIP),來完成資料庫的高可用部署。業務通過訪問浮動 IP,始終訪問主資料庫。
如果業務正在訪問資料庫時,資料庫主從發生切換,導致 SIP 漂移,那正在使用的資料庫連線會受到影響麼?

實驗

我們建立同子網的兩臺虛擬機器,分別安裝 MySQL。
再準備一臺額外的虛擬機器,用來模擬業務,訪問資料庫,此處省略安裝過程。
這兩臺虛擬機器的 IP 分別是 x.x.x.37 和 x.x.x.39,為了容易區分,我們設定 PS1,來區分兩個 linux 的會話。
下圖以 37 為例,這裡設定了 PS1,並確認機器上有建立好資料庫,

39 與之類似:

我們再選取一個 SIP: x.x.x.200,將其繫結到 37 上,


向子網進行 arp 宣告,通知大家 ip 變更了:

現在業務機器上,測試一下訪問 SIP 成功:

我們在資料庫中用 sysbench 灌入資料,此處省略步驟,只看結果:

然後向資料庫執行一個 select,這裡我們用了一個 sleep,使得資料庫返回結果集慢一些,大概每秒輸出 1000 行左右:

執行 SQL 後,MySQL 客戶端會不停輸出結果,如果發生了任何連線問題,我們可以立刻發現。
現在讓 SIP 發生一次切換。準備好如下命令:先在 37 上卸下 SIP,再在 39 上加上 SIP,傳送 arp 宣告。


準備好命令後,開始拼手速,讓命令以很短的時間先後執行。
執行後,會發現業務機上跑的 select 輸出停了,會停很久以後,

我們來看看這個現象的原理:
在 37 上,我們可以找到這根連線:

幾十秒後,進入 FIN-WAIT-1 階段,也就是說 37 已經感知到這根連線不太對,再 48 秒後,會關閉這根連線:

而此時在業務機器上,這根連線依然存在,會在 116 分鐘以後,探測 tcp keepalive 失敗後,才感知到連接出問題:

我們試著將業務機的 tcp keepalive 間隔調小一點,看看能不能讓業務機更快感知到連接出了問題:

再重做一下實驗,會發現幾秒鐘後,MySQL client 就會感知到連接出了問題:

我們來抓個包看看:

重做試驗,用 Wireshark 開啟抓包結果:

可以看到 SIP 切換後,TCP Keepalive 包發往了交換機,但沒有收到應答包。當超過 TCP Keepalive 的指定次數後,應用機器感知到了連線錯誤,發起了 RST 斷開連線。

也就是說:當 SIP 發生切換時,舊連線發出的包已經被丟棄了,舊連線會一直等待應答,所以需要 TCP keepalive 這種主動探測機制,才會探測到無應答的狀況。

小貼士
當應用連線到資料庫時,建議要配置 TCP keepalive 功能,並且間隔要調小到業務能接受的範圍內。預設的 TCP keepalive 的間隔是幾小時才能感知故障。
但是:不要模仿實驗中這樣,調整作業系統級別的 TCP Keepalive 引數。應在應用建立連線時將 TCP keepalive 引數配置在連線級別。


關於 MySQL 的技術內容,你們還有什麼想知道的嗎?趕緊留言告訴小編吧!