2014年3月31日月曜日

MySQL5.6でのレプリケーション設定 (複数のデータベース)

今回は、MySQL5.6がインストールされた環境で、複数のデータベースを指定したレプリケーション設定を行いました。
構成はマスター&スレーブの2台となります。
MySQL5.6からリリースされたGTID機能を試してみたかったのですが、今回は都合により通常のレプリケーション設定になりました。
通常のレプリケーション設定なので今更感がハンパないですが、一応ブログに残しました。

サーバーにインストールされているOSは、Centos5.8(x86_64)となります。
ここでは、マスター側のサーバーIPアドレスを192.168.1.40とし、スレーブ側のサーバIPアドレスを192.168.1.50としています。
(レプリケーション設定を行う際は、対象のMySQLサーバーでの作業は全て停止してください。)



マスター側の設定 (192.168.1.40)

マスター側のMySQL設定ファイル(/etc/my.cnf)の[mysqld]項目に設定を追加しました。
log_bin設定:バイナリログの出力先を指定します。
server-id設定:サーバーを識別するための一意な値を指定します。
    (ここでは、IPアドレスのホスト部をserver-idとして指定しました)

[root@192.168.1.40 ~]# vi /etc/my.cnf

[mysqld]

~中略~

# バイナリログの出力先設定
log_bin = /var/lib/mysql/mysql-bin

# レプリケーションサーバーIDの指定
server-id = 40


マスター側の設定が完了したらMySQLを再起動。

[root@192.168.1.40 ~]# /etc/init.d/mysqld restart


続いて、mysqldumpを使って現在のDBのスナップショットを作成。
(スレーブ側に作成したスナップショットのファイルを転送しておいて下さい)

[root@192.168.1.40 ~]# mkdir /home/tanaka/mysqldump/

[root@192.168.1.40 ~]# mysqldump -u root -p --lock-all-tables target_database_name_1 > /home/tanaka/mysqldump/target_database_name_1.sql

[root@192.168.1.40 ~]# mysqldump -u root -p --lock-all-tables target_database_name_2 > /home/tanaka/mysqldump/target_database_name_2.sql

スレーブ側からアクセスするためのユーザーを作成します。
(障害に備え、スレーブ側にも同様のユーザーを作成しています)
ユーザー名はrepl。 パスワードはpasswordに設定しました。
また、アクセスを許可するネットワークも192.168.1.0/24(192.168.1.%)で指定しています。

[root@192.168.1.40 ~]# mysql -u root -p -e "GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO repl@192.168.1.% IDENTIFIED BY 'password';"


重要:最後に、SHOW MASTER STATUSを実行し、ファイル名と現在のポジションを取得しておきます。

mysql> SHOW MASTER STATUS \G
*************************** 1. row ***************************
             File: mysql-bin.000001
         Position: 1234
     Binlog_Do_DB:
 Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)


[PR] MySQL関連書籍の紹介


スレーブ側の設定 (192.168.1.50)

スレーブ側のMySQL設定ファイル(/etc/my.cnf)の[mysqld]項目に設定を追加しました。
log_bin設定:バイナリログの出力先を指定します。
server-id設定:サーバーを識別するための一意な値を指定します。
    (ここでは、IPアドレスのホスト部をserver-idとして指定しました) ・relay-log設定:リレーログの出力先設定。名称を固定にするため、指定しておきます。
・他、log_slave_updates, read_only, replicate-do-db, replicate-ignore-db

[root@192.168.1.50 ~]# vi /etc/my.cnf

[mysqld]

~中略~

# バイナリログの出力先設定
log_bin = /var/lib/mysql/mysql-bin

# レプリケーションサーバーIDの指定
server-id = 50

# リレーログの出力先設定
relay-log=/var/lib/mysql/mysql-relay-bin

# レプリケーションサーバをチェーン状に構成する
#log_slave_updates=1

# レプリケーション スレーブ サーバで、この値を ON に設定すると、サーバが SUPER 権限を持つユーザ以外からの更新が出来ません。
# スレーブサーバは、マスタ サーバからの更新だけを許可し、クライアントからの更新を拒否します。
# この動作は TEMPORARY テーブルには使えません。 
#read_only=1

# レプリケーション対象データベース
replicate-do-db='target_database_name_1'
# レプリケーション対象データベース
replicate-do-db='target_database_name_2'
# レプリケーション対象外データベース
replicate-ignore-db='target_database_name_3'


read_only値については、(テンポラリ)テーブルを作成するようなアプリケーションでは使用出来ないとの事。
セキュリティ的にはONにしたい値ですが、今回のアプリケーションではテーブル作成処理も発生するので未指定にします。(´・ω・`)


設定ファイルの準備が出来たら、スレーブ側のMySQLサーバーにレプリケーション対象となるデータベースを作成して下さい。
先程、マスター側で生成したmysqldumpのファイルを流し込みます。
(マスター側で生成したファイルをスレーブ側に転送しておいて下さい)

[root@192.168.1.50 ~]# mysql -u root -p

mysql> CREATE DATABASE `target_database_name_1`;

mysql> CREATE DATABASE `target_database_name_2`;


mysql> exit

[root@192.168.1.50 ~]# mysql -u root -p target_database_name_1 < /home/tanaka/mysqldump/target_database_name_1.sql

[root@192.168.1.50 ~]# mysql -u root -p target_database_name_2 < /home/tanaka/mysqldump/target_database_name_2.sql


スレーブ側の設定が完了したら、こちらもMySQLを再起動。

[root@192.168.1.50 ~]# /etc/init.d/mysqld restart


障害時に、このスレーブがマスターに昇格した際、新たなスレーブ側からアクセスされるためのユーザーを作成しておきます。

[root@192.168.1.50 ~]# mysql -u root -p -e "GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO repl@192.168.1.% IDENTIFIED BY 'password';"


準備が出来たら、レプリケーション設定を完了させます。
スレーブ側のMySQLにログインをし、次の項目を指定しました。
MASTER_HOST 接続先(マスター)サーバーのIPアドレス(またはホスト名)
MASTER_PORT 接続先(マスター)サーバーの接続ポート番号
MASTER_USER, MASTER_PASSWORD マスター側に作成したアクセス用ユーザーの名前とパスワード
MASTER_LOG_FILE 接続先(マスター)サーバーで生成されたバイナリファイルのファイル名を指定します。
MASTER_LOG_POSには、マスター側でSHOW MASTER STATUSを実行した際に確認したポジション値を入力します。(ここでは1234としています)

設定が完了したら、START SLAVEを実行してレプリケーションを開始させて下さい。

[root@192.168.1.50 ~]# mysql -u root -p
mysql> CHANGE MASTER TO
  MASTER_HOST='192.168.1.40',
  MASTER_PORT=3306,
  MASTER_USER='repl',
  MASTER_PASSWORD='password',
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=1234;


mysql> START SLAVE;



レプリケーション動作の確認

レプリケーションが正常に動作しているかは、マスター側のデータを更新することで確認出来ます。
(SHOW MASTER STATUSSHOW SLAVE STATUSを実行することによって得られるポジションの同期が取られているかなど)


お役に立てましたら幸いです c(・ω・´c⌒っ


Master

mysql> SHOW MASTER STATUS \G
*************************** 1. row ***************************
             File: mysql-bin.000001
         Position: 35854
     Binlog_Do_DB:
 Binlog_Ignore_DB:
Executed_Gtid_Set:



mysql> SHOW PROCESSLIST \G
*************************** 1. row ***************************
     Id: 3
   User: repl
   Host: 192.168.1.40:36811
     db: NULL
Command: Binlog Dump
   Time: 1277
  State: Master has sent all binlog to slave; waiting for binlog to be updated
   Info: NULL


Slave

mysql> SHOW SLAVE STATUS \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.40
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 35854
               Relay_Log_File: mysql-relay-bin.000001
                Relay_Log_Pos: 36017
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: target_database_name_1,target_database_name_2
          Replicate_Ignore_DB: target_database_name_3

~略~


mysql> SHOW PROCESSLIST \G
*************************** 1. row ***************************
     Id: 1
   User: system user
   Host:
     db: NULL
Command: Connect
   Time: 1327
  State: Waiting for master to send event
   Info: NULL
*************************** 2. row ***************************
     Id: 2
   User: system user
   Host:
     db: NULL
Command: Connect
   Time: 41
  State: Slave has read all relay log; waiting for the slave I/O thread to update it
   Info: NULL


0 件のコメント:

コメントを投稿