スマートスタイル TECH BLOG

データベース&クラウド技術情報

MySQL 8.3.0 Innovation release: Tagged GTID について

2024-01-16 に MySQL 8.3.0 Innovation releaseがリリースされました。

https://dev.mysql.com/doc/relnotes/mysql/8.3/en/news-8-3-0.html

今回は、新たに追加された Tagged GTID(GTIDのタグ付け)のについて検証してみたいと思います。

GTIDフォーマットについて

MySQLのGTID は、リリースノートから確認する限り、Changes in MySQL 5.6.5 (2012-04-10, Milestone 8) から導入されておりますので、もうすぐ12周年という事になります…ので今更という方が多いかと思いますが、 一応GTIDのフォーマットについて簡単におさらいです。

MySQLのGTIDは以下のフォーマットとなっています。

https://dev.mysql.com/doc/refman/8.3/en/replication-gtids-concepts.html

GTID = source_id:transaction_id

source_idはmysqldごとに自動的に生成されるユニークなID(server_uuid)となり、transaction_idはsource_idのサーバで行われた更新番号(1から始まりcommitされる度に増分)です。

これによって、GTIDに紐づくバイナリログ内の更新処理がどのサーバの何番目のGTIDの処理なのかを判断することができ、また同じGTIDが記録されているサーバは同じデータを持つということが保証できます。

Tagged GTID についての検証

Tagged GTID はこれまでのGTIDフォーマットを拡張するもので、 以下の形式でGTIDを指定することができるようになりました。
※ 従来の source_id:transaction_id のGTIDフォーマットも可能です

GTID = source_id:tag:transaction_id

では、実際にどうやってタグを指定するかというと、gtid_nextgtid_purged にGTIDを設定する時に使うことができます。

システム変数 説明
gtid_next 次に使用するGTID。デフォルトはAUTOMATICで、次に自動生成されるGTIDを使います(transaction_id+1したもの)
gtid_purged 不要なGTIDセット。ローテーション等によってサーバ上から物理削除された際などに自動的に記録されたり、明示的にスキップしたいGTIDを追加することもできます。

デフォルトでは、 server_uuid:transaction_id の形式で記録されます。

先程の gtid_next 関数に、Tagged GTIDを指定することで一部の処理をタグ付けされたGTIDに含めることができます。

server_id:transaction_id:tag:transaction_id の形式になっている点にご注意ください。

タグなしのGTIDのtransaction_idと、Tagged GTIDのtransaction_idは独立して増分されています。

つまり、Tagged GTIDはサーバの部分的なGTIDセットに名前をつけて意味をもたせる事を目的としたもののです。

いつも参考にさせていただいているlefred氏の記事 MySQL 8.3: Purging data from your InnoDB Cluster では、この機能を使い、グループレプリケーション環境のマスタのレコードを削除し、アーカイブ用レプリカには削除イベントをレプリケーションさせないという運用方法を紹介しています。

なお、lefred氏が書いている通りタグを使わなくてもできることはできます。

ただこの場合、後から見てどのGTIDを意図的にスキップしたのか分かりづらいかもしれません。
また、上記では決め打ちでtransaction_idを100にしましたが、それよりも前のGTIDとの整合性が取れるかはわかりません。
Tagged GTIDを使うと独立したGTIDのように記録されます。

スキップしたトランザクションも特定し易いです。

上記では、Tagged GTIDを除外してレプリケーションした形ですが、逆にTagged GTIDのみをレプリケートすることができるでしょうか。
おそらくレプリカにタグなしのGTIDをかなり未来までgtid_purgedに設定するということになるでしょう。

タグなしのGTIDはgtid_puregedに設定されているのでレプリカで実行されません。

タグ付きのGTIDは実行されました。

現在の所、タグベースのフィルタ処理機能は見当たらないので、"あるタグだけ" のような事を行う場合は mysqlbinlog を使ったフィルタ処理等が必要になってくるでしょう。

サマリ

Tagged GTIDが追加された事により、柔軟かつアプリケーション主導でレプリカに同期するデータを取捨選択できるようになりました。

今後更に関連機能が充実し、使い道が増えていく事を期待したいですね(特にWrite-Scale方面に…)!

運用の使い道のヒントになれば幸いです!

Return Top