カスタム検索
|
Tweet |
|
|
MySQLのレプリケーションの実験
Created: 23 August 2008
以下で説明されている内容をみて実験してみました。
http://www.irori.org/doc/mysql-rep.html
レプリケーションの小技 (23 August 2008)
マスタサーバーの設定 (23 August 2008)
スレーブサーバーの設定 (23 August 2008)
同期を取ってレプリケーションを開始する (23 August 2008)
状態を確認する方法
マスター側の状態は、以下のコマンドで確認できます。
mysql> show master status;スレーブ側の状態は、以下のコマンドで確認できます。
mysql> show slave status;
バイナリーログを削除する方法
マスター側の状態は、以下のコマンドで確認できます。
mysql> purge master logs to 'tomo-bin.0003';
指定した'tomo-bin.0003'が消えるのではなく、それより古い、'tomo-bin.0001'や'tomo-bin.0002'が消えるそうです。
作業の概要
スレーブサーバーは、マスタサーバーのバイナリログを取得して機能を果たしますので、マスタサーバーは、バイナリログを出力する必要があります。
また、スレーブサーバーからの接続を許可するための権限を設定する必要があります。
稼働中のデータベースにほとんど影響を与えることなく、設定ができます。
バイナリログの設定
"/etc/my.cnf"に以下の設定を加えて、再起動します。
"log-bin"で、バイナリ出力を指定します。"server-id=10"でサーバーIDを指定します。
[mysqld] log-bin server-id=10
バイナリログの確認
mysqldを再起動して、"/var/lib/mysql"を確認します。
# ls -l /var/lib/mysql/ : -rw-rw---- 1 mysql mysql 79 Aug 21 00:08 tomo-bin.000001 -rw-rw---- 1 mysql mysql 19 Aug 21 00:08 tomo-bin.index : #
上記のように、"/var/lib/mysql"に、"xxxx-bin.000001"や、"xxxx-bin.index"ができておればOKです。
接続許可の設定
スレーブからの接続を許可します。
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@192.168.0.0/24 IDENTIFIED BY 'repl';
作業の概要
バイナリログを取得する設定をします。
設定する
"/etc/my.cnf"に以下の設定を加えて、再起動します。
[mysqld] server-id=11 master-host=192.168.83.1 master-user=repl master-password=repl
複数のスレーブを動作させる場合、"server-id"に固有の番号を割り振ればOKです。
バイナリログの確認
mysqldを再起動して、"/var/lib/mysql"を確認します。
# ls -l /var/lib/mysql/ : -rw-rw---- 1 mysql mysql 82 Aug 23 07:49 tomo-relay-bin.000002 -rw-rw---- 1 mysql mysql 32 Aug 21 09:46 tomo-relay-bin.index : #
作業の概要
マスターがすでに稼働中で、後からスレーブを起動させる場合の設定です。
マスターもスレーブも"my.cnf"には、必要な設定はされているものとします。
まずマスタ側で以下の手順を実行します。
- マスタの更新を一旦停止します
- データベースをtarでコピーします
- 停止時点のバイナリーログの位置(Position)をメモします
- マスタの更新停止を解除し、通常動作に復帰します
マスタ側が、サービス中であれば、すばやく実行します。
次に、スレーブ側で以下の手順を実行します。
- mysqlを停止し、"my.cnf"を一旦コメントアウトします。
- tarを解凍しデータベースイメージを作ります
- mysqlを起動して、マスタ情報を設定します
- mysqlを停止し、"my.cnf"を有効にします
- mysqlを起動します
スレーブ側は、「バイナリーログの位置(Position)」をメモしておけば、たとえ1日後であっても、起動すればいいです。
マスターのデータの事前取得
以下のコマンドで、データベースのイメージを取得しますが、停止時間を把握するため事前に実行してみます。
データベースを稼動したまま以下を実行します。
# tar cpf /root/mysql-images.tar .
tar: ./mysql.sock: socket ignored
#同じく2回実行すると、キャッシュ効果で、1回目より早くなるようですので、その意味からも事前に実行しておくのは有益なようです。
"tar: ./mysql.sock: socket ignored"は無視してかまいません。
マスターのデータ取得の実行
端末は2つ必要です。
片方では、MySQLを起動し、"flush tables with read lock" を実行します。
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)
mysql>
端末を切り替えて、データ取得を実行します。
# tar cpf /root/mysql-images.tar .
tar: ./mysql.sock: socket ignored
#終了後、端末を戻して、以下を実行します。
mysql> show master status;
+------------------+-----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+-----------+--------------+------------------+
| tomo-bin.000001 | 104926 | | |
+------------------+-----------+--------------+------------------+
1 row in set (0.02 sec)
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
mysql>
スレーブにデータイメージ解凍
以下のように、まず、MySQLを停止し、既存イメージを削除し、コピーしてきたマスターに入れ替えます。
そして、マスターのバイナリログなどの不要なファイルを削除します。
# service mysqld stop
# cd /var/lib/mysql
# rm -fr *
# tar xpf /root/mysql-images.tar
# rm *-bin.* *.pid *.errスレーブを正確に同期させるため、"/etc/my.cnf"を以下のようにコメント付にします。
[mysqld]
server-id=11
#master-host=master.good-stream.com
#master-user=slave1
#master-password=slave1MySQLを起動します。
# service mysqld start
# mysqlバイナリログの位置を指定して、スタートされれば、同期動作の開始です。
mysql> change master to
-> master_host='master.good-stream.com',
-> master_user='slave1',
-> master_password='slave1',
-> master_log_file='tomo-bin.000001',
-> master_log_pos=104926;
Query OK, 0 rows affected (0.16 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql>しばらくして、一旦停止します。
# service mysqld stop "/etc/my.cnf"のコメントをはずして、再起動後に、自動的にレプリケーション動作するようにします。
[mysqld]
server-id=11
master-host=master.good-stream.com
master-user=slave1
master-password=slave1再び起動します。
# service mysqld start