Yakstは、海外の役立つブログ記事などを人力で翻訳して公開するプロジェクトです。
9年以上前投稿 修正あり

MariaDB: バイナリログイベントの選択的スキップ

MySQL Performance Blogの翻訳。MariaDBの機能である、バイナリログに書き込まれた個別のイベントを、マスタあるいはスレーブに適用しないというオプションの使い方と、そのユースケースを紹介する。

原文
MariaDB: Selective binary logs events (English)
原文ライセンス
CC BY-NC-SA
翻訳依頼者
D98ee74ffe0fafbdc83b23907dda3665
翻訳者
D98ee74ffe0fafbdc83b23907dda3665 doublemarket
原著者への翻訳報告
未報告


我々が興味深いと思うMariaDBの機能を紹介するシリーズ、最初の記事では、バイナリログイベントのレプリケーションを選択的にスキップする機能を取り上げる。この機能は、MariaDB 5.5と10から使用可能だ。

MySQLの一般的なレプリケーションをする時、デフォルトでは、全てのイベントがバイナリログに書き込まれ、そのバイナリログのイベントは、全てのスレーブに複製されてしまう(スキーマ単位でフィルタすることも可能)。しかしこの機能を使えば、バイナリログに書かれてしまっても、特定のイベントをスレーブに複製しないようにすることが可能だ。こういったイベントについてもバイナリログに書いておけば、ポイントインタイムリカバリの際には有用になる。

従来は、あるイベントをレプリケーションしたくない時は、sql_log_bin=0を設定することで、そのイベントを読み飛ばすことができた。この場合、イベントはバイナリログにも書かれないし、スレーブにも複製されない。

しかしここで紹介する新機能を使えば、セッション変数を設定してイベントにタグ付けしてやれば、バイナリログには書き込み、一方で特定のスレーブには複製しないということが可能になる。

これをやるのは非常に簡単で、マスタで以下のように実行すればよい。

set skip_replication=1;

スレーブで、 replicate_events_marked_for_skip='FILTER_ON_MASTER' あるいは replicate_events_marked_for_skip='FILTER_ON_SLAVE' が設定されていれば、マスタで実行されたイベントはスキップされて、複製されなくなる。

replicate_events_marked_for_skipの取りうる値は以下の通り。

  • REPLICATE (default) : スキップされたイベントもレプリケーションされる。
  • FILTER_ON_SLAVE : スキップとマークされたイベントはスレーブでもスキップされ、レプリケーションされない。
  • FILTER_ON_MASTER : マスタ側でフィルタリングが行われ、スレーブには転送もされない。ネットワーク帯域を節約できる。

これは素晴らしい機能だ。どんな時に特に役立つだろうか?

ユースケース

アーカイブ用途のシステムでは、非常に面白いことになる。多くの人はデータをアーカイブする時には、pt-archiverのような、アーカイブサーバにデータをコピーし、元のサーバからデータを削除するツールを使うだろう。

ここで紹介している機能を使うと、削除するデータをコピーしておくアーカイブサーバを用意する代わりに、消したくないデータを保持しておくスレーブを作ることができる。この方が手間が少なく(賢く?)、アーカイブサーバを常に最新に保つこともできる。もちろん、この場合はsql_log_bin=0を使うこともできる(ポイントインタイムリカバリを考慮しないなら)。

Galera Clusterの場合はどうだろう?そう、この機能が素晴らしいのはここだ。Galera Clusterのノードでsql_log_bin=0を実行してしまうと、全てのノードでdeleteが無視されてしまう。その結果、ノード間でデータの不整合が起きてしまうのだ。

従って、Galera Clusterでアーカイブサーバとして非同期スレーブを使っているなら、この機能は絶対必要なものになる。

下の図のように、Percona XtraDB ClusterにMariaDB Galera Clusterノードを組み込み、pt-archiverで過去のデータを削除することもできる。

MariaDB Galera Cluster joining XtraDB Cluster

この場合、pt-archiverは、--set-vars "skip_replication=1"を設定して起動する。

次の記事
色んなログ、読む時間のある人いる? MariaDBのログ概要
前の記事
[Q&A]MySQL開発でやってしまいがちな致命的ミス

Feed small 記事フィード

新着記事Twitterアカウント