MySQL道普請便り

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

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 |
+--------------+---------------+--------------------------------------------+-------------------+

SHOW SLAVE STATUSとの対応表

これらのレプリケーションテーブルはSHOW SLAVE STATUSで表示しきれない情報の補填である面が強く、まだまだ情報は乏しいです。SHOW SLAVE STATUSと対応していないものも多いですが、MySQL5.7.17時点での対応表となります。

SHOW SLAVE STATUSカラムperformance_schemaテーブルperformance_schemaカラム
Slave_IO_State未対応未対応
Master_Hostreplication_connection_configurationHOST
Master_User replication_connection_configurationUSER
Master_Portreplication_connection_configurationPORT
Connect_Retryreplication_connection_configurationCONNECTION_RETRY_INTERVAL
Master_Log_File未対応未対応
Read_Master_Log_Pos未対応未対応
Relay_Log_File未対応未対応
Relay_Log_Pos未対応未対応
Relay_Master_Log_File未対応未対応
Slave_IO_Runningreplication_connection_statusSERVICE_STATE
Slave_SQL_Runningreplication_applier_status_by_worker
replication_applier_status_by_coordinator
SERVICE_STATE
Replicate_Do_DB未対応未対応
Replicate_Ignore_DB未対応未対応
Replicate_Do_Table未対応未対応
Replicate_Ignore_Table未対応未対応
Replicate_Wild_Do_Table未対応未対応
Replicate_Wild_Ignore_Table未対応未対応
Last_Errno未対応未対応
Last_Error未対応未対応
Skip_Counter未対応未対応
Exec_Master_Log_Pos未対応未対応
Relay_Log_Space未対応未対応
Until_Condition未対応未対応
Until_Log_File未対応未対応
Until_Log_Pos未対応未対応
Master_SSL_Allowedreplication_connection_configurationSSL_ALLOWED
Master_SSL_CA_Filereplication_connection_configuration SSL_CA_FILE
Master_SSL_CA_Pathreplication_connection_configurationSSL_CA_PATH
Master_SSL_Certreplication_connection_configurationSSL_CERTIFICATE
Master_SSL_Cipherreplication_connection_configurationSSL_CIPHER
Master_SSL_Keyreplication_connection_configurationSSL_KEY
Seconds_Behind_Master未対応未対応
Master_SSL_Verify_Server_Certreplication_connection_configurationSSL_VERIFY_SERVER_CERTIFICATE
Last_IO_Errnoreplication_connection_statusLAST_ERROR_NUMBER
Last_IO_Errorreplication_connection_statusLAST_ERROR_MESSAGE
Last_SQL_Errnoreplication_applier_status_by_worker
replication_applier_status_by_coordinator
LAST_ERROR_NUMBER
Last_SQL_Errorreplication_applier_status_by_worker
replication_applier_status_by_coordinator
LAST_ERROR_MESSAGE
Replicate_Ignore_Server_Ids未対応未対応
Master_Server_Id未対応未対応
Master_UUIDreplication_connection_statusSOURCE_UUID
Master_Info_File未対応未対応
SQL_Delayreplication_applier_configurationDESIRED_DELAY
SQL_Remaining_Delayreplication_applier_statusREMAINING_DELAY
Slave_SQL_Running_State未対応未対応
Master_Retry_Countreplication_connection_configurationCONNECTION_RETRY_COUNT
Master_Bindreplication_connection_configurationNETWORK_INTERFACE
Last_IO_Error_Timestampreplication_connection_statusLAST_ERROR_TIMESTAMP
Last_SQL_Error_Timestampreplication_applier_status_by_worker
replication_applier_status_by_coordinator
LAST_ERROR_TIMESTAMP
Master_SSL_Crlreplication_connection_configurationSSL_CRL_FILE
Master_SSL_Crlpathreplication_connection_configurationSSL_CRL_PATH
Retrieved_Gtid_Setreplication_connection_statusRECEIVED_TRANSACTION_SET
Executed_Gtid_Setreplication_applier_status_by_workerLAST_SEEN_TRANSACTION(直近のトランザクション情報のみ)
Auto_Positionreplication_connection_configurationAUTO_POSITION
Replicate_Rewrite_DB未対応未対応
Channel_NameすべてのテーブルCHANNEL_NAME
Master_TLS_Version未対応未対応

まとめ

今回、performance_schemaのレプリケーションテーブルについて紹介しました。その理由として、MySQL5.7.17からGAとなったGroup Replicationではレプリケーションの情報をSHOW SLAVE STATUSで確認することができず、performance_schemaのレプリケーションテーブルを用いてモニタリングしていくことになるためです。今後、変更される可能性もありますが、MySQL5.7.17時点ではそうです。しかし、MySQLを運用している人が最初に確認するであろうカラムSeconds_Behind_Masterがまだ未対応であったり、SHOW SLAVE STATUSと比べて情報がまだまだ少ないためこれから発展していく機能であると考えられます。

おすすめ記事

記事・ニュース一覧