MySQLフェイルオーバーの応用無感知設計

20140 ワード

  • 1. 概要
  • 2. session_track_transaction_infoパラメータ
  • 2.1パラメータ紹介
  • 2.2パラメータ設定の影響
  • 2.2.1オリジナルMySQL OKパッケージ形式
  • 2.2.3 session_track_transaction_info追加情報
  • 2.2.2 session_track_transaction_info=0の場合OK packet形式解析
  • 2.2.4 session_track_transaction_info=1の場合OK packet形式解析
  • 2.2.5 session_track_transaction_info=2の場合OK packet形式解析

  • 3. まとめ

  • 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ノードをフェイルオーバーできるようになり、アプリケーションにとっては感知されずに過去を切り替えることができます.