技術のご紹介

このブログを購読する

IT開発センターBlog

MySQLのレプリケーション機能

title=

こんにちは粟野です。
RDBMSを利用していると、データベースのバックアップや冗長化、負荷分散等が課題になってきますが、冗長化や負荷分散と聞くと「専用の機器が必要」「高度な設計や運用が必要」と考えてしまいます。
MySQLでは「レプリケーション」という機能が標準で利用でき、ある程度の規模までではありますが、これらの問題を比較的簡単に解決することが出来てしまいます。
今回はその、レプリケーション機能を有効にするための設定方法を書いてみたいと思います。
※本内容は新規構築用となります。既にご利用の環境への適用には適していませんのでご注意下さい。
■ サーバ環境
OS: CentOS 5.6 64bit
MySQL: 5.5.16-log
DB1(Master側) IPアドレス: 10.0.0.2
DB2(Slave側) IPアドレス: 10.0.0.3

■ 設定ファイルの編集(DB1での作業)
バイナリログを有効にし「server-id」に他のMySQLサーバのIDと重ならないような正数を設定します。

# vi my.cnf
-----
[mysqld]
log-bin
server-id=1001

■ 接続アカウントの作成(DB1での作業)
MySQLにログインし、接続用アカウントを追加します。
※「ユーザー名」「パスワード」は半角英数字に置き換えて下さい。

mysql> GRANT REPLICATION SLAVE ON *.* TO ユーザー名@10.0.0.3 IDENTIFIED BY 'パスワード';

■ データベースのバックアップ(DB1での作業)
DB2へデータの移動を行うためのアーカイブ作成の際、データベースが更新されないように書き込みをロックします。

mysql> FLUSH TABLES WITH READ LOCK;

現在のバイナリログの状態を確認(ロック中に行います)

mysql> SHOW MASTER STATUS;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| mysqld-bin.000001 |     1800 |              |                  |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

※「mysqld-bin.000001」「1800」の値は都度異なります。後から利用しますので記録しておきます。

レプリケーション対象のデータベース(テーブル)のアーカイブを作成します。

# cd /var/lib/mysql/
# tar cvf ~/データベース名.tar データベース名

ロックを解除します。

mysql> UNLOCK TABLES;

scp等の方法を利用し、上記で作成した「データベース名.tar」をDB2にコピーします。
※DB2では、ユーザー名、パーミッションを合わせます。

■ 設定ファイルの編集(DB2での作業)
DB2でもバイナリログを有効にし「server-id」をDB1とは違う正数に設定します。

# vi my.cnf
-----
[mysqld]
log-bin
server-id=1002

■ データベースアーカイブの展開(DB2での作業)
DB1から取得したアーカイブを、DB2のデータベース領域で展開します。

# cd /var/lib/mysql
# tar xvf データベース名.tar

MySQLを再起動します。

# /etc/init.d/mysqld restart

■ 接続アカウントの作成(DB2での作業)
MySQLにログインし、DB2からDB1に接続するための各種設定(ホスト名やユーザー名等)を行います。

mysql> CHANGE MASTER TO
        MASTER_HOST='10.0.0.2',
        MASTER_USER='ユーザー名',
        MASTER_PASSWORD='パスワード',
        MASTER_LOG_FILE='mysqld-bin.000001',
        MASTER_LOG_POS=1800;

※「ユーザー名」「パスワード」にはDB1で設定した内容を入力します。

■ レプリケーションの開始(DB2での作業)
レプリケーションを開始します。

mysql> START SLAVE;

■ 動作確認(DB2での作業)
動作状況を確認します。

mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
   Slave_IO_State: Waiting for master to send event
~
 Slave_IO_Running: Yes
Slave_SQL_Running: Yes
~

正常にレプリケーションが開始されると上記のような値になりますので、select文等を利用しデータが同期されている事を確認します。

詳細は公式サイトを参照下さい。
http://dev.mysql.com/doc/refman/5.1/ja/show-slave-status.html
※利用バージョン(MySQL 5.5)の日本語マニュアルがありませんでしたので、5.1のドキュメントをお知らせします。

以上で設定が完了となります。
既に動いているサービスへの適用は要注意ですが、今後新しく設定する際には、選択肢の1つとして検討しても良いのかもしれませんね。

PAGE TOP