a-Column

【MySQL】MySQLレプリケーション設定

(構成)
Master:36.55.231.10
MySQL5.5.23

Slave:183.181.56.16
MySQL5.0.95

■Master側の設定

Master側ではバイナリログを採取しておく必要があるので、Master側のmy.cnfにlog-binの設定が入っていることを確認する(デーモン起動時のオプションで指定してあってもよい)。また、ついでにserver-idが設定されていることを確認する。

[mysqld]
log-bin <== バイナリログを取ることを指定
server-id=1 <== 識別用ID。任意の値。他のサーバーと重複しないようにする。

設定反映の為、MySQLの再起動を実施。

■アカウント作成

SlaveからMasterへ接続する際のアカウントをMaster側に用意しておく必要がある。このアカウントはREPLICATION SLAVE権限を持っている必要がある。

以下は10.0.0.2(SlaveのIPアドレス)から接続を許す'myfather'ユーザーを作成する例。

(Master側で)
mysql> GRANT REPLICATION SLAVE ON *.* TO
myfather@183.181.56.16 IDENTIFIED BY 'パスワード';

flush privileges;

■Slave側の設定

Slave側のmy.cnfにserver-idを設定する。

[mysqld]
server-id=2 <== 識別用ID。任意の値。他のサーバーと重複しないようにする。

設定後、Slave側のmysqldを再起動する。


■データベースの初回バックアップ

MasterのデータベースをSlaveにコピーする。

コピーの際、データベースが更新されないように書き込みをロックする。

(Master側で)
mysql> FLUSH TABLES WITH READ LOCK;

現在のバイナリログの状態を確認(ロック中に行うこと)。

(Master側で)
mysql> SHOW MASTER STATUS;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| mysqld-bin.000001 | 107 | | |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

現在のバイナリログのファイル名とログ内の現在位置が表示されるので、記録しておく。これらは、Slaveを起動する時に必要になる。(ロック解除してからSlaveを立ち上げるまでにDBの更新があった場合、現在位置以降のクエリを実行してDBを一致させるため。)

Master側のデータベースをバックアップする。データベースは書き込みのロックがされているのでtarでアーカイブすればよい。以下ではfriendDBのみバックアップしている。全てのデータベースをレプリケーションしたい場合は、全データベースをバックアップしておけばよい。

(Master側で)# cd /var/lib/mysql/ <== MySQLのデータディレクトリへ移動
# tar cvf /home/XXX/wordpress.tar wordpress <== データベースをバックアップ

データベースのバックアップが完了してしまえば、書き込みのロックは解除すればよい。これで、Master側は通常の運用に戻ることができる。

(Master側で)
mysql> UNLOCK TABLES;

■データベースの移動とコピー

# scp -P 3843 wordpress.tar ユーザー名@183.181.56.16:/

2.3でバックアップしたデータベースSlave側に持っていく。2.3で作成したtarファイルをftpなどでSlave側へ持っていき、MySQLのデータディレクトリに展開すればよい。ここで、展開したファイルはMaster側と同じパーミッションにしておくとよい。

(Slave側で)
# cd /var/lib/mysql/
# tar xvf /home/XXX/wordpress.tar

パーミッションを確認しておくこと。

■レプリケーションの開始

Slave側でMasterへ接続するためのパラメータ(ホスト名やユーザー名)を設定する。

(Slave側で)
mysql> CHANGE MASTER TO
MASTER_HOST='10.0.0.1', <== Masterのホスト名/IPアドレス
MASTER_USER='repl', <== Master接続に使用するユーザー名
MASTER_PASSWORD='password', <== パスワード
MASTER_LOG_FILE='tank-bin.000001', <==2.3で確認したFile
MASTER_LOG_POS=79; <== 2.3 で確認したPosition

change master to master_host='36.55.231.10', master_user='myfather', master_password='mononokehime09', master_log_file='mysqld-bin.000001', master_log_pos=107;

レプリケーションを開始する。

(Slave側で)
mysql> START SLAVE;

■関連コマンド

@start slave/stop slave(slave用)

ASHOW MASTER STATUS (Master用)

BSHOW BINLOG EVENTS (Master用)

CSHOW SLAVE STATUS (Slave用)
Slaveの情報を表示する。

mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.0.0.1
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: tank-bin.000001
<略>


Slave_IO_Running,Slave_SQL_Runningが'yes'になっていればSlave側のスレッドは立ち上がっており、レプリケーションが動作していることになる。

Seconds_Behind_MasterでSlave側で最後に実行されたクエリがMaster側から何秒遅れていたかを表示しているので、レプリケーションが完了するまでの目安になる。

■エラー発生

▲mysqld.log

120723 16:52:59 mysqld started
Unknown suffix 's' used for variable 'server-id' (value 'slave')
120723 16:52:59 [ERROR] /usr/libexec/mysqld: Error while setting value 'slave' to 'server-id'
120723 16:52:59 mysqld ended

120723 16:53:35 mysqld started
Unknown suffix 's' used for variable 'server-id' (value 'slave')
120723 16:53:35 [ERROR] /usr/libexec/mysqld: Error while setting value 'slave' to 'server-id'
120723 16:53:35 mysqld ended

解決方法→server-id=2に変更して問題なく起動。

Last Update : 2012年08月09日 (木) 15:49