概要
最近、自分の管理している環境下で MySQL データベースの Master-Slave レプリケーション環境を構築する機会がありました。レプリケーションができることで、いざという時に元に戻すことができたり、便利です。
今回は、そのデータベースのレプリケーション方法について書いていきます。
動作環境
まず前提条件として、以下のような環境です。・ MySQL サーバーが1台。レプリケーション設定はしていない。
・MySQL サーバーを新たにもう1台追加して、Master-Slave の2台構成にする。
・現在使っているサーバーを Master、新たに追加するサーバーを Slave とする。
・レプリケーションの対象とするデータベースの名前は mydb とする。 以下、順に説明します。現在稼働中の MySQL サーバーを「A」と呼ぶことにします。このサーバーが Master サーバーになります。また、新たに追加する MySQL サーバーを「B」と呼ぶことにして、このサーバーを Slave サーバーとして運用します。
1.Slave 用 MySQL サーバー環境の構築(B)
すでにMasterサーバーの環境を作っていると思うので、環境構築に関しては端折らせていただきます。Slave 側にも MySQL 環境が構築できたら、mysql コマンドでレプリケーションを行う先のデータベースを作成しておきます。UTF-8 指定などはそれぞれの環境に合わせて設定してください。
mysql > create database mydb character set utf8;
2. レプリケーション用ユーザーの作成(A)
MySQL コマンドを使って Slave が Master のバイナリログを参照する際に接続するユーザーを作成します。この例ではユーザー名 repl、パスワード xxxxxxxx で、192.168.XXX.XXXからの接続のみ許可されたユーザーとしています:
mysql > GRANT REPLICATION SLAVE ON . TO ‘repl’@’192.168.XXX.XXX’ IDENTIFIED BY ‘xxxxxxxx’;
3. Master 用の設定(A)
具体的には Master のバイナリロギングを有効にし、かつサーバーを識別するための ID を /etc/my.cnf 内に追加設定します(MariaDB の場合は /etc/my.cnf.d/server.cnf)# vi /etc/my.cnf
[mysqld] log-bin=mysql-bin
server-id=1
ここまで設定したら MySQL サーバー(A)を再起動します。
4. レプリケーション用ユーザーの作成(B)
MySQL コマンドを使って Slave 内にデータを複製するユーザーを作成します。この例ではユーザー名 repl、パスワード xxxxxxxx としていますmysql > GRANT ALL PRIVILEGES ON *.* TO 'repl'@localhost IDENTIFIED BY 'xxxxxxxx';
5. Slave 用の設定(B)
サーバーを識別するための ID を /etc/my.cnf 内に追加設定します(MariaDB の場合は /etc/my.cnf.d/server.cnf)。# vi /etc/my.cnf
log-bin=mysql-bin
server-id=2
ここまで設定したら MySQL サーバー(B)を再起動します。
6. バイナリログ位置の確認(A)
Master 側サーバーの MySQL コマンドで以下を実行して、その結果をメモしておきます:mysql > FLUSH TABLES WITH READ LOCK;
mysql > SHOW MASTER STATUS;
+----------------------+-----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+----------------------+-----------+--------------+------------------+
| mysql-bin.000001 | 7 | | |
+----------------------+-----------+--------------+------------------+
この結果の File がバイナリログ名、Position が現在位置です。これらの値は後に使います。
7. ダンプファイルの作成(A)
続いてこの状態のデータベースのスナップショットを取得します。6. でFLUSH TABLES WITH READ LOCK
を実行しているのでデータベースにはロックがかかっています。この状態で別のコンソールやターミナルを使って以下のコマンドを実行します:# mysqldump -u root -p mydb --lock-all-tables > mydbdump.db
これで指定した mydb データベースのダンプを mydbdump.db というファイルに取得することができます。取得後は再度もう一つのターミナルに戻って以下のコマンドを実行し、ロックを解除します:mysql > UNLOCK TABLES;
8. ダンプファイルのコピー(AまたはB)
7. で取得したスナップショットファイルを(mydbdump.db)、Slave サーバーとなる B に転送します。SFTP などを使って A から B へ送ってもいいし、B から A に取りに行ってもいいし、全く別の方法でも構いません。ダンプファイルが B のディスク内にあって、9 のコマンドが実行できれば良いです。9. レストア(B)
7. で取得した Master のレストアをB の mydb データベースにします:# mysql -u repl -p mydb < mydbdump.db
10. Master 情報登録(B)
続いて MySQL コマンドで Slave に Master の情報を登録します:mysql > CHANGE MASTER TO MASTER_HOST='192.168.XXX.XXX', MASTER_USER='repl', MASTER_PASSWORD='xxxxxxxx', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=7;
ここで指定する値は、MASTER_HOST は A のサーバー名(IPアドレス)、MASTER_USER は複製用(Aの)ユーザー、MASTER_PASS はそのパスワード、MASTER_LOG_FILE は 6. で取得した File の値、MASTER_LOG_POS は同 Position の値です。
11. レプリケーションスタート(B)
最後にレプリケーションを開始します:mysql > START SLAVE;
これでレプリケーションがスタートします。あとは、正常にレプリケーションが出来ていれば終了です。
総括
最初はポジションとは何ぞや?バイナリログとはなんぞや?となった自分でしたが、実際にやっていくことで、理解が出来ていきました。触らないことには何も始まらないです。
レプリカを作ることはどんどんやっても良いと思うので、レプリカを作って、あえてそれで色々ためしたり、というのも良いんじゃないでしょうか?