mysql レプリケーションのまとめ

mysqlレプリケーションを試してみました。

環境

host A(マスター)
OS:debian
ip_address:192.168.56.100
host B(スレーブ)
OS:debian
ip_address:192.168.56.101

mysql-server のインストール

マスター、スレーブ共に mysql-server を aptitude でインストールします。

# aptitude install mysql-server-5.0

ユーザーの登録

mysql ユーザーを追加します。(password1 は変更してください)

$ mysql --user=root mysql -p
mysql> GRANT ALL PRIVILEGES ON *.* TO mysql@localhost IDENTIFIED BY 'password1' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO mysql@'%' IDENTIFIED BY 'password1' WITH GRANT OPTION;

repl ユーザー(レプリケーション実行ユーザー)を追加します。(password2 は変更してください)

mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'localhost' IDENTIFIED BY 'password2';
mysql> GRANT REPLICATION CLIENT ON *.* TO repl@'%' IDENTIFIED BY 'password2';

マスター設定データの修正

マスターでの作業。
my.conf を修正。

# vi /etc/mysql/my.conf
-----------------------------------------
[client]
default-character-set = utf8        ← 追加

[mysqld]
log-bin                                         ← 追加
server-id = 1                                ← 追加
bind-address = 127.0.0.1
bind-address = 192.168.56.100  ← 追加

mysql の再起動

# /etc/init.d/mysql restart

スレーブ設定データの修正

スレーブでの作業。
my.conf を修正。

# vi /etc/mysql/my.conf
-----------------------------------------
[client]
default-character-set = utf8        ← 追加

[mysqld]
log-bin                                         ← 追加
server-id = 2                                ← 追加
master-host = 192.168.56.100    ← 追加    
master-user = repl                       ← 追加    
master-password = password2    ← 追加    
bind-address = 127.0.0.1
bind-address = 192.168.56.101  ← 追加

debian.cnf を修正。(password3 は変更してください)

# vi /etc/mysql/debian.conf
-----------------------------------------
[client]
host = localhost
user = debian-sys-maint
password = password3                ← 変更
socket = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
user = debian-sys-maint
password = password3                ← 変更
socket = /var/run/mysqld/mysqld.sock
basedir = /usr

debian-sys-maint のパスワードを登録。

$ mysql -u mysql -p
mysql> SET PASSWORD FOR 'debian-sys-maint'@localhost = PASSWORD('password3');

mysql の再起動

# /etc/init.d/mysql restart

スナップショットの取得

マスターでの作業。

更新系クエリを停止する為にFLASH文を発行してロックをかける。

$ mysql -u mysql -p

mysql> FLUSH TABLES WITH READ LOCK;

スナップショットの作成。

$ cd /var/lib/mysql
# tar cpf /var/tmp/mysql-snapshot.tar .

マスターステータスの確認。(この情報が重要)

$ mysql -u mysql -p

mysql> SHOW MASTER STATUS;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| mysqld-bin.000009 |      223 |              |                  | 
+-------------------+----------+--------------+------------------+

UNLOCK文を発行してロックを外す。

$ mysql -u mysql -p

mysql> UNLOCK TABLES;

スナップショットのデータをスレーブにコピー

$ scp /var/tmp/mysql-snapshot.tar 192.168.56.101:/var/tmp/

スナップショットのデータを展開

スレーブでの作業。

mysql を停止。

# /etc/init.d/mysql stop

マスターのスナップショットデータをスレーブに展開。

$ cd /var/lib/mysql/
# rm -fr *
# tar xpf /var/tmp/mysql-snapshot.tar

mysql を起動。

# /etc/init.d/mysql stop

レプリケーション開始位置の登録

スレーブでの作業。

マスターステータスの確認で記録した情報を登録。

$ mysql -u mysql -p
-----------------------------------------
mysql > change master to master_host='192.168.56.100', master_user='repl', master_password='password2', master_log_file='mysql-bin.000009', master_log_pos=223;

レプリケーションの開始

$ mysql -u mysql -p

mysql> slave start;

レプリケーションがうまく開始できない場合は、レプリケーションを止めます。

mysql> reset slave;
mysql> slave stop;

その後、スナップショットを再度展開してから開始します。(必要があれば、スナップショットを再取得します)

mysql> slave start;

レプリケーションの確認

スレーブでの作業。

show slave status \G

それぞれがyesだとレプリケーションができています。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

スナップショット以降の更新データは、レプリケーションを開始した後、同期されます。