mita2 database life

主にMySQLに関するメモです

MySQL Group Replication vs Percona XtraDB Cluster 〜DDLのロック編〜

Gelera Cluster / Percona XtraDB Cluster

Galera Cluster for MySQLフィンランドの会社が開発している、MySQL の fork (派生製品)の1つです。wsrep API と呼ばれる独自のレプリケーション機構を使った、マルチマスター型のHA構成を組むことができます。Galera Cluster は 2007年にリリースされ、MySQL の高可用性構成を実現するための手段として一定の支持を得てきました。

galeracluster.com

wsrep API ベースのマルチマスター機能を MySQL の forkである、Percona Server に実装したものが、Percona XtraDB Cluster。 同じく、MariaDB に実装したものが、MariaDB Galera Cluster になります。

MySQL Group Replication

2016 年に登場した、Vanilla MySQL (forkでなくオリジナル)のマルチマスター機能です。実装は全く異なりますが、目的としているところは、Galera Cluster と同じです。

MySQL 5.7 の終盤でいきなり登場したのですが、機能が充実し、十分使えるようになったのは、MySQL 8.0 になってからです。 MySQL 8.0の新機能と捉えても良いでしょう。

MySQL Group Replication は、HA機能のみで、アプリケーションにデータベースの構成情報を伝える機能は持ちません(例えば、PRIMARYサーバが変わったときに、アプリケーションの接続先を切り替えるなど)。 アプリケーションをデータベースの構成変更に追従させるためのツールである MySQL Router と組み合わせて、InnoDB Cluster いうソリューション名が付けられています。

相互レプリケーションと何が違うのか

Galera Cluster や Group Replication を使わなくても、従来、相互にマスターサーバ同士をレプリケーションさせることで、「マルチマスター」構成とすることが出来ました。しかし、単純な相互レプリケーションでは、スプリットブレインのリスクを排除できません。運が悪いと障害時にデータロストやデータ不整合が発生してしまう可能性があります。

(Paxos などの)分散合意アルゴリズムを利用して、堅牢なマルチマスター構成を実現したものが、Galera Cluster や Group Replication になります。

PXC vs MySQL Group Replication

Group Replication は Galera Cluster や Percona XtraDB Cluster (PXC) と同じようなHAを実現するための機能ですが、実装は全く異なります。 PXCと Group Replicaion でどのような違いがあるのか比較していきたいと思います。

バージョンは、PXC 8.0 と MySQL 8.0 で比較します。

※ 比較相手に Galera Cluster for MySQLMariaDB Galera Cluster でなく、PXCを選択したのは、単なる自分の趣味です。

DDLのロックの挙動

以下の3点に注目して比較してみます。いずれの検証も、書き込み先のノード(サーバ)は1台に固定して行います(Single Primary 運用)

  1. ALTER 中に対象テーブルに対して書き込みができるか
  2. ALTER 中に対象テーブル以外に対して書き込みができるか
  3. ALTER がレプリケーション遅延(ノード間のデータ同期の遅延)を引き起こすかどうか

Percona XtraDB Cluster 8.0

PXC 8.0 では、例えオンラインDDLであっても、DDL実行中はすべての更新がブロックされます。 ALTER TABLE の対象外のテーブルであってもです。

すべてのノードで同じタイミングで、DDLの実行が開始され、ほぼ同時に終わります。

これはこれで、シンプルでわかりやすいですし、予期しないトラブルを避けるのに有効な挙動だと思います。

f:id:mita2db:20200903163419g:plain

MySQL 8.0 - Group Replication

MySQL Group Replication では、ALTER TABLE中もテーブルに対して書き込みを行えます(オンラインDDLに限る)。 プライマリノードで実行が終わったら、DDLセカンダリノードで実行されます。セカンダリノードでのDDL実行中、セカンダリノードへの更新の反映が待機します(レプリケーション遅延が発生)。

つまり、普通のマスター・スレーブ構成と同じです。これまでマスター・スレーブで運用してきた人であれば、違和感なく運用できますね。

f:id:mita2db:20200903162025g:plain

まとめ

製品 対象テーブルへの更新 それ以外のテーブルの更新 レプリ遅延
PXC 8.0 できない できない N/A
MySQL GR 8.0 できる できる 発生する