MySQL道普請便り

第273回MySQL Group ReplicationのFlow Control統計コンポーネント

MySQL 9.1以降、Group Replicationのフロー制御統計を取得できるコンポーネント「Group Replication Flow Control Statistics Component」が提供されています。本記事では、このコンポーネントの概要とインストール方法、Single-Primary / Multi-Primaryの両モードでの実際の動作を検証した結果を紹介します。

MySQL Group ReplicationのFlow Controlの仕組みについては過去の記事も参考にしてください。

コンポーネントが提供するステータス変数

コンポーネントをインストールすると、以下の4つのグローバルステータス変数が追加されます。

変数名 説明
Gr_flow_control_throttle_active_count 現在throttleされているトランザクション数
Gr_flow_control_throttle_count throttleされたトランザクションの累計数
Gr_flow_control_throttle_last_throttle_timestamp 最後にthrottleが発生した日時
Gr_flow_control_throttle_time_sum throttleによる遅延の累計時間(マイクロ秒)

変数はperformance_schema.global_statusまたはSHOW GLOBAL STATUS LIKE 'Gr\_flow\_control%'で参照します。

インストールと依存関係

group_replicationプラグインが起動済みであることが前提です。プラグインが存在しない状態でインストールしようとすると、依存解決エラーになります。

INSTALL COMPONENT 'file://component_group_replication_flow_control_stats';
mysql> INSTALL COMPONENT 'file://component_group_replication_flow_control_stats';
ERROR 3534 (HY000): Cannot satisfy dependency for service 'group_replication_flow_control_metrics_service' required by component 'mysql:group_replication_flow_control_stats'.

また、コンポーネントがインストールされている状態ではUNINSTALL PLUGIN group_replicationは失敗します。先にコンポーネントをアンインストールしてからプラグインを削除する必要があります。

mysql> UNINSTALL PLUGIN group_replication;
ERROR 1883 (HY000): Plugin 'group_replication' cannot be uninstalled now. Please uninstall the component 'component_group_replication_flow_control_stats' and then UNINSTALL PLUGIN group_replication.
正しい順序
UNINSTALL COMPONENT 'file://component_group_replication_flow_control_stats';
UNINSTALL PLUGIN group_replication;

検証

検証環境

MySQL 9.7.0 LTS、3ノード構成で検証しました。

Single-Primaryモードでの検証

node1がPRIMARY、node2/3がSECONDARYの構成で検証します。Single-PrimaryのSECONDARYノードではsuper_read_only = ONのため、インストールには一時的な解除が必要です。

フロー制御を強制発動させる設定

閾値を極端に小さくして、少数のトランザクションでもthrottleが発生するようにします。

SET GLOBAL group_replication_flow_control_certifier_threshold = 1;
SET GLOBAL group_replication_flow_control_applier_threshold   = 1;
SET GLOBAL group_replication_flow_control_max_quota           = 1;

検証結果

PRIMARY(node1)から100件のINSERTを並列実行した後のステータスです。

node1(PRIMARY)
mysql> SHOW GLOBAL STATUS LIKE 'Gr_flow_control%';
+--------------------------------------------------+----------------------------+
| Variable_name                                    | Value                      |
+--------------------------------------------------+----------------------------+
| Gr_flow_control_throttle_active_count            | 0                          |
| Gr_flow_control_throttle_count                   | 84                         |
| Gr_flow_control_throttle_last_throttle_timestamp | 2026-06-12 10:02:44.969563 |
| Gr_flow_control_throttle_time_sum                | 79905449                   |
+--------------------------------------------------+----------------------------+
node2(SECONDARY)
mysql> SHOW GLOBAL STATUS LIKE 'Gr_flow_control%';
+--------------------------------------------------+-------+
| Variable_name                                    | Value |
+--------------------------------------------------+-------+
| Gr_flow_control_throttle_active_count            | 0     |
| Gr_flow_control_throttle_count                   | 0     |
| Gr_flow_control_throttle_last_throttle_timestamp |       |
| Gr_flow_control_throttle_time_sum                | 0     |
+--------------------------------------------------+-------+

throttleの統計はthrottleが発生したPRIMARYにのみ記録されます。SECONDARYはトランザクションを受信・適用する側であるためthrottleは行われず、メトリクスは常に0となります。

メトリクスのライフサイクル

STOP GROUP_REPLICATIONを実行してもメトリクスの値は保持されます。START GROUP_REPLICATIONでGRを再起動するとメトリクスはリセットされます。そのため、メトリクスは直前のGR起動からの累積値です。

STOP GROUP_REPLICATION後(値は保持)
mysql> STOP GROUP_REPLICATION;
Query OK, 0 rows affected (3.03 sec)

mysql> SHOW GLOBAL STATUS LIKE 'Gr_flow_control%';
+--------------------------------------------------+----------------------------+
| Variable_name                                    | Value                      |
+--------------------------------------------------+----------------------------+
| Gr_flow_control_throttle_active_count            | 0                          |
| Gr_flow_control_throttle_count                   | 84                         |
| Gr_flow_control_throttle_last_throttle_timestamp | 2026-06-12 10:02:44.969563 |
| Gr_flow_control_throttle_time_sum                | 79905449                   |
+--------------------------------------------------+----------------------------+
START GROUP_REPLICATION後(値がリセット)
mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (2.85 sec)

mysql> SHOW GLOBAL STATUS LIKE 'Gr_flow_control%';
+--------------------------------------------------+-------+
| Variable_name                                    | Value |
+--------------------------------------------------+-------+
| Gr_flow_control_throttle_active_count            | 0     |
| Gr_flow_control_throttle_count                   | 0     |
| Gr_flow_control_throttle_last_throttle_timestamp |       |
| Gr_flow_control_throttle_time_sum                | 0     |
+--------------------------------------------------+-------+

Multi-Primaryモードでの検証

検証環境

node1、node2を書き込みノードとし、node3をリードノードとするMulti-Primaryモードで検証します。Multi-Primaryモードでは全ノードがPRIMARYとなりsuper_read_onlyがOFFになるため、各ノードで直接コンポーネントをインストールできます。

検証結果

node1、node2それぞれから50件のINSERTを並列実行した後のステータスです。

node1(書き込みあり)
mysql> SHOW GLOBAL STATUS LIKE 'Gr_flow_control%';
+--------------------------------------------------+----------------------------+
| Variable_name                                    | Value                      |
+--------------------------------------------------+----------------------------+
| Gr_flow_control_throttle_active_count            | 0                          |
| Gr_flow_control_throttle_count                   | 43                         |
| Gr_flow_control_throttle_last_throttle_timestamp | 2026-06-12 10:04:47.860489 |
| Gr_flow_control_throttle_time_sum                | 41122039                   |
+--------------------------------------------------+----------------------------+
node2(書き込みあり)
mysql> SHOW GLOBAL STATUS LIKE 'Gr_flow_control%';
+--------------------------------------------------+----------------------------+
| Variable_name                                    | Value                      |
+--------------------------------------------------+----------------------------+
| Gr_flow_control_throttle_active_count            | 0                          |
| Gr_flow_control_throttle_count                   | 40                         |
| Gr_flow_control_throttle_last_throttle_timestamp | 2026-06-12 10:04:46.940424 |
| Gr_flow_control_throttle_time_sum                | 34275139                   |
+--------------------------------------------------+----------------------------+
node3(書き込みなし)
mysql> SHOW GLOBAL STATUS LIKE 'Gr_flow_control%';
+--------------------------------------------------+-------+
| Variable_name                                    | Value |
+--------------------------------------------------+-------+
| Gr_flow_control_throttle_active_count            | 0     |
| Gr_flow_control_throttle_count                   | 0     |
| Gr_flow_control_throttle_last_throttle_timestamp |       |
| Gr_flow_control_throttle_time_sum                | 0     |
+--------------------------------------------------+-------+

Multi-Primaryモードでは各PRIMARYが独立してthrottleメトリクスを記録します。書き込みを行ったnode1、node2はそれぞれ自身の統計を持ち、書き込みのなかったnode3は0のままとなっています。

Single-PrimaryとMulti-Primaryの比較
観点 Single-Primary Multi-Primary
throttleが記録されるノード PRIMARY のみ 書き込みを行ったnodeごと
コンポーネントインストール SECONDARYはsuper_read_only解除が必要 全ノードで直接実行可
GR再起動後のリセット リセットされる リセットされる

まとめ

従来ではCOUNT_TRANSACTIONS_IN_QUEUEなどを見て「発動中かどうか」しかわからなかったものが、component_group_replication_flow_control_statsを利用することで、フロー制御の発生頻度や遅延時間を定量的に把握できるようになりました。

フォーマンス低下の原因特定
書き込み速度が低下したとき、throttle_countthrottle_time_sumを確認することでFlow Controlが原因かどうかを即座に判断できます。
監視⁠アラートへの組み込み
throttle_countの増加量やthrottle_time_sumを定期収集し、閾値を超えた場合にアラートを出す運用が可能です。
インフラ改善の判断材料
throttle_time_sumの累積値からどの程度の書き込み遅延が発生しているかを定量化でき、スペックアップや閾値調整の根拠として活用できます。

Single-PrimaryではPRIMARY 1点の監視で足りますが、Multi-Primaryでは各書き込みノードのメトリクスを個別に収集する必要があります。メトリクスはGR起動ごとにリセットされるため、継続的な監視には外部ツールで定期的に取得する運用が必要です。

参考情報

おすすめ記事

記事・ニュース一覧