2012年5月5日土曜日

[MySQL]レプリケーション環境構築手順 for メモリかつかつ人 vol2~本題のレプリケーション設定

黄金の日々を皆様いかがお過ごしでしょうか。
私としましては、いろいろと出費が嵩むことがありまして、2年連続で家計は火の鳥となっておりますが故、「ちょっと長めないつもの週末」を謳歌しております。ていうか結婚した輩ってホント付き合ってくれなくなりますね!

さて、「レプリケーション環境構築手順」とかほざいておきながら、レプリケーションのレの字も無かった前回の続きです。Google Analyticsで検索ワード確認してみたら「MySQL レプリケーション」といったワードが幾つか見つかり、非常に心苦しい限りです詐欺師です…

というわけで今回のテーマは「脱・詐欺師」、要するに「タイトルに即した内容を書く」です。
ちなみに人から時々「話が長い」と言われます。

試した環境

  • CentOS 5.6(64bit), 6.2
  • MySQL 5.1.61

マスター

my.cnf設定
最低限、サーバーIDとバイナリログ名を設定。サーバーIDは他のサーバーとかぶらない値に。
[mysqld]
server-id=1
log-bin=mysql-bin
# dataディレクトリ以外に作成したけりゃ以下のように絶対パスで指定
# log-bin=/var/lib/binlog/mysql-bin
設定したら再起動。
レプリケーション専用ユーザー作成

マスターデータのスナップショットを作成
レプリケーションを開始するに当たって、当然マスタとスレーブのデータを同一にしておく必要がある。

まず、設定作業中にマスターデータが更新されてしまわないよう、書き込みロックをかける。
mysql> FLUSH TABLES WITH READ LOCK;

そしてマスターデータのスナップショットを作成。データフォルダをアーカイブしてしまえ。
# cd /var/lib/mysql/
# tar cpf /tmp/master_snapshot.tar .
バイナリログのPositionをメモ
「スレーブが起動した際、バイナリログの読み込み開始位置」を表す。
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      106 |              |                  |
+------------------+----------+--------------+------------------+
書き込みロック解除
バイナリログのPositionさえメモしてしまえば、スレーブの設定完了前にいくら更新かかろうが恐くない。
mysql> UNLOCK TABLES;

スレーブ

マスターデータを展開
展開前にスレーブ停止するのをお忘れ無く。
もしマスターでバイナリログなどをデータフォルダ配下に出力していた場合は、スレーブ側では当然不要なので削除しちゃってください。
# /etc/init.d/mysqld_slave stop
# cd /usr/local/mysql/var
# rm -rf *
# tar xpf /tmp/master_snapshot.tar -C /usr/local/mysql/var/
# rm msyql-bin.00000X mysql-bin.index
my.cnf設定
最低限サーバーIDを設定。
[mysqld]
server-id=2

# スレーブのバイナリログやリレーログの名称やパスを指定したけりゃ以下のように
# log-bin=/usr/local/mysql/mysql-bin
# relay-log=/usr/local/mysql/mysql-relay-bin
# relay-log-index=/usr/local/mysql/mysql-relay-bin
マスター情報セット
ここでの肝は「MASTER_LOG_FILE」と「MASTER_LOG_POS」です。メモした値を設定してください。
mysql> CHANGE MASTER TO
-> MASTER_HOST='localhost'
-> , MASTER_PORT=3306
-> , MASTER_USER='repl'
-> , MASTER_PASSWORD='password'
-> , MASTER_LOG_FILE='mysql-bin.000001'
-> , MASTER_LOG_POS=106;
mysql> START SLAVE;
起動!
mysql> START SLAVE;
動作確認
「Slave_IO_Running」「Slave_SQL_Running」が「Yes」で、「Last_IO_Error」が空ならOKです。
mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.XX.XX
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 257
Relay_Log_File: virtualbox-relay-bin.000002
Relay_Log_Pos: 402
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
…

それでは良きレプリケーションライフを!

参考

0 件のコメント: