今回は、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関連書籍の紹介
実践ハイパフォーマンスMySQL 第3版 [大型本] |
MySQL Cluster構築・運用バイブル ~仕組みからわかる基礎と実践のノウハウ [単行本(ソフトカバー)] |
スレーブ側の設定 (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 STATUSやSHOW 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 件のコメント:
コメントを投稿