詳解MySQL故障切換設計參數-session_track_transaction_info

2019-09-10     波波說運維

概述

在資料庫中間件讀寫分離應用場景中,如何保證底層資料庫出現故障節點的時,中間件可以快速斷開或遷移資料庫連接,讓用戶沒有感覺呢?在MySQL資料庫中,提供了一個session_track_transaction_info參數來提供解決方案。

A system and method for linking data objects and physical objects of various kinds to an identified user is described. The system provides to the identified user information relating to the delivery status of mail pieces directed to or sent by the user, and the user then tracks and traces the mail pieces.


2、session_track_transaction_info參數

2.1 參數介紹

MySQL5.7中,可以通過設置session_track_transaction_info變量來跟蹤事務的狀態。

該參數存在global以及session兩個級別,可以動態修改。

該參數可以設置的值為0(默認OFF),1,2

/**
Transaction tracking level
*/
enum enum_session_track_transaction_info {
TX_TRACK_NONE = 0, ///< do not send tracker items on transaction info
TX_TRACK_STATE = 1, ///< track transaction status
TX_TRACK_CHISTICS = 2 ///< track status and characteristics
};

該參數允許設置的值為0,1,2

  • 設置為0的時候,show variables like '%session_track_transaction_info%'顯示為OFF,表示不開啟事務狀態跟蹤
  • 設置為1的時候,show variables like '%session_track_transaction_info%'顯示為STATE,表示跟蹤事務狀態
  • 設置為2的時候,show variables like '%session_track_transaction_info%'顯示為CHARACTERISTICS,表示跟蹤事務狀態和語句

2.2 參數設置影響

開啟session_track_transaction_info參數的時候,在資料庫中無法直接查詢到事務狀態記錄。 根據[WL#4797],MySQL是將事務狀態跟蹤的信息記錄到了每一個Query請求返回的OK packet中。 可以通過抓包的方式查看事務狀態信息。

For a client to safely relocate a transaction to another session, it must track not only transaction state but also transaction characteristics. In addition, the client must track the transaction_isolation and transaction_read_only system variables to correctly determine the session defaults.

2.2.1 原生MySQL OK packet格式

OK Packet的數據包格式定義

其中int和string中的lenenc表示的是LengthEcode。

MySQL-5.7.19代碼中封裝OK packet的代碼部分在protocol_classic.cc文件中的net_send_ok()函數中。

2.2.3 session_track_transaction_info 額外補充信息

session_track_transaction_info使用8個字符位來表示事務的信息,並且這8個字符信息是保存在COM_QUERY請求語句的返回數據包中的(客戶端執行一條語句,都會被封裝成MySQL協議中的COM_QUERY請求發送給server端,server端解析執行之後將結果封裝在數據包中返回)。


3、總結

在設置session_track_transaction_info參數之後,在MySQL的返回數據包中可以獲取到當前連接的事務狀態信息。 在資料庫中間件上,利用這一特性,使得MySQL故障的情況下,能夠自動遷移連接,減少對用戶影響。 在部分場景下能夠達到底層MySQL節點故障切換了,對應用來說可以無感知的切換過去。

參考:

https://www.wandouip.com/t5i279719/

https://dev.mysql.com/doc/refman/5.7/en/session-state-tracking.html


後面會分享更多devops和DBA方面的內容,感興趣的朋友可以關注下~

文章來源: https://twgreatdaily.com/zh-sg/b5t1HW0BJleJMoPMbEHM.html