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

MySQL 5.7のマルチソースレプリケーション

MySQL Performance Blogの翻訳。MySQL 5.7開発版と合わせてアナウンスされた、マルチソースレプリケーション。マルチマスタとの違いと、マルチソース環境の概要を、実際の設定や動きを交えながら解説する。

原文
MySQL 5.7 multi-source replication (English)
原文ライセンス
CC BY-NC-SA
翻訳依頼者
D98ee74ffe0fafbdc83b23907dda3665
翻訳者
D98ee74ffe0fafbdc83b23907dda3665 doublemarket
原著者への翻訳報告
未報告


October 2, 2013 By Miguel Angel Nieto

最近Oracleは、この記事を書いている時点でバージョン5.7.2の最新MySQL開発版に対して、数々の新機能をアナウンスした。これらの多くは、新しいリリースが非常に素晴らしいものになるであろうことを予感させるパフォーマンスやレプリケーション関係の機能だ。

この記事で、新しいマルチソースレプリケーションの機能をどう動かすかの簡単な手順と、テストのためにどう設定すべきかを説明しようと思う。これは開発版なので、すぐに本番環境で使えるものではないことをあらかじめ指摘しておこう。いずれにしても、開発環境において、新しい機能を試してみたい人や、アプリケーションとどう組み合わせて動くのか見たい人のための記事だ。

マルチソースレプリケーションとは?

まず、マルチマスタマルチソースが同じではないということをはっきりさせる必要がある。マルチマスタレプリケーションとは一般的に、どのサーバに書き込んでもデータが全てのノードにレプリケーションされるような、循環レプリケーションのことだ。

マルチマスタレプリケーションの例

マルチソースはこれとは違う。MySQLのレプリケーションには、この新しいバージョンで改善されるまで、1つのスレーブは1つのマスタしか持てないという制約があった。これは、レプリケーション環境をデザインする際の制限事項だった。これを何とか動かすようにする「裏技」もあったが、今回これに対する公式な方法ができたということだ。つまり、マルチソースとは1台のスレーブが2台以上のマスタを持つ構成のこと。つまり、以下のようなレプリケーション環境だ。

マルチソースレプリケーションの例

これにより、過去には不可能だったレプリケーションの階層構造を作ることが可能になった。例えば、自分のオフィスにあるスレーブに、世界中に散らばる各オフィスのサーバからデータをレプリケーションしてくることができる。

どう動いているのか

ここで、コミュニケーションチャネルというコンセプトがある。各コミュニケーションチャネルは、バイナリログイベントを受け取るためにスレーブからマスタに張るコネクションだ。これはつまり、IO_THREADを書くコミュニケーションチャネルごとに持つことだ。それぞれのマスタに対して、チャネルの名前を指定する「FOR CHANNEL」引数をつけて「CHANGE MASTER」コマンドを実行する必要がある。

 CHANGE MASTER MASTER_HOST='something', MASTER_USER=... FOR CHANNEL="name_of_channel";

とても簡単だ。ひとつだけ前提条件がある。スレーブは、MySQL 5.6のクラッシュセーフ機能が有効な状態に設定されていなければならないということだ。これはつまり、master.infoやrelay-log.infoの情報がテーブル上にあるということも意味している。それでは設定してみよう。

さあ例を見せてくれ!

まずは試験版のMySQLをここからダウンロードしてくる必要がある。

2台のマスタと1台のスレーブからなるサンドボックス環境を用意しよう。server_idやバイナリログ、レプリケーションユーザの設定についてはここでは詳しく書かない。それらは既に設定してあるものと仮定する。

まず、スレーブをクラッシュセーフにしなければならない。

 master_info_repository=TABLE;
 relay_log_info_repository=TABLE;

スレーブを再起動したら、「master1」と「master2」というチャネルを作成できるようになる。

 slave > change master to master_host="127.0.0.1", master_port=12047, master_user="msandbox",master_password="msandbox" for channel="master1";
 slave > change master to master_host="127.0.0.1", master_port=12048, master_user="msandbox",master_password="msandbox" for channel="master2";

スレーブのプロセスを開始するには、どのチャネルを使うかを指定する必要がある。

 slave > start slave for channel="master1";
 slave > start slave for channel="master2";

ここで、スレーブのステータスを見てみよう。

 slave > show slave status\G
 Empty set (0.00 sec)

おっと、空っぽだ。どのチャネルの情報を見るのか指定しなければならないのだ。

slave > SHOW SLAVE STATUS FOR CHANNEL="master1"\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 127.0.0.1
                  Master_User: msandbox
                  Master_Port: 12047
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 232
               Relay_Log_File: squeeze-relay-bin-master1.000003
                Relay_Log_Pos: 395
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
[...]

さらに、IO_THREADSQL_THREADが動いているかも確認してみよう。

slave > SHOW PROCESSLIST;
+----+-------------+-----------------------------------------------------------------------------+
| Id | User        | State                                                                       |
+----+-------------+-----------------------------------------------------------------------------+
|  2 | system user | Waiting for master to send event                                            |
|  3 | system user | Slave has read all relay log; waiting for the slave I/O thread to update it |
|  4 | system user | Waiting for master to send event                                            |
|  5 | system user | Slave has read all relay log; waiting for the slave I/O thread to update it |
+----+-------------+-----------------------------------------------------------------------------+

さあ試してみよう。

 master1 > create database master1;
 master2 > create database master2;
 slave > show databases like 'master%';
 +--------------------+
 | Database (master%) |
 +--------------------+
 | master1            |
 | master2            |
 +--------------------+

動いた。簡単だ!

結論

新しいマルチソースレプリケーションの機能によって、今までは複雑な「裏技」なしには実現できなかった新しいレプリケーション環境を構築できるようになった。もちろん、この新しいアーキテクチャを考慮してアプリケーションのデザインや開発をする必要があることは考慮すべきだ。マルチマスタ環境と同じく、マルチソース環境でも、データがごちゃごちゃにならないように特に注意しなければならない。

MySQLのレプリケーション機能は、リリースのたびに設定やパフォーマンス、デザインの可能性をどんどん広げていっている。そしてこれら全ての機能は一緒に使うことができる。あなたのレプリケーション環境は、最近追加された新しい機能(古い機能も)一緒に使うことで、さらに良くすることができるだろう。例えば、GTIDや、スキーマ単位のマルチスレッドスレーブデータベース間のマルチスレッドスレーブを有効にすることもできる。

次の記事
SQLに対するMySQLと、NoSQLに対するMongoDBは似ている――主に有害な意味で
前の記事
innodb_file_per_tableが有効な時にディスク容量を開放するには

Feed small 記事フィード

新着記事Twitterアカウント