1. はじめに 周知のように、データベース ミドルウェアの読み取り/書き込み分離のアプリケーション シナリオでは、基盤となるデータベースで障害のあるノードが発生した場合に、ミドルウェアがユーザーに気付かれないようにデータベース接続を迅速に切断または移行できるようにする方法が重要です。 MySQL データベースでは、解決策を提供するために session_track_transaction_info パラメータが提供されています。 公式ドキュメントにはこのパラメータに関する記述がないため、この記事ではこのパラメータのオプション値を具体的に紹介し、実際の影響を検証します。あまり話さずに、編集者と一緒に詳しい紹介を見てみましょう 2. session_track_transaction_infoパラメータ 2.1 パラメータの紹介 MySQL 5.7 では、session_track_transaction_info 変数を設定することでトランザクションのステータスを追跡できます。
/** 取引追跡レベル */ 列挙型 enum_session_track_transaction_info { TX_TRACK_NONE = 0, ///< トランザクション情報にトラッカー項目を送信しない TX_TRACK_STATE = 1, ///< トランザクションステータスを追跡する TX_TRACK_CHISTICS = 2 ///< トラックの状態と特性 }; このパラメータに許可される値は 0、1、2 です。
2.2 パラメータ設定の影響 session_track_transaction_info パラメータがオンになっている場合、トランザクション ステータス レコードをデータベース内で直接照会することはできません。 [WL#4797] によれば、MySQL は各クエリ要求によって返される OK パケットにトランザクション ステータス追跡情報を記録します。 パケットをキャプチャすることで、トランザクションのステータス情報を表示できます。 2.2.1 ネイティブ MySQL OK パケット形式 OK パケットデータパケットフォーマット定義
int<lenenc> および string<lenenc> の 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 要求にカプセル化され、サーバーに送信されます。サーバーはそれを解析して実行した後、結果をデータ パケットにカプセル化して返します)。
2.2.2 session_track_transaction_info = 0 の場合の OK パケット形式分析 session_track_transaction_info=0 は、トランザクション情報が記録されず、サーバーから返されるすべてのデータ パケットにトランザクション ステータス追跡情報がないことを意味します。 ## セッショントラックトランザクション情報 = 0 クライアントはbegin; encapsulated data packet 06 00 00 # payload_lengthを実行します。 00 # シーケンスID 03 # コマンドタイプ COM_QUERY 62 65 67 69 6e # 開始 サーバーから返されたデータパケット: 応答 07 00 00 # ペイロード長 01 # シーケンスID 00 # ヘッダー 0x00 は OK パケットを示します 00 # 影響を受ける行 0 00 # 最後に挿入されたID 03000000 クライアントは、データパケット1a 00 00 # payload_lengthをカプセル化するために、t1 values(55)に挿入を実行します。 00 # シーケンスID 03 # コマンドタイプ COM_QUERY 696e7365727420696e746f2074312076616c75657328353529 # t1 値に挿入(55) サーバーから返されたデータパケット: 応答 07 00 00 # ペイロード長 01 # シーケンスID 00010003000000 クライアントはコミットを実行します。カプセル化されたデータパケットは07 00 00 # payload_lengthです。 00 # シーケンスID 03 # コマンドタイプ COM_QUERY 636f6d6d6974 # コミット サーバーから返されたデータベース パッケージ: 応答 07 00 00 # ペイロード長 01 # シーケンスID 00000002000000 2.2.4 session_track_transaction_info = 1 の場合の OK パケット形式分析 ## セッショントラックトランザクション情報 = 1 クライアントはbegin; encapsulated data packet 06 00 00 # payload_lengthを実行します。 00 # シーケンスID 03 # コマンドタイプ COM_QUERY 626567696e#開始 サーバーから返されたデータパケット: 応答 14 00 00 # ペイロード長 01 # シーケンスID 00 # ヘッダー 0x00 は OK パケットを示します 00 # 影響を受ける行 0 00 # 最後に挿入されたID 03400000000b050908 54 5f 5f 5f 5f 5f 5f # 取引状況情報 T_______ # 場所 1: 54 //トランザクションを明示的に開きます # 場所 2: 5f //現在のトランザクションでは、非トランザクション ストレージ エンジン テーブルは読み込まれません # 場所 3: 5f //現在のトランザクションでは、トランザクション ストレージ エンジン テーブルは読み込まれません # 場所 4: 5f //現在のトランザクションでは、非トランザクション ストレージ エンジン テーブルは書き込まれません # 場所 5: 5f //現在のトランザクションでは、トランザクション ストレージ エンジン テーブルは書き込まれません # 場所 6: 5f //現在のトランザクションでは、安全でないステートメントは使用されません # 場所 7: 5f //結果セットはありません # 場所 8: 5f //テーブル ロックはありません クライアントは、t1 values(111) カプセル化されたデータ パケット 1b 00 00 への挿入を実行します # payload_length 00 # シーケンスID 03 # コマンドタイプ COM_QUERY 696e7365727420696e746f2074312076616c7565732831313129 # t1 に挿入値(111) サーバーから返されたデータパケット: 応答 14 00 00 # ペイロード長 01 # シーケンスID 00010003400000000b050908 54 5f 5f 5f 57 5f 5f 5f # 取引状況情報 T___W___ # 場所 1: 54 // トランザクションを明示的に開きます # 場所 2: 5f // 現在のトランザクションでは、非トランザクション ストレージ エンジン テーブルは読み込まれません # 場所 3: 5f // 現在のトランザクションでは、トランザクション ストレージ エンジン テーブルは読み込まれません # 場所 4: 5f // 現在のトランザクションでは、非トランザクション ストレージ エンジン テーブルは書き込まれません # 場所 5: 57 // 現在のトランザクションでは、トランザクション ストレージ エンジン テーブルが書き込まれます # 場所 6: 5f // 現在のトランザクションでは、安全でないステートメントは使用されません # 場所 7: 5f // 結果セットはありません # 場所 8: 5f // クライアントはテーブルをロックせずにコミットを実行します。カプセル化されたデータ パケット 07 00 00 # payload_length 00 # シーケンスID 03 # コマンドタイプ COM_QUERY 636f6d6d6974 # コミット サーバーから返されたデータパケット: 応答 1400000100000002400000000b050908 5f 5f 5f 5f 5f 5f 5f 5f # 取引ステータス情報________ # 場所 1: 5f // アクティブなトランザクションはありません。# 場所 2: 5f // 現在のトランザクションでは、非トランザクション ストレージ エンジン テーブルは読み込まれません。# 場所 3: 5f // 現在のトランザクションでは、トランザクション ストレージ エンジン テーブルは読み込まれません。# 場所 4: 5f // 現在のトランザクションでは、非トランザクション ストレージ エンジン テーブルは書き込まれません。# 場所 5: 5f // 現在のトランザクションでは、トランザクション ストレージ エンジン テーブルは書き込まれません。# 場所 6: 5f // 現在のトランザクションでは、安全でないステートメントは使用されません。# 場所 7: 5f // 結果セットはありません。# 場所 8: 5f // テーブル ロックはありません。 2.2.5 session_track_transaction_info = 2 の場合の OK パケット形式解析 session_track_transaction_info パラメータを 2 に設定すると、より詳細なトランザクション ステータス情報が表示されます。 クライアントはbegin; encapsulated data packet 06 00 00 # payload_lengthを実行します。 00 # シーケンスID 03 # コマンドタイプ COM_QUERY 626567696e#開始 サーバーから返されたデータパケット: 応答 29 00 00 # ペイロード長 01 # シーケンスID 000000034000000020050908 54 5f 5f 5f 5f 5f 5f 5f # 取引状況情報 T_______ 0413125354415254205452414e53414354494f4e3b # トランザクションを開始します。 # 場所 1: 54 //トランザクションを明示的に開きます # 場所 2: 5f //現在のトランザクションでは、非トランザクション ストレージ エンジン テーブルは読み込まれません # 場所 3: 5f //現在のトランザクションでは、トランザクション ストレージ エンジン テーブルは読み込まれません # 場所 4: 5f //現在のトランザクションでは、非トランザクション ストレージ エンジン テーブルは書き込まれません # 場所 5: 5f //現在のトランザクションでは、トランザクション ストレージ エンジン テーブルは書き込まれません # 場所 6: 5f //現在のトランザクションでは、安全でないステートメントは使用されません # 場所 7: 5f //結果セットはありません # 場所 8: 5f //テーブル ロックはありません クライアントは、t1 values(222) カプセル化されたデータ パケット 1b 00 00 への挿入を実行します # payload_length 00 # シーケンスID 03 # コマンドタイプ COM_QUERY 696e7365727420696e746f2074312076616c7565732832323229 # t1 に挿入値 (222) サーバーから返されたデータパケット: 応答 14 00 00 # ペイロード長 01 # シーケンスID 00010003400000000b050908 54 5f 5f 5f 57 5f 5f 5f # 取引状況情報 T___W___ # 場所 1: 5f // アクティブなトランザクションはありません。# 場所 2: 5f // 現在のトランザクションで非トランザクション ストレージ エンジン テーブルが読み取られていません。# 場所 3: 5f // 現在のトランザクションでトランザクション ストレージ エンジン テーブルが読み取られていません。# 場所 4: 5f // 現在のトランザクションで非トランザクション ストレージ エンジン テーブルが書き込まれていません。# 場所 5: 5f // 現在のトランザクションでトランザクション ストレージ エンジン テーブルが書き込まれていません。# 場所 6: 5f // 現在のトランザクションで安全でないステートメントが使用されていません。# 場所 7: 5f // 結果セットはありません。# 場所 8: 5f // テーブルはロックされていません。クライアントがコミットを実行します。カプセル化されたデータ パケット 07 00 00 # payload_length 00 # シーケンスID 03 # コマンドタイプ COM_QUERY 636f6d6d6974 # コミット サーバーから返されたデータパケット: 応答 17 00 00 # ペイロード長 01 # シーケンスID 00000002400000000e050908 5f 5f 5f 5f 5f 5f 5f 5f # 取引ステータス情報________ 040100 # 場所 1: 5f // アクティブなトランザクションはありません。# 場所 2: 5f // 現在のトランザクションでは、非トランザクション ストレージ エンジン テーブルは読み込まれません。# 場所 3: 5f // 現在のトランザクションでは、トランザクション ストレージ エンジン テーブルは読み込まれません。# 場所 4: 5f // 現在のトランザクションでは、非トランザクション ストレージ エンジン テーブルは書き込まれません。# 場所 5: 5f // 現在のトランザクションでは、トランザクション ストレージ エンジン テーブルは書き込まれません。# 場所 6: 5f // 現在のトランザクションでは、安全でないステートメントは使用されません。# 場所 7: 5f // 結果セットはありません。# 場所 8: 5f // テーブル ロックはありません。 3. 結論 session_track_transaction_info パラメータを設定すると、現在の接続のトランザクション ステータス情報が MySQL の戻りデータ パケットで取得できるようになります。 この機能をデータベース ミドルウェアで使用すると、MySQL に障害が発生した場合に接続を自動的に移行し、ユーザーへの影響を軽減できます。 シナリオによっては、基盤となる MySQL ノードの障害により切り替えが発生し、アプリケーションが気付かずに切り替わる場合があります。 さて、以上がこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM をご愛顧いただきありがとうございます。 以下もご興味があるかもしれません:
|
<<: 要素のel-tree複数選択ツリー(チェックボックス)親子ノードの関連付けが関連付けられていません
>>: Linux プロセスの CPU 使用率が 700% に達し、終了できない場合の解決策
Nginx によるソケット ポート転送の一般的なシナリオ: オンライン学習アプリケーションでは、通常...
この記事の例では、記事の折りたたみと展開の機能を実現するためのjQueryの具体的なコードを参考まで...
1. 背景1.1 問題点最近の製品テスト レポートでは、PKI ベースの認証方法の使用が推奨されて...
背景要件:ビジネスがどんどん大きくなると、サーバーの数も増え、さまざまなアクセスログ、アプリケーショ...
margin:auto; + position: absolute; 上、下、左、右:0デモを見れ...
最近、私はプロジェクトに取り組んでおり、背景を記述するために SQL ステートメントを使用する必要が...
最近、次のような効果を達成する必要がある最初は、CSS3D回転を使用して記述すると、次の効果しか得ら...
この記事に誤りがあったり、ご提案がありましたら、お気軽にご連絡ください。よろしくお願いいたします。は...
1. mysqldump バックアップ方法では論理バックアップが使用されます。最大の欠点は、バック...
方法1: SET PASSWORDコマンドを使用する mysql> username@loca...
MySQLのインストール(4、5、6は省略可能)ステートメント: CentOS のバージョンは 7....
目次非同期トラバーサル非同期反復可能トラバーサル非同期反復生成非同期メソッドと非同期ジェネレーター非...
1. 物件リストコードをコピーコードは次のとおりです。色: #999999 テキスト色フォントファミ...
CSS3 のボックス サイズ設定 (content-box と border-box) CSS3 の...
序文var は ES5 における変数宣言方法です。var で変数を宣言するとループ変数がグローバル変...