ひでっぷの技術メモ

はてなダイアリーから移行しました

mysqlのレプリケーション

mysqlレプリケーションをやってみました。
レプリケーションとはサーバーの複製を他のサーバーに自動的に作成するものです。
これをしておくと一台のサーバーのハードがおしゃかになっても、レプリケーションしてたサーバーに接続すれば大丈夫!という代物です。

会社の先輩がLinuxでやっていたんですが、自分でもやってみようと思い資料を片手にごそごそと・・・。

今回の納めるマシンはWindowsなんでWindowsでもちゃんとできるかという検証も兼ねてやりました。

以下、メモ代わりの設定方法

Windowsにはmy.confがない代わりにmy.iniがあります。
これは、winmysqladminで編集することができます。
サービスの起動/終了も同じくwinmysqladminから。
資料のmy.confってところをmy.iniに置き換えればいいという感じですね。

『マスターサーバー側の設定』

1.my.cnf[my.ini]に以下の記述を追記する。


[mysqld]
log-bin
server-id=1
max_allowed_packet=16M

server-idは任意の数。スレーブ側と違う値にしないといけない
(何を勘違いしたか同じ値にしていてしばらく考え込みました)
max_allowed_packetはスレーブ側も同じ値にする

winmysqladmin
設定を変更したら、mysqlを再起動。
(Windowsの場合、my.ini Setupで編集。 Save Modeficationを忘れずに)
んで、Stop service →Start serviceですな。
なんかやたら時間かかるときがある・・・。

2.レプリケーション用のMySQLユーザーを作成。

mysql>GRANT REPLICATION SLAVE ON *.* TO slave_user@'%' IDENTIFIED BY 'PASS';

ちなみに旧バージョンの場合(3.23とか?)は
mysql>GRANT FILE ON *.* TO slave_user@'%' IDENTIFIED BY 'PASS';

自分のmysql旧バージョンだと思ってこれやってました。
コマンドは通っちゃうんだよね・・・。

3.キャッシュされている書き込みをフラッシュし、データベースへの書き込みを禁止する(ログファイルのオフセット値が変わるのを防ぐ)

mysql>FLUSH TABLES WITH READ LOCK;

4.マスターサーバのログファイル名とオフセット値を調べる
mysql>SHOW MASTER STATUS;

うまく行くと以下のようにログファイル名とオフセット値がわかります。
+-------------------------------------------------------+

File Position Binlog_do_db Binlog_ignore_db
                                                                                                                • +
hogehoge-bin.001 73 +

hogehoge-bin.001がログファイル名。73がオフセット値です。

5.データベースのデータをコピーしておく。
linuxの場合はだいたいvar/lib/mysql
windowsの場合はc:\mysql\dataです。
my.cnfもしくはmy.iniのdatadirを見ればわかります。

6.マスターサーバーのロックを解除する

mysql>UNLOCK TABLES;

以上でマスターサーバーの設定は終了


『スレーブサーバー側の設定』
1.マスターサーバー側で設定した[mysqld]の値を設定する。
server-idはマスターサーバーと違うものにすること!!
マスターサーバーと同じ用に設定を変更したらmysqlを再起動する。

2.mysqlを停止した状態でマスターサーバーからコピーしたデータをスレーブのデータにコピーする。(上書きです。)

3.スレーブサーバーを起動する。

4.スレーブサーバーにマスターサーバーの情報を設定する。

mysql>CHANGE MASTER TO
MASTER_HOST='マスターサーバーのホスト名',
MASTER_USER='slave_user',
MASTER_PASSWORD='マスターで設定したパスワード',
MASTER_LOG_FILE='マスターで調べたログファイル名,MASTER_LOG_POS=173(マスターで調べたオフセット)

スレーブスレッドがすでに動いている場合、設定ができないので、先に
mysql>SLAVE STOP;

しておく。

5.スレーブスレッドを開始する。

mysql>SLAVE START;

これでレプリケーションは完成。
うまくいかない場合はエラーログファイルに原因がかかれます。
データファイル内のhogehoge.errという名前のファイル。
Windowsの場合、mysqlが起動していると見れないのでmysqlを終了してから、メモ帳などで見る。

おいらが失敗していたのは、

  • server-idをマスター、スレーブとも同じにしていた。

  • slave_userユーザーにREPLICATION SLAVE権限を与えていなかった。

  • の2点ですね。

    結構はまりましたが、その分頭にたたきこまれたと思います。
    これで、レプリケーションはばっちし!