MySQLフェイルオーバーの応用無感知設計
20140 ワード
1.概要
データベース・ミドルウェアの読み書き分離アプリケーション・シーンで、最下位のデータベースに障害ノードが発生することをどのように保証するかで、ミドルウェアはデータベース接続を迅速に切断または移行し、ユーザーが感知しないようにすることができます.MySQLデータベースにはセッションがあります.track_transaction_infoパラメータは、ソリューションを提供します.公式ドキュメントにはパラメータの説明がないため、このパラメータのオプション値を紹介し、実際の影響を検証しました.
2. session_track_transaction_infoパラメータ
2.1パラメータの説明
MySQL5.7でsession_を設定できます.track_transaction_info変数は、トランザクションのステータスを追跡します.*このパラメータにはglobalとsessionの2つのレベルがあり、動的に変更できます.*このパラメータで設定できる値は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パラメータ設定の影響
セッションを開くtrack_transaction_infoパラメータの場合、データベースでトランザクションステータスレコードを直接クエリーすることはできません.[WL#4797]によれば、MySQLは、取引状態追跡の情報を、各Query要求が返すOKパッケージに記録する.トランザクションのステータス情報は、パッケージをキャプチャして表示できます.
2.2.1オリジナルMySQL OKパッケージ形式
OK Packetのパケットフォーマット定義
を選択します.
名前
説明
int<1>
ヘッド
このパケットがOK Packetであることを0 x 00または0 xFEで示す
int
影響する行数
影響する行数
int
前回挿入したid
前回挿入したid
int<2>
ステータスID
CLIENT_が定義されている場合PROTOCOL_41、この部分があります
int<2>
警告数
警告の数、CLIENT_が定義されている場合PROTOCOL_41、この部分があります
int<2>
ステータスID
CLIENT_が定義されている場合TRANSACTIONS、この部分があります
string
情報
CLIENT_が定義されている場合、人間が読み取り可能な状態情報SESSION_TRACK、この部分があります
string
セッションステータス
セッションステータス情報、SERVER_が定義されている場合SESSION_STATE_CHANGED、この部分があります
string
情報
人間が読める情報
ここで、
int
およびstring
のlenencは、LengthEcodeを表す.MySQL-5.7.19コードにOKパッケージされたコード部分は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側解析が実行された後、結果がパケットにカプセル化されて返される).
位置
表示情報
具体的な意味
Place 1
Transaction
T明示的に1つのトランザクションIを開く暗黙的に1つのトランザクションを開く(@autocommit=0)活発な事務がない
Place 2
unsafe read
r現在のトランザクションで非トランザクションストレージエンジンが読み込まれたテーブル_現在のトランザクションに非トランザクション・ストレージ・エンジンが読み込まれていないテーブル
Place 3
transaction read
R現在のトランザクションでトランザクションストレージエンジンのテーブルが読み込まれている_現在のトランザクションにトランザクション・ストレージ・エンジンが読み込まれていないテーブル
Place 4
unsafe wirte
w現在のトランザクションに非トランザクションストレージエンジンが書き込まれたテーブル_現在のトランザクションに非トランザクション・ストレージ・エンジンが書き込まれていないテーブル
Place 5
transaction write
W現在のトランザクションにトランザクションストレージエンジンが書き込まれたテーブル_現在のトランザクションにトランザクション・ストレージ・エンジンが書き込まれていないテーブル
Place 6
unsafe statement
s現在のトランザクションでは、UUID()のような安全でない文が使用されています.似たような安全でない文は使用されていません
Place 7
result-set
Sはクライアントに結果セットを送信する結果セットなし
Place 8
LOCKed TABLES
LテーブルはLOCK TABLES文で明示的にロックされています.現在のトランザクションにはロックテーブルがありません
2.2.2 session_track_transaction_info=0の場合OKパッケージ形式解析
session_track_transaction_info=0はトランザクション情報を記録しないことを示し、server側で返されたすべてのパケットにトランザクションステータス追跡情報がありません.
## session_track_transaction_info = 0
begin;
06 00 00 # playload_length
00 # sequence_id
03 # command_type COM_QUERY
62 65 67 69 6e # begin
server :response
07 00 00 # playload_length
01 # sequence_id
00 # 0x00 OK
00 # 0
00 # id
03000000
insert into t1 values(55)
1a 00 00 # playload_length
00 # sequence_id
03 # command_type COM_QUERY
696e7365727420696e746f2074312076616c75657328353529 # insert into t1 values(55)
server :response
07 00 00 # playload_length
01 # sequence_id
00010003000000
commit;
07 00 00 # playload_length
00 # sequence_id
03 # command_type COM_QUERY
636f6d6d6974 # commit
server :response
07 00 00 # playload_length
01 # sequence_id
00000002000000
2.2.4 session_track_transaction_info=1の場合OKパッケージ形式解析
## session_track_transaction_info = 1
begin;
06 00 00 # playload_length
00 # sequence_id
03 # command_type COM_QUERY
626567696e # begin
server :response
14 00 00 # playload_length
01 # sequence_id
00 # 0x00 OK
00 # 0
00 # id
03400000000b050908
54 5f 5f 5f 5f 5f 5f 5f
# T_______
# Place 1: 54 //
# Place 2: 5f //
# Place 3: 5f //
# Place 4: 5f //
# Place 5: 5f //
# Place 6: 5f //
# Place 7: 5f //
# Place 8: 5f //
insert into t1 values(111)
1b 00 00 # playload_length
00 # sequence_id
03 # command_type COM_QUERY
696e7365727420696e746f2074312076616c7565732831313129 # insert into t1 values(111)
server :response
14 00 00 # playload_length
01 # sequence_id
00010003400000000b050908
54 5f 5f 5f 57 5f 5f 5f # T___W___
# Place 1: 54 //
# Place 2: 5f //
# Place 3: 5f //
# Place 4: 5f //
# Place 5: 57 //
# Place 6: 5f //
# Place 7: 5f //
# Place 8: 5f //
commit;
07 00 00 # playload_length
00 # sequence_id
03 # command_type COM_QUERY
636f6d6d6974 # commit
server :response
1400000100000002400000000b050908
5f 5f 5f 5f 5f 5f 5f 5f # ________
# Place 1: 5f //
# Place 2: 5f //
# Place 3: 5f //
# Place 4: 5f //
# Place 5: 5f //
# Place 6: 5f //
# Place 7: 5f //
# Place 8: 5f //
2.2.5 session_track_transaction_info=2の場合OKパッケージ形式解析
セッション_track_transaction_infoパラメータが2に設定されている場合、より詳細なトランザクションステータス情報が表示されます.
begin;
06 00 00 # playload_length
00 # sequence_id
03 # command_type COM_QUERY
626567696e # begin
server :response
29 00 00 # playload_length
01 # sequence_id
000000034000000020050908
54 5f 5f 5f 5f 5f 5f 5f # T_______
0413125354415254205452414e53414354494f4e3b # START TRANSACTION;
# Place 1: 54 //
# Place 2: 5f //
# Place 3: 5f //
# Place 4: 5f //
# Place 5: 5f //
# Place 6: 5f //
# Place 7: 5f //
# Place 8: 5f //
insert into t1 values(222)
1b 00 00 # playload_length
00 # sequence_id
03 # command_type COM_QUERY
696e7365727420696e746f2074312076616c7565732832323229 # insert into t1 values(222)
server :response
14 00 00 # playload_length
01 # sequence_id
00010003400000000b050908
54 5f 5f 5f 57 5f 5f 5f # T___W___
# Place 1: 5f //
# Place 2: 5f //
# Place 3: 5f //
# Place 4: 5f //
# Place 5: 5f //
# Place 6: 5f //
# Place 7: 5f //
# Place 8: 5f //
commit;
07 00 00 # playload_length
00 # sequence_id
03 # command_type COM_QUERY
636f6d6d6974 # commit
server :response
17 00 00 # playload_length
01 # sequence_id
00000002400000000e050908
5f 5f 5f 5f 5f 5f 5f 5f # ________
040100
# Place 1: 5f //
# Place 2: 5f //
# Place 3: 5f //
# Place 4: 5f //
# Place 5: 5f //
# Place 6: 5f //
# Place 7: 5f //
# Place 8: 5f //
3.まとめ
セッションの設定track_transaction_infoパラメータの後、MySQLの戻りパケットで現在の接続のトランザクションステータス情報を取得できます.データベースミドルウェアでは、この機能を利用してMySQLが故障した場合、自動的に接続を移行し、ユーザーへの影響を減らすことができます.一部のシーンで最下位のMySQLノードをフェイルオーバーできるようになり、アプリケーションにとっては感知されずに過去を切り替えることができます.