MySQL道普請便り

第36回 performance_schemaのレプリケーションテーブルについて

この記事を読むのに必要な時間:およそ 6 分

MySQL5.7以降から,複数のperformance_schemaのテーブルからレプリケーションの情報を確認できるようになりました。今回はそれらのテーブルから確認できる内容や,従来のスレーブの情報を確認するためのコマンドSHOW SLAVE STATUSとの違いなどについて紹介します。MySQLのバージョンはMySQL5.7.17を使用します。

performance_schemaレプリケーションテーブル一覧

追加されたレプリケーションテーブルの一覧です。

  • replication_connection_configuration …マスターの接続パラメータ(IO_THREAD)
  • replication_connection_status …マスターの接続状態(IO_THREAD)
  • replication_applier_configuration …アプライアーの情報(SQL_THREAD)
  • replication_applier_status …アプライアーの状態(SQL_THREAD)
  • replication_applier_status_by_coordinator …コーディネータスレッドの情報
  • replication_applier_status_by_worker …ワーカースレッドの情報
  • replication_group_member_stats …グループレプリケーションの統計情報
  • replication_group_members …グループレプリケーションのメンバー情報

connectionを含むテーブル名はIO_THREADapplierを含むテーブル名はSQL_THREADの情報が格納されています。そして,groupを含むテーブル名はMySQL5.7.17からGAとなったGroup Replicationの情報が格納されています。

すべてのレプリケーションテーブルの先頭のカラムはCHANNEL_NAMEとなっていて,複数のチャンネルに対応したものとなります。このチャンネルというものはMySQL5.7以降から導入された概念でスレーブが1つのマスターを識別する単位(IO_THREAD+Relay_Log+SQL_THREAD)をチャンネルと呼びます。

MySQL5.7以降の機能であるマルチソースレプリケーションでは1つのスレーブが複数のマスターをもつことができます。スレーブはマスターごとにチャンネルを開くことができ,各チャンネルには独自のIO_THREAD,Relay_Logとアプライアースレッド(SQL_THREAD)をもつので,それぞれを独立して機能させることができます。また,チャンネル名を指定せずにレプリケーションを構成した場合,チャンネル名は '' ⁠空文字列)となります。

SHOW SLAVE STATUSとの比較

従来の単一マスター/スレーブ構成であればSHOW SLAVE STATUSで情報がすべて把握できますが,MySQL5.6以降の機能マルチスレッドスレーブや前述のマルチソースレプリケーションなどを使用していると,以下のような問題があります。レプリケーションテーブルはそれらの問題に対応しています。

  • 特定のカラムの情報だけを取得するのが困難
  • 取得できる情報が不足
  • SHOW SLAVE STATUSの表示が長くなり視認性が悪い

マルチスレッドスレーブ(MTS)

たとえば,slave_parallel_workers=2のスレーブは2つのワーカースレッドでMTSが稼働しています。このときにSHOW SLAVE STATUSを確認してもいくつのワーカースレッドが稼働しているかの情報が不足しています。そんなときは,replication_applier_status_by_workerを見ます。

select * from replication_applier_status_by_worker;
+--------------+-----------+-----------+---------------+-----------------------+-------------------+--------------------+----------------------+
| CHANNEL_NAME | WORKER_ID | THREAD_ID | SERVICE_STATE | LAST_SEEN_TRANSACTION | LAST_ERROR_NUMBER | LAST_ERROR_MESSAGE | LAST_ERROR_TIMESTAMP |
+--------------+-----------+-----------+---------------+-----------------------+-------------------+--------------------+----------------------+
|              |         1 |        27 | ON            | ANONYMOUS             |                 0 |                    | 0000-00-00 00:00:00  |
|              |         2 |        28 | ON            | ANONYMOUS             |                 0 |                    | 0000-00-00 00:00:00  |
+--------------+-----------+-----------+---------------+-----------------------+-------------------+--------------------+----------------------+

このようにワーカースレッドが2つが稼働していることがわかり,ワーカースレッドごとの状態を確認することができます。

マルチソースレプリケーション

下記はマルチソースレプリケーションでマスターが2台構成のスレーブで実行したSHOW SLAVE STATUSの表示です(表示は一部割愛しています)⁠Channel_Nameの値からchannel1channel2のチャンネルが存在していることがわかります。

show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 127.0.0.1
                  Master_User: test
                  Master_Port: 20192
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 7666
               Relay_Log_File: mysql-relay-channel1.000002
                Relay_Log_Pos: 3834
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
        Seconds_Behind_Master: 0
           Retrieved_Gtid_Set: 00020192-1111-1111-1111-111111111111:18-31
            Executed_Gtid_Set: 00020192-1111-1111-1111-111111111111:1-31,
00020193-2222-2222-2222-222222222222:1-29
                Auto_Position: 1
         Replicate_Rewrite_DB:
                 Channel_Name: channel1
           Master_TLS_Version:
*************************** 2. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 127.0.0.1
                  Master_User: test
                  Master_Port: 20193
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 7444
               Relay_Log_File: mysql-relay-channel2.000002
                Relay_Log_Pos: 7657
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
        Seconds_Behind_Master: 0
           Retrieved_Gtid_Set: 00020193-2222-2222-2222-222222222222:1-29
            Executed_Gtid_Set: 00020192-1111-1111-1111-111111111111:1-31,
00020193-2222-2222-2222-222222222222:1-29
                Auto_Position: 1
         Replicate_Rewrite_DB:
                 Channel_Name: channel2
           Master_TLS_Version:

このように表示されるため,チャンネル数が増えていくと視認性が悪くなります。かつ,特定のカラムの情報だけ見たいときもmysqlコマンドのpagerオプションを駆使するなど手間な作業になります。

レプリケーションテーブルを使えば,情報がテーブルごと分割されていて,SQLを使用して特定のカラムを取得することができます。

replication_applier_status_by_worker

select * from replication_applier_status_by_worker;
+--------------+-----------+-----------+---------------+-----------------------------------------+-------------------+--------------------+----------------------+
| CHANNEL_NAME | WORKER_ID | THREAD_ID | SERVICE_STATE | LAST_SEEN_TRANSACTION                   | LAST_ERROR_NUMBER | LAST_ERROR_MESSAGE | LAST_ERROR_TIMESTAMP |
+--------------+-----------+-----------+---------------+-----------------------------------------+-------------------+--------------------+----------------------+
| channel1     |         0 |        39 | ON            | 00020192-1111-1111-1111-111111111111:31 |                 0 |                    | 0000-00-00 00:00:00  |
| channel2     |         0 |        41 | ON            | 00020193-2222-2222-2222-222222222222:29 |                 0 |                    | 0000-00-00 00:00:00  |
+--------------+-----------+-----------+---------------+-----------------------------------------+-------------------+--------------------+----------------------+

replication_connection_status

select CHANNEL_NAME,SERVICE_STATE,RECEIVED_TRANSACTION_SET,LAST_ERROR_NUMBER from replication_connection_status;
+--------------+---------------+--------------------------------------------+-------------------+
| CHANNEL_NAME | SERVICE_STATE | RECEIVED_TRANSACTION_SET                   | LAST_ERROR_NUMBER |
+--------------+---------------+--------------------------------------------+-------------------+
| channel1     | ON            | 00020192-1111-1111-1111-111111111111:18-31 |                 0 |
| channel2     | ON            | 00020193-2222-2222-2222-222222222222:1-29  |                 0 |
+--------------+---------------+--------------------------------------------+-------------------+

著者プロフィール

北川健太郎(きたがわけんたろう)

LINE株式会社所属のデータベースエンジニア。担当はMySQLとOracle Database。好きなMySQLの機能はレプリケーションで,好きなOracleDatabaseの機能はログオントリガー。

Twitter:@keny_lala

コメント

コメントの記入