ご利用のブラウザは、JavaScript が無効 となっていませんか?
このサイトでは、コンテンツの一部が非表示 、あるいは、コメント、お問い合わせの投稿ができない 、検索ができない ことがあります。
今回は、mysqlのレプリケーション(replication)です。
レプリケーション(replication) とは、
直訳のとおり
複製 を意味します。(レプリカ(replica)と語源は一緒なので、こちらがピンとくるかもしれません)
mysqlでレプリケーションと言うと、マスター、スレーブのそれぞれのmysqlサーバーを構築することに他なりません。
マスター1台に対して、スレーブ複数台というのが一般的なmysqlサーバーの構成になります。
一般的には、マスター mysql サーバー でデータベースの更新処理(書き込み)を受け持ち、スレーブ側で参照処理(読み込み)を受け持つことで負荷を分散させたり、バックアップデータベースを作成するなど行うことができます。
上の図は、その典型的なレプリケーションの例を示したものです。
ユーザは、1台のサーバーにアクセスしているつもりですが、実際のデータベースへの書き込み処理は、バックにあるマスターサーバー側で処理され、データベースの読み込み処理は、フロントのスレーブサーバーで処理されます。
特に参照がメインのサーバーでは、かなりの負荷分散が期待されます。
mysqlのレプリケーションは、よく負荷分散もしくはバックアップに用いられます。
今回は、その簡単な設定方法について解説してみたいと思います。
mysqlのバージョンを合わせる
マスター、スレーブにかかわらず全てのレプリケーション設定を行うmysqlのバージョンをすべて同じにします。
mysqlのバージョンを合わせるためには、基本的に最新バージョンに合わせると良いでしょう。
やり方は、
CentOS ScientificLinux なら、yum でアップデートして最新にします。( 参照 : yumでmysql5.1系を最新版へアップデートする )
Debian Ubuntu なら、apt (apt-get ot aptitude) でアップデートして最新にします。
マスターmysqlのレプリケーション設定を行う
マスター側のmysqlのレプリケーション設定を以下の手順で行います。
mysqlの設定ファイル(my.cnf)を編集します。
設定ファイルのデフォルトディレクトリはOSによって異なります。
CentOS ScientificLinux : /etc/my.cnf
Debian Ubuntu : /etc/mysql/my.cnf
この設定ファイルを以下のように編集します。
...
[ mysqld]
...
## Replication
server-id = 101
log-bin = /var/lib/mysqllogs/bin-log
...
server-id : サーバー種別番号
※1,2 という番号については、mysqlのデフォルト値として用いられる場合があるので、できれば避けた方が良いでしょう。
log-bin : バイナリログファイルサフィックス名
※この設定例では、/var/lib/mysqllogs/というディレクトリ配下に、bin-log.xxxの名前でバイナリログファイルが作成されていきます。
mysqlの書き込みを一時停止してバックアップを作成する。
まずmysqlの更新を一時停止する。
$ mysql - uroot - p - Dmysql
password :
mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.01 sec)
別のシェルからtarでmysqlのバックアップファイルを作成する。
$ cd / var/ lib
$ tar cvfz / tmp/ mysql- bin. tar. gz mysql
...
tarで丸めてしまうのは、mysqlのデータディレクトリになります。
ここでは、そのディレクトリが、/var/lib/mysql としています。
mysqlのデータディレクトリは、mysqlの設定ファイル(/etc/my.cnf)を確認するとわかります。
この例では、ディレクトリは、
/var/lib/mysql です。
mysqlのバックアップした状態を確認する。
ここでバックアップした状態が、mysqlのどのような状態だったか確認しておきます。
後に、ここで表示された情報を元にスレーブ側の設定が必要となりますので、表示された情報は、すべて書きとめておきましょう。
先にmysqlの更新を一時停止したシェルを使います。
mysql> SHOW MASTER STATUS;
+---------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| mysql-bin.003 | 73 | test | manual,mysql |
+---------------+----------+--------------+------------------+
ここで、以下のように表示されることがあります。
mysql> SHOW MASTER STATUS;
Empty set (0.02 sec)
これは、何も情報がないと言っているだけでエラーではありません。
※まだ、バイナリログを使用していない場合は、このように表示されます。
Emptyだったことを書きとめておきましょう。
mysqlの更新を再開させる。
先にmysqlの更新を一時停止したシェルを使い、更新を再開させます。
mysql> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)
外部サーバーからのmysqlへのアクセスするためのユーザを作成する。
先にmysqlの更新を一時停止したシェルを使い、ユーザを作成します。
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave-user'@'%' IDENTIFIED BY 'slave- password';
ここでは、
ユーザ名 :slave-user
パスワード :slave-password
としています。
必要に応じて変更しましょう。
ユーザ名の後に‘@’%’ を付加することで、どのサーバーからもアクセスを可能としています。
もし、ドメイン名などで限定したい場合は、‘@’%.example.com’ などとし、example.comのサブドメインはすべて可能なように設定することもできます。
外部サーバーからのmysqlへのアクセスするためのポートをオープンする。
外部サーバーからmysqlをアクセスできるようにTCPポートをオープンします。
$ /sbin/iptables - A INPUT - s 222. 222. 222. 222 - p tcp -- dport 3306 - j ACCEPT
IPアドレス”222.222.222.222″から、ポート番号 3306 (mysqlのデフォルトポート番号) へのアクセスを許可するようにしています。
環境に合わせて書き換えましょう。
mysqlサーバーを再起動して、マスターサーバーとする。
先にmysqlの更新などを行ったシェルでmysqlを閉じます。
mysql> exit
$
mysqlを再起動します。
$ /etc/init.d/mysqld restart
mysqld を停止中: [ OK ]
mysqld を起動中: [ OK ]
これで、マスター側の設定は完了です。
スレーブmysqlのレプリケーション設定を行う
スレーブ側のmysqlのレプリケーション設定を以下の手順で行います。
mysqlの設定ファイル(my.cnf)を編集します。
設定ファイルのデフォルトディレクトリはOSによって異なります。
CentOS ScientificLinux : /etc/my.cnf
Debian Ubuntu : /etc/mysql/my.cnf
この設定ファイルを以下のように編集します。
...
[ mysqld]
...
## Replication
server-id = 102
server-id : サーバー種別番号
※1,2 という番号については、mysqlのデフォルト値として用いられる場合があるので、できれば避けた方が良いでしょう。
また、マスター側のserver-idとダブらないように気をつけましょう。
mysqlを停止してリストアする。
まずmysqlを停止する。
$ /etc/init.d/mysqld stop
mysqld を停止中: [ OK ]
$
tarでマスタ側で作成したmysqlのバックアップファイルからリストアする。
$ cd / var/ lib
$ tar xvfz / tmp/ mysql- bin. tar. gz mysql
...
tarで解凍・展開するのは、mysqlのデータディレクトリになります。
ここでは、そのディレクトリが、/var/lib/mysql としています。
mysqlのデータディレクトリは、mysqlの設定ファイル(/etc/my.cnf)を確認するとわかります。
この例では、ディレクトリは、
/var/lib/mysql です。
mysqlを起動する。
$ /etc/init.d/mysqld start
mysqld を起動中: [ OK ]
mysqlのスレーブ設定を行う。
$ mysql - uroot - p - Dmysql
password :
mysql> CHANGE MASTER TO
MASTER_HOST='10.0.0.1',
MASTER_USER='slave-user',
MASTER_PASSWORD='slave-password',
MASTER_LOG_FILE='mysql-bin.003',
MASTER_LOG_POS=73;
Query OK, 0 rows affected (0.01 sec)
マスター側設定の3項で確認した情報が
Empty だった場合、
MASTER_LOG_FILE : ”
MASTER_LOG_POS : 4
とします。
mysql$> CHANGE MASTER TO MASTER_HOST= '10.0.0.1' , MASTER_USER= 'slave-user' , MASTER_PASSWORD= 'slave-password' , MASTER_LOG_FILE= '' , MASTER_LOG_POS= 4 ;
mysqlのスレーブを起動する。
mysql> START SLAVE;
これで、スレーブとして起動完了のはずです。
mysqlにエラーが発生していないか確認しておきましょう。
mysqlのエラーログの出力先は、以下のように設定したファイルにログが出力されます。
[ mysqld_safe]
...
# 最近は、log-error -> log_error と記述するようです。
log-error = /var/log/mysqld.log
...
また、syslogへ出力する場合は、以下のように設定します。
[ mysqld_safe]
...
syslog
...
$ cat / var/ log/ mysqld. log
...
101226 17:22:16 [Note] Slave SQL thread initialized, starting replication in log 'FIRST' at position 0, relay log './mysqld-relay-bin.000001' position: 4
101226 17:22:16 [Note] Slave I/O thread: connected to master 'slave-user@10.0.0.11:3306',replication started in log 'FIRST' at position 4
...
のように出力されていればOKです。
...
101226 17:19:45 [ERROR ] Error reading packet from server: Binary log is not open ( server_errno=1236)
101226 17:19:45 [ERROR ] Slave I/O: Got fatal error 1236 from master when reading data from binary log: 'Binary log is not open', Error_code: 1236
...
のように
ERROR が出力されていれば、そのエラーを取り除きましょう。
※上記のエラーは、マスター側にデータがない・・・というエラーで、正しくマスターが動作していないことが考えられます。
ざっとこんな感じです。
意外と簡単だったと思いませんか?
最初にやったときは、ちょっと、おっかなびっくりな感じでやりましたが、1度やれば、それほど難しくはありません。
一度お試しあれ。
ご利用のブラウザは、広告ブロック(AdBlockなど) が適用 となっていませんか?
このサイトでは、コンテンツの一部が非表示 、あるいは、コメント、お問い合わせの投稿ができない 、検索ができない ことがあります。
関連記事 :
2013年1月10日, 11:23 PM
[…] http://server-setting.info/centos/mysql_replication.html […]