MySQLのレプリケーション設定

電脳備忘録
昨年末からMySQLのレプリケーション設定に取り組んでいてなかなかうまく行かず、試行錯誤を繰り返す日々が続いていましたが、先人の知恵を拝借しようやく解決することができました。

「とりあえずテスト環境で動くようになった」というレベルなのでどういった運用が理想的なのか今後掘り下げる必要がありそうです。

何にはともあれ、忘れないうちに以下自分用備忘録。このエントリーを参考にされる方は自己責任でお願いします。
各サーバーのIPアドレス
マスターのIP:192.168.1.131
スレーブのIP:192.168.1.135

①【マスターの設定】

1-1.my.cnfファイルの設定
vi /etc/my.cnf

[mysqld]
server-id=1001 ←追記
log-bin ←追記

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql

log-bin=mysql-bin
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
default-character-set = utf8

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[mysql]
default-character-set = utf8


1-2.3306ポートの開放(私はここれを忘れてはまりました。)

設定ファイルを開く
vi /etc/sysconfig/iptables

下記の一文を追記して保存
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT

iptables再起動
/etc/rc.d/init.d/iptables restar


1-3.スレーブから接続するユーザーslave102の作成

mysql> GRANT REPLICATION SLAVE ON *.* TO slave102@"192.168.0.135" IDENTIFIED BY "secret";


②【スレーブの設定】

2-1.my.cnfファイルの設定
vi /etc/my.cnf

[mysqld]
server-id=1002
master_host=192.168.1.131
master_user="slave102"
master_password="secret"
master_port=3306

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql

# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
default-character-set = utf8

[mysql]
default-character-set = utf8

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

2-2.3306ポートの開放
スレーブもポートを開けておく必要があるようです。

2-3.レプリケーションを実行するユーザーslave102の作成
mysql> GRANT ALL ON *.* TO slave102@"192.168.1.135" IDENTIFIED BY "secret";


③【データのスナップショット作成】※マスターにて実行

3-1.MySQLにログインして下記のコマンドを実行

mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
+------------------------+------------+---------------------+--------------------------+
| File                           | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------------+------------+---------------------+--------------------------+
| mysql-bin.000001 |            98 |                             |                                  |
+------------------------+------------+---------------------+--------------------------+
1 row in set (0.00 sec)

3-2.FileとPositionの値を控えておくこと

3-3.一度MySQLから抜けて下記のコマンドを実行。
# mysqldump --all-databases --lock-all-tables -p > dbdump.db

3-4.再度MySQLへログインし下記のコマンドを実行
mysql > UNLOCK TABLES;

3-5.dbdump.dbをスレーブへ移す。


④【スレーブの設定】
4-1.手順3-5でマスターから移したdbdump.dbファイルを下記のコマンドでリストアする。
# mysql -p < dbdump.db

4-2.MySQLへログイン後、下記コマンドでスレーブを停止させる
mysql> STOP SLAVE;

4-2.CHANGE MASTER コマンドを実行
mysql> CHANGE MASTER TO MASTER_HOST='192.168.1.131', MASTER_USER='slave102', MASTER_PASSWORD='secret', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=98;

※MASTER_LOG_FILE・MASTER_LOG_POSの値は手順3-1の値を入力すること

4-3.下記コマンドでスレーブを起動させる。
mysql> START SLAVE;


⑤【レプリケーションできているかどうか確認】

5-1.マスターのmysqlにログインし下記コマンドを実行
mysql> SHOW PROCESSLIST\G

@結果
*************************** 1. row ***************************
 Id: 20
 User: slave102
 Host: 192.168.1.135:45188
 db: NULL
 Command: Binlog Dump
 Time: 2134
 State: Has sent all binlog to slave; waiting for binlog to be updated
 Info: NULL

どうやらスレーブに接続できているようだ。

5-2.マスターのmysqlにログインし下記コマンドを実行
mysql> SHOW PROCESSLIST\G

@結果
*************************** 1. row ***************************
  Slave_IO_State: Waiting for master to send event
  Master_Host: 192.168.1.131
  Master_User: slave102
  Master_Port: 3306
  Connect_Retry: 60
  Master_Log_File: mysql-bin.000001
  Read_Master_Log_Pos: 240
  Relay_Log_File: mysqld-relay-bin.000004
  Relay_Log_Pos: 235
  Relay_Master_Log_File: mysql-bin.000001
  Slave_IO_Running: Yes
  Slave_SQL_Running: Yes
  Replicate_Do_DB:
  Replicate_Ignore_DB:
  Replicate_Do_Table:
  Replicate_Ignore_Table:
  Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
  Last_Errno: 0
  Last_Error:
  Skip_Counter: 0
  Exec_Master_Log_Pos: 240
  Relay_Log_Space: 235
  Until_Condition: None
  Until_Log_File:
  Until_Log_Pos: 0
  Master_SSL_Allowed: No
  Master_SSL_CA_File:
  Master_SSL_CA_Path:
  Master_SSL_Cert:
  Master_SSL_Cipher:
  Master_SSL_Key:
  Seconds_Behind_Master: 0

 Slave_IO_Running:・Slave_SQL_Running: の値がともに「Yes」になっているので、レプリケーションは動作しているようだ。

今回も時間はかかりましたが、何とかレプリケーションに対応することができましたとさ。爽快爽快・・・。

~参照サイト~
GURO_CHANの日記
MySQLレプリケーション
MySQLレプリケーションのセットアップ手順
現場指向のレプリケーション詳説
KAWANO's PukiWiki - MySQLでのレプリケーションの設定
とみぞーノート
aniメモ

広告

ブログの維持費に充てるでございます・・・。