MySQL レプリケーションのセットアップ手順

目次


想定していること

  • MySQL5.0
  • MySQLがすでに稼動中。レプリケーションの設定はしていない
  • 今回MySQLをもう一台増やして2台構成とし、master、slaveの構成にする

※今回と状況が異なる場合は、MySQLのリファレンスマニュアルを読むといいです。

設定手順

1. レプリケーション用ユーザを作成する

  • レプリケーション用ユーザを作成する

作成するユーザーはスレーブがマスタのバイナリ ログを読み込むときに接続するユーザーとなる。

既存のユーザーでもレプリケーションは可能だが、ユーザ名とパスワードが master.info ファイル内にテキストで保存されるため、安全のためレプリケーションプロセスにだけ権限があるユーザを作成する

  • 設定例(マスタのほうに設定)
    • 192.168.23.0/24 内のネットワークで許可
    • ユーザー名:repl
    • パスワード:slavepass
mysql > GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.23.0/255.255.255.0' IDENTIFIED BY 'slavepass';

2. マスタの設定

  • マスタのバイナリロギングを有効にする
  • サーバーを識別するためのサーバーIDを設定する

マスタのサーバーの/etc/my.cnfファイル内で以下のように設定

[mysqld]
log-bin=mysql-bin
server-id=1001

設定を終えたらmysqlを再起動する。

server-idの1001は、1から(2^32)-1)間の正整数なら、任意の値でOK
ただし、1、2はserver-idがないときのデフォルトとして使用されるため極力使わないほうがいい

3. スレーブの設定

  • サーバーを識別するためのサーバーIDを設定する(全体でユニークになるように)

スレーブのサーバーの/etc/my.cnfファイル内で以下の通り設定

[mysqld]
server-id=1002

設定後mysqlを再起動。詳細は1.2.と同様

ちなみに、スレーブサーバを他のマスターとして使用したい場合は、
/etc/my.cnf の[mysqld]セクションに log_slave_updates オプションを追加する

上記の例だと、

[mysqld]
log-bin=mysql-bin
log_slave_updates
server-id=1002

4. データのスナップショット作成

  • マスタのバイナリログの位置を確認する
  • データのスナップショットを取る(2通りの方法がある)
    • mysqldumpを使う
    • 生データのファイルを使う(/usr/local/mysql/dataなど)

まずはマスタのバイナリログの位置を記録する。これはスレーブの設定で必要となる。
スレーブはバイナリログ内のどこからイベントを実行するかを認識するためにこの値を使用する。

マスタで以下のコマンドを実行して、FileとPositionの値をメモしておく

mysql > FLUSH TABLES WITH READ LOCK;		// テーブルのロック
mysql > SHOW MASTER STATUS;

※表示例

mysql > SHOW MASTER STATUS;
+---------------------------+----------+--------------+------------------+
| File                                     | Position      | Binlog_Do_DB     | Binlog_Ignore_DB |
+---------------------------+----------+--------------+------------------+
| example-replication.000002       |       98       |                       |                  |
+---------------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

 
各値の意味は以下の通り

File        : バイナリログ名
Position  : ファイル内のオフセット。現在位置

これまでバイナリロギングをおこなわない状態で、マスタが稼動していた場合は以下のようになる可能性がある

mysql > SHOW MASTER STATUS;
Empty set (0.00 sec)

 
この場合は、Fileは""(空文字)、Positionは4となる

続いてデータのスナップショットを取る作業となる。方法は上記のように2通りあるが今回はmysqldumpを使用する礼を書く

mysql > FLUSH TABLES WITH READ LOCKをしておく

続いて、別のターミナルから

$ mysqldump -u ユーザ名 -p --all-databases --lock-all-tables > dbdump.db

もしくは スキーマ名(db名)を指定して

$mysqldump -uユーザ名 -p スキーマ名 --lock-all-tables > dbdump.db

  
スナップショットを取り終えたら、元のターミナルで以下のコマンドをうつ

mysql > UNLOCK TABLES;

5. スレーブの設定(2)

  • スナップショットを展開する
  • マスタの情報を登録する

スレーブ側のサーバーに.4.で作成したdbdump.dbを用意して、以下を実行する

$ mysql -uユーザ名 -p  < dbdump.db

もしくは

$ mysql -uユーザ名 -p スキーマ名 < dbdump.db

続いて、マスタの情報を登録します

mysql > CHANGE MASTER TO
           MASTER_HOST='example',
           MASTER_USER='repl',
           MASTER_PASSWORD='slavepass',
           MASTER_LOG_FILE='example-replication.000002',
           MASTER_LOG_POS=98;

MASTER_USERとMASTER_PASSWORDには1で設定したユーザーとパスワードを入力します。

また、MASTER_LOG_FILEとMASTER_LOG_POSには4で実行したSHOW MASTER STATUSの値を入力します。

6. レプリケーションをスタートする

  • START SLAVEコマンドでレプリケーションをスタートする

以下のコマンドでレプリケーションをスタートします。

mysql > START SLAVE;

これでレプリケーションが開始されます



トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-01-15 (金) 22:40:11 (2835d)