[CentOS]mariadb レプリケーション設定

概要

最近、自分の管理している環境下で 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; これでレプリケーションがスタートします。

あとは、正常にレプリケーションが出来ていれば終了です。

総括

最初はポジションとは何ぞや?バイナリログとはなんぞや?となった自分でしたが、実際にやっていくことで、理解が出来ていきました。
触らないことには何も始まらないです。
レプリカを作ることはどんどんやっても良いと思うので、レプリカを作って、あえてそれで色々ためしたり、というのも良いんじゃないでしょうか?

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です