MySQL Group ReplicationとはInnoDBで利用可能なレプリケーションプラグインです。複数台のMySQLサーバーをクラスタとして構築でき、従来のSource/
Group Replicationとは?
Group Replicationは複数台のMySQLサーバをクラスタとして構成し、同一の更新履歴を全ノードに届けるためのレプリケーションプラグインです。整合性を保つ仕組みや自動フェイルオーバーが可能などの特徴があります。シングルプライマリのみならずマルチプライマリモードもサポートしており、複数ノードでの同時書き込みをサポートしています。ただし、マルチプライマリでの同時書き込みは整合性の面で問題が生じる可能性があるため、明確な目的がない限り実運用ではシングルプライマリ、またはマルチプライマリで書き込みノードを1ノードに固定する方法が推奨です。
前提
Group Replicationの利用には以下の前提を満たす必要があります。
- ストレージエンジンがInnoDBであること
- Primary KeyまたはNOT NULLの一意キーがあること
binlog_であることformat=ROW log_であることreplica_ updates=ON gtid_かつmode=ON enforce_であることgtid_ consistency=ON
Group ReplicationはInnoDBのトランザクション機構を前提としているため、ストレージエンジンはInnoDBである必要があります。また、各トランザクションのwriteset
詳細な要件は、公式ドキュメント Group Replication Requirements から確認することができます。
従来のSource/Replica構成との違い
Source/
| Group Replication | Source/ |
|
|---|---|---|
| レプリケーション方式 | 同一順序でメッセージを各ノードに配信し、認証後に適用する | デフォルトは非同期 |
| フェイルオーバー | 書き込みノード障害時、過半数側がクラスタとして動作を継続し、その中から新プライマリが自動選出される | 外部オーケストレータなどでReplicaを昇格する |
| 整合性判断 | 変更対象のキー集合 |
運用側での回避 |
| コミットタイミング | 過半数ノードが認証したタイミング | Source側のbinlogに書かれたタイミング |
| スロットリング | Flow Controlで遅いノードに合わせて書き込み制限がかかる | Replica側の適用が遅れるレプリケーション遅延が起きる |
| ノード数 | 耐障害性のため最低3台 | 最低2台 |
Group Replicationは整合性チェックや自動フェイルオーバーの仕組みを備える一方、Source/
トランザクションがコミットされるまでの流れ
Group Replicationでトランザクションがコミットされるまでの流れを示します。Source/
- まず書き込みノードでクエリが実行されると、更新対象を一意に特定するwriteset
(PK/一意キー) を抽出します。これを用いて以降の工程で衝突検出を行います。 - GCS
(XCom) でwritesetを送信し、全ノードで同一順序でトランザクションが配信されます。 - 各ノードは受信したwritesetを、自ノードが保持する確定済みのwritesetと照合して認証します。ここで衝突がある場合はAbortされ、そのトランザクションは失敗します。
- クラスタ内の過半数ノードで認証されるとコミットが確定し、クライアントへ成功が返ります。
このようにGroup Replicationでは、分散合意アルゴリズムによって過半数ノードが認証したことをもってコミットが確定します。この仕組みにより、たとえば3台構成のクラスタで1ノードに障害が発生した場合でも、過半数の2ノードが生きていれば安全に動作を継続することができます。
Group Replicationクラスタ作ってみた
Group Replicationを試すために、シンプルなクラスタを作成する方法を説明します。ここではMySQLのバージョンは8.
まずは全ノードで必要な設定を確認します。server_33061なので、ノード間で疎通できる必要があります。
MySQLの設定に以下を記載して、全ノードで再起動してください。
[mysqld]
gtid_mode=ON
enforce_gtid_consistency=ON
# サーバーごとにユニークな値
server_id=1
plugin_load_add=group_replication.so
group_replication_group_name="FD30F2F9-F60E-450A-A212-794B48CA2583"
group_replication_start_on_boot=OFF
group_replication_local_address="node1:33061"
group_replication_group_seeds="node1:33061,node2:33061,node3:33061"
group_replication_single_primary_mode=ON
group_replication_enforce_update_everywhere_checks=OFF
次に、Group Replication用のユーザーを作成します。
mysql> CREATE USER repl@'%' IDENTIFIED BY 'P@ssword123'; Query OK, 0 rows affected mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'%'; Query OK, 0 rows affected
1台目のノードを起動します。1台目はまだクラスタが存在しない状態のため、bootstrapで起動する必要があります。group_を設定することで、新しいグループを作成する起動手順が実行されます。この時点では1台のみでGroup Replicationが開始します。
mysql> SET GLOBAL group_replication_bootstrap_group=ON; Query OK, 0 rows affected mysql> START GROUP_REPLICATION USER='repl', PASSWORD='P@ssword123'; Query OK, 0 rows affected mysql> SET GLOBAL group_replication_bootstrap_group=OFF; Query OK, 0 rows affected mysql> SELECT * FROM performance_schema.replication_group_members; +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK | +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+ | group_replication_applier | fba696d8-ac21-11f0-bcd0-dab3cd90a550 | node1 | 3306 | ONLINE | PRIMARY | 8.4.6 | XCom | +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+ 1 row in set
残りのノードを起動します。
mysql> RESET BINARY LOGS AND GTIDS; Query OK, 0 rows affected mysql> START GROUP_REPLICATION USER='repl', PASSWORD='P@ssword123'; Query OK, 0 rows affected
以下のクエリでGroup Replicationのメンバーが表示されていれば、正常にGroup Replicationクラスタが稼働しています。
mysql> SELECT * FROM performance_schema.replication_group_members; +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK | +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+ | group_replication_applier | fba67f36-ac21-11f0-a166-16e41ed03440 | node2 | 3306 | ONLINE | SECONDARY | 8.4.6 | XCom | | group_replication_applier | fba696d8-ac21-11f0-bcd0-dab3cd90a550 | node1 | 3306 | ONLINE | PRIMARY | 8.4.6 | XCom | | group_replication_applier | fba95521-ac21-11f0-9cec-161bab4c2011 | node3 | 3306 | ONLINE | SECONDARY | 8.4.6 | XCom | +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+ 3 rows in set mysql> SELECT * FROM performance_schema.replication_group_member_stats; +---------------------------+----------------------+--------------------------------------+-----------------------------+----------------------------+--------------------------+------------------------------------+------------------------------------------+--------------------------> | CHANNEL_NAME | VIEW_ID | MEMBER_ID | COUNT_TRANSACTIONS_IN_QUEUE | COUNT_TRANSACTIONS_CHECKED | COUNT_CONFLICTS_DETECTED | COUNT_TRANSACTIONS_ROWS_VALIDATING | TRANSACTIONS_COMMITTED_ALL_MEMBERS | LAST_CONFLICT_FREE_TRANSA> +---------------------------+----------------------+--------------------------------------+-----------------------------+----------------------------+--------------------------+------------------------------------+------------------------------------------+--------------------------> | group_replication_applier | 17610118930440834:11 | fba67f36-ac21-11f0-a166-16e41ed03440 | 0 | 0 | 0 | 0 | fba696d8-ac21-11f0-bcd0-dab3cd90a550:1-7 | > | group_replication_applier | 17610118930440834:11 | fba696d8-ac21-11f0-bcd0-dab3cd90a550 | 0 | 0 | 0 | 0 | fba696d8-ac21-11f0-bcd0-dab3cd90a550:1-7 | > | group_replication_applier | 17610118930440834:11 | fba95521-ac21-11f0-9cec-161bab4c2011 | 0 | 0 | 0 | 0 | | > +---------------------------+----------------------+--------------------------------------+-----------------------------+----------------------------+--------------------------+------------------------------------+------------------------------------------+--------------------------> 3 rows in set
まとめ
本記事では、Group Replicationの基本的な仕組みと簡単な構築方法について説明しました。Group Replicationは高可用性や自動フェイルオーバーといった利点がある一方、特有の制限事項や、従来のSource/