MySQL フェイルオーバー ノート: アプリケーション対応設計の詳細な説明

MySQL フェイルオーバー ノート: アプリケーション対応設計の詳細な説明

1. はじめに

周知のように、データベース ミドルウェアの読み取り/書き込み分離のアプリケーション シナリオでは、基盤となるデータベースで障害のあるノードが発生した場合に、ミドルウェアがユーザーに気付かれないようにデータベース接続を迅速に切断または移行できるようにする方法が重要です。

MySQL データベースでは、解決策を提供するために session_track_transaction_info パラメータが提供されています。

公式ドキュメントにはこのパラメータに関する記述がないため、この記事ではこのパラメータのオプション値を具体的に紹介し、実際の影響を検証します。あまり話さずに、編集者と一緒に詳しい紹介を見てみましょう

2. session_track_transaction_infoパラメータ

2.1 パラメータの紹介

MySQL 5.7 では、session_track_transaction_info 変数を設定することでトランザクションのステータスを追跡できます。

  • このパラメータは、グローバルとセッションの 2 つのレベルで存在し、動的に変更できます。
  • このパラメータに設定できる値は0(デフォルトOFF)、1、2です。
/**
 取引追跡レベル
*/
列挙型 enum_session_track_transaction_info {
 TX_TRACK_NONE = 0, ///< トランザクション情報にトラッカー項目を送信しない
 TX_TRACK_STATE = 1, ///< トランザクションステータスを追跡する
 TX_TRACK_CHISTICS = 2 ///< トラックの状態と特性
};

このパラメータに許可される値は 0、1、2 です。

  • 0 に設定すると、 show variables like '%session_track_transaction_info%' 、トランザクション ステータスの追跡が有効になっていないことが示されます。
  • 1に設定すると、 show variables like '%session_track_transaction_info%'が表示され、追跡トランザクションの状態を示すSTATEが表示されます。
  • 2 に設定すると、 show variables like '%session_track_transaction_info%'

2.2 パラメータ設定の影響

session_track_transaction_info パラメータがオンになっている場合、トランザクション ステータス レコードをデータベース内で直接照会することはできません。

[WL#4797] によれば、MySQL は各クエリ要求によって返される OK パケットにトランザクション ステータス追跡情報を記録します。

パケットをキャプチャすることで、トランザクションのステータス情報を表示できます。

2.2.1 ネイティブ MySQL OK パケット形式

OK パケットデータパケットフォーマット定義

タイプ名前説明する
整数<1>0x00 または 0xFE は、データ パケットが OK パケットであることを示します。
整数影響を受ける行数影響を受ける行数
整数最後に挿入されたID最後に挿入されたID
整数<2>ステータスインジケーターCLIENT_PROTOCOL_41が定義されている場合は、この部分があります
整数<2>警告の数警告の数。CLIENT_PROTOCOL_41 が定義されている場合、この部分が表示されます。
整数<2>ステータスインジケーターCLIENT_TRANSACTIONSが定義されている場合は、この部分があります
情報人間が判読できるステータス情報。CLIENT_SESSION_TRACK が定義されている場合、このセクションが表示されます。
セッション状態セッション状態情報。SERVER_SESSION_STATE_CHANGED が定義されている場合、このセクションが表示されます。
情報人間が読める情報

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 要求にカプセル化され、サーバーに送信されます。サーバーはそれを解析して実行した後、結果をデータ パケットにカプセル化して返します)。

位置情報を表示具体的な意味
1位取引Tは明示的にトランザクションを開始する
暗黙的にトランザクションを開始します (@autocommit=0)
_ アクティブな取引はありません
2位安全でない読み取りr 非トランザクションストレージエンジンのテーブルが現在のトランザクションで読み取られる
_ 現在のトランザクションでは、非トランザクション ストレージ エンジンを持つテーブルは読み込まれません。
3位トランザクション読み取りR トランザクションストレージエンジンのテーブルは現在のトランザクションで読み取られます
_ 現在のトランザクションではトランザクション ストレージ エンジン テーブルは読み込まれません
4位安全でない書き込みw 非トランザクションストレージエンジンのテーブルは現在のトランザクションで書き込まれます
_ 現在のトランザクションでは、非トランザクションストレージエンジンのテーブルにデータは書き込まれません
5位トランザクション書き込みW トランザクションストレージエンジンのテーブルは現在のトランザクションに書き込まれます
_ 現在のトランザクションでは、トランザクション ストレージ エンジン テーブルにデータは書き込まれません。
6位安全でないステートメントs UUID() と同様に、現在のトランザクションで安全でないステートメントが使用されています
_ 同様の安全でないステートメントは使用されていない
7位結果セットSは結果セットをクライアントに送信する
_ 結果セットなし
8位ロックされたテーブルL テーブルは、LOCK TABLES ステートメントを使用して明示的にロックされます。
_ 現在のトランザクションではテーブルロックはありません

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 をご愛顧いただきありがとうございます。

以下もご興味があるかもしれません:
  • MYSQL マスターとスレーブの同期外れの問題に対する解決策
  • オンライン MYSQL 同期エラーのトラブルシューティング方法の概要 (必読)
  • MySQL での MHA 高可用性フェイルオーバー ソリューションのスーパー デプロイメント チュートリアル
  • MySQLの遅いクエリが失敗の原因となった
  • MySQL レプリケーションの概要、インストール、トラブルシューティング、ヒント、ツール (Huo Ding による共有)
  • MySQLテーブル障害を検出する方法
  • MySQL 接続失敗の一般的な障害と原因
  • MySQL が失敗し、アプリケーションが直接切断され、データがロックされる (本番環境障害)

<<:  要素のel-tree複数選択ツリー(チェックボックス)親子ノードの関連付けが関連付けられていません

>>:  Linux プロセスの CPU 使用率が 700% に達し、終了できない場合の解決策

推薦する

Web プロジェクト開発における 2 つのトークン理由とサンプル コードの分析

目次質問:プロジェクトには 2 つのトークンがあり、1 つは有効期間が 2 時間 (ショート トーク...

Docker ベースの Redis クラスターの構築方法

Redisイメージをダウンロードする docker pull yyyyttttwww/redis を...

Win2008 サーバー セキュリティ チェック手順ガイド (日常のメンテナンス手順)

ドキュメントはしばらく前から書いていましたが、アップロードする勇気がありませんでした。サーバーのセキ...

Linux プラットフォームでの Zabbix エージェントのインストールと設定方法

ここでは、Linux プラットフォームでの Zabbix エージェントのインストールと構成について簡...

Prometheusコンテナのデプロイメントのための実用的なソリューション

環境ホスト名IPアドレス仕えるプロメテウス192.168.237.137プロメテウス、グラファナノー...

HTML+CSSを使用してTG-visionホームページを作成する方法

今回はHTML+CSSレイアウトを使用して、TG-vision Shuanghui Mediaのホー...

忘れられたMySQLパスワードとログインエラーの問題について簡単に説明します

MySQL ログイン パスワードを忘れた場合、解決方法は実はとても簡単です。MySQL メイン構成フ...

ディスク容量不足による MySQL レプリケーション障害の解決方法

目次ケースシナリオ問題を解決するまとめケースシナリオ本日、オンラインで問題が発見されました。監視範囲...

シンプルな画像ドラッグ効果を実現する js

この記事では、簡単な画像ドラッグ効果を実現するためのjsの具体的なコードを参考までに紹介します。具体...

VueはEchartsを使用して3次元棒グラフを実装します

この記事では、Echartsを使用して3次元棒グラフを実装するVueの具体的なコードを参考までに共有...

JavaScript はチェックボックスの選択機能を実装します

この記事の例では、すべてのチェックボックスの選択を実現するためのJavaScriptの具体的なコード...

MySQL 5.7.24 圧縮パッケージのインストールと設定方法のグラフィックチュートリアル

この記事では、参考までにMySQL 5.7.24圧縮パッケージのインストールチュートリアルを紹介しま...

MySQL ページングパフォーマンスの調査

一般的なページング方法: 1. エスカレーター方式エスカレーター方式では通常、前のページ/次のページ...

Vue はモバイル端末にマルチグリッド入力ボックスを実装

最近、同社は、下図に示すように、h5 ページ操作を完了するという要件を提示しました。 ネットで入手で...

IE10以下のimgタグ問題の解決方法

問題を見つける以前、簡単なデモを書いたのですが、IE10以下では動作しないことがわかりました。ここに...