MySQL Group Replicationには、Single-Primary modeとMulti-Primary modeの2つの動作モードがあります。これらのモードは、ノード間の書き込みの可否や、データの整合性保証に大きな違いをもたらします。導入を検討する際には、これらのモードの違いを理解し、適切な選択をすることが重要です。本記事では、2つの動作モードの違いについて紹介します。
MySQL Group Replicationについては、過去の記事も参考にしてください。
Group Replication の各モードについて
Single-Primary mode
クラスター内で1台だけが
group_
Primaryの変更は、SELECT group_を実行することで、手動で行うことも可能です。
Multi-Primary mode
クラスター内の全メンバーが
group_
各モードの変更
MySQL 8.SELECT group_およびSELECT group_を使用して、Single-Primary modeと Multi-Primary modeを切り替えることができます。これらの関数は、クラスター全体でモードを切り替えるためのもので、クラスター内の全ノードで同じモードが適用されます。
MySQL 8.group_の値を変更してから、再度Group Replicationを開始する必要があります。
Single-Primary mode VS Multi-Primary mode
Single-Primary modeとMulti-Primary modeの主な違いは、書き込みの可否とデータの整合性に関するものです。
| 比較項目 | Single-Primary mode | Multi-Primary mode |
|---|---|---|
| 書き込みの可否 | 1台のPrimaryのみ書き込み可能 | 全ノードで書き込み可能 |
| データの整合性 | InnoDBの行ロックにより、更新の順序が保証される | ノード間でトランザクションの早い者勝ちの競争が発生し、コンフリクトによるロールバックが発生する可能性がある |
| クエリ互換性 | ほぼ全てのSQLや外部キーが動作 | 外部キーやDDLに強い制約がある |
書き込みの可否
各モードの紹介にあるように、Single Primary modeではPrimaryのみが書き込み可能で、Multi-Primary modeでは全ノードが書き込み可能です。この違いは各MySQLノードに対するメンテナンスの時に大きく影響します。
Single-Primary modeでは、各ノードの設定値の変更やMySQLの再起動を行う場合、Primaryノードのフェイルオーバーが必ず発生します。そのため、メンテナンスの際には一時的に書き込みの停止・
一方、Multi-Primary modeでは全ノードが書き込み可能なため、ノードの設定値の変更やMySQLの再起動を行う場合でも、他のノードが書き込みを受け付けることにより、メンテナンスの際のダウンタイムをゼロにすることができます。ただし、この場合でも後述するデータの整合性の問題が発生する可能性があるため、注意が必要です。
データの整合性
Single-Primary modeでは、全ての書き込みが1台のPrimaryに集約されるため、InnoDBの行ロックによって
Multi-Primary modeでは、各ノードでローカルにコミットしようとした瞬間に、他ノードとの整合性をチェックします。その時、他ノードのコミットと競合していると判断された場合、後に実行されたトランザクションは認証が失敗し、ロールバックされます。
| 時間 | 行の値 |
ノード1 |
ノード2 |
状態 |
|---|---|---|---|---|
| T1 | val=100 |
BEGIN; |
BEGIN; |
両ノードでトランザクション開始 |
| T2 | val=100 |
UPDATE t1 SET val=200 WHERE id=1; |
ノード1がローカルで更新 |
|
| T3 | val=100 |
UPDATE t1 SET val=300 WHERE id=1; |
ノード2もローカルで更新 |
|
| T4 | val=100 |
COMMIT |
ノード1がグループへ変更を通知 | |
| T5 | val=100 |
COMMIT |
ノード2がグループへ変更を通知 | |
| T6 | val=100 |
[認証] |
[認証] |
グループ全体で |
| T7 | val=200 |
コミット完了 | [認証] |
ノード2の変更は |
| T8 | val=200 |
(正常終了) | ROLLBACK |
ノード2はクライアントにエラーを返す |
このため、Multi-Primary modeであっても通常時は書き込みノードを1ノードに固定することが推奨されます。
クエリ互換性
Single-Primary modeでは、ほぼ全てのSQLや外部キーが動作しますが、Multi-Primary modeでは、外部キーやDDLに強い制約があります。たとえば、Multi-Primary modeでは、CASCADE設定を持つ外部キーがあるテーブルへの操作は推奨されません。また、SELECT ... FOR UPDATEによるロックは、他ノードには伝播しません。
また、Group Replicationの認証プロセスはDMLには適用されますが、DDLには適用されません。そのため、Multi-Primary modeではDDLの実行に対してはノード間での整合性が保証されないため、複数ノード書き込み状態でのDDLの実行は推奨されません。
| 時間 | ノード1 |
ノード2 |
状態 |
|---|---|---|---|
| T1 | ALTER TABLE t1 DROP COLUMN c1; |
ノード1でテーブルロック |
|
| T2 | INSERT INTO t1 (c1) VALUES (10); |
||
| T3 | ALTER完了 | ノード1の実行が完了する | |
| T4 | c1の更新が実行される | ALTERが実行される |
各更新が各ノードに伝播 |
| T5 | ノード1ではALTER完了後のため、c1への更新が失敗し、ノード1が停止する |
Multi-Primary modeでDDLを実行したい場合は、後方互換性のあるDDLを実行する、単一ノード書き込み状態で実施する、または各ノードを順番にクラスターから切り離してDDLを実行するなどの対策が必要になります。
各モードの選択基準
一般的なWebアプリケーションでは、Single-Primary modeを前提として選択されることが多いです。Single-Primary modeは、データの整合性を重視し、アプリケーション側の複雑性を抑えたい場合に適しています。
Multi-Primary modeでは無停止のメンテナンスが可能なため、24時間365日稼働が求められるシステムや、大量のMySQL Clusterを管理しなければいけない場合に適しています。
まとめ
MySQL Group ReplicationのSingle-Primary modeとMulti-Primary modeは、それぞれ異なるユースケースに適しています。
導入を検討する際には、これらのモードの違いを理解し、システムの要件やアプリケーションの特性に応じて適切なモードを選択することが重要です。
