MySQLレプリケーションの実装でやるコト
MySQLサーバでレプリケーションを実装する際の手順をメモ。
1.マスターのmy.cnf設定。
レプリケーション実装において、最低限覚えておきたいのはserver-idをマスタ/スレーブ間で
一意のものにする必要があること。運用上のポリシーにもよるが、個人的にはその他の
値は同一にしておくのが望ましいと思う。
2.レプリケーション専用ユーザの作成。
スレーブからマスターへ接続するために必要となるレプリケーション専用のユーザを、マスター上のMySQLに作成する。
mysql > GRANT REPLICATION SLAVE ON *.* TO repl_user@’slave-host’
- > IDENTIFIED BY ‘password’;
スレーブホスト名の指定は、ネットワークアドレス/サブネットマスクの指定でもよい。
192.168.30.0/24のネットワークにスレーブが存在する場合は、repl_user@’192.168.30.0/255.255.255.0′とする。
なお、レプリケーションセットの前に疎通確認、リモートログインの確認はしておいた方がいいと思う。
3.マスタ上のMySQLを停止する。
レプリケーション開始時はマスターとスレーブの同期が取れている必要があるため、
ダンプ採取時はMySQLインスタンスを一旦停止する。ただし、すでに稼働中などで
停止できない場合は、更新系のクエリを止めた状態にしてフルダンプ、でもOK。
# mysqladmin -u root -p shutdown
4.マスタ上データのフルダンプを実施。
とりあえず、tarでアーカイブを作成する方法。アーカイブ対象はMySQLデータディレクトリ以下。
# tar -cvf /tmp/mysql-snapshot.tar /var/lib/mysql/data
- -excludeオプションで不要なバイナリファイルなどをコピー対象から外しておいた方がよい、かも。
また、tarではなくLVMのスナップショット機能を利用するか、mysqldumpの実行でも可。
レプリケーションを開始するバイナリログは、次にインスタンスを起動した時に
生成されたものから、になる。停止時点でmy-host.000004まで生成されていたら、
my-host.000005の先頭から適用すれば良い。この番号は後ほどスレーブ側で指定するため、
メモしておく。
5.マスターのMySQLインスタンスを起動。これ以降スレーブ側での作業となる。
6.スレーブのmy.cnf設定。
server-idをマスターとは別の値にしておく。
不用意に更新を行うことがないよう、read_onlyを設定するのが望ましいと思われる。
また常識的な対処であるが、マスターとスレーブの文学コードは同一にしておく。
追記
運用によってはread_onlyはmy.cnfに記述するのではなく、稼働時にシステム変数の
セットで対応してもよい。
7.スレーブのMySQLを停止する。
# mysqladmin -u root -p shutdown
8.スレーブにマスターのデータをコピーする。3.で作成したアーカイブをスレーブ上に展開する。
展開時はユーザとパーミッションがMySQLの実行ユーザで読み書きできるように注意。
9.スレーブのMySQLを起動。
10.CHANGE MASTER TOを実行し、マスターへの接続設定をする。この時点では
マスターへの接続は実行されない。
mysql > CHANGE MASTER TO MASTER_HOST=’my_host’,
- > MASTER _PORT=3306,MASTER_USER=’repl_user’,
- > MASTER_PASSWORD=’password’,
- > MASTER_LOG_FILE=’my-host.000005′,
- > MASTER_LOG_POS=4;
それぞれの項目は、まぁそのまんまである。
MASTER_LOG_FILEは、どこからバイナリログを読むかの指定。マスターでのバックアップ
直後に生成されたバイナリログファイル名を指定する。
MASTER_LOG_POSはバイナリログのどの位置からレプリケーションを開始するかの指定。
省略した場合のデフォルト値は4。バイナリログ先頭の値は0ではなく4なので、
ログの先頭から開始する場合省略可能。
補足
CHANGE MASTER TO文実行により、データディレクトリに以下のファイルが生成される。
これらは直接作成・編集するものではない。
・master.info ←マスターへの接続に必要な情報を格納したファイル。
・relay-log.info ←リレーログをどこまで適用したかを管理するファイル。
・slave-host-relay-bin.index ←リレーログのインデックスファイル。
・slave-host-relay-bin.000001 ←リレーログファイル本体。
11.レプリケーションをスタートさせる。
以下コマンドの実行により、レプリケーションがスタートする。
mysql > SLAVE START;
またはMySQLインスタンスを再起動することでも自動的にマスターへの接続が開始される。
ただし、my.cnfでskip-slave-startを指定すると、起動時の再接続は行われない。
12.動作確認。
スレーブでSHOW SLAVE STATUSを実行。
「slave_IO_Running」と「slave_SQL_Running」が両方ともYesになっていればOK。
レプリケーションが動作しない場合には、以下の点を特に注意して確認する。
Masterのレプリケーションユーザーの権限設定とSlaveの環境設定ファイルの内容が噛み合わずエラーとなることが多い、らしい。
・SHOW SLAVE STATUSでのLast_Errorの表示。
・Master/Slaveのエラーログファイル”ErroeLog”にエラーが記録されていないか。
・MasterのBinaryLogが有効か。
・SlaveのMasterおよびレプリケーション・ユーザーが間違っていないか。
問題を取り除いたら、再度SLAVE STARTを実行する。
ここまででレプリケーションの作業はひとまず終了。実装後のレプリケーションが正常に
実施されているか状況確認も必要になるが、それについてはまた別途。