mysqlのマスター・スレーブ設定ではまりました
こんにちはいけしまです。実はこのネタは去年書こうと思ってたんですけどはまってしまい記事が書けませんでした。
せっかくマスター・スレーブ同期なので無料お試しのVPSサーバーを2台借りて設定して終わらせよーと思ってました。最安値に近いとこ探してDTIさんのVPS ServersMan Entryを選択です。なんと1台で467円。
がっ!2台のサーバーがどうやっても接続できません。iptablesとかmysqlの設定とかいろいろ調べてもどうあってもダメ。pingしかとおりません。悩んでるうちにお試し期間過ぎてしまいましたー。もしやと思って年明けてからサポートに電話したら、
「お客様がご契約された2台のサーバーは同一マシン上なので接続できません。どうしても2台で接続したい場合、異なるリージョンでサーバー申込みしてください。」だそーです。サポートへの電話を遠慮してないでさっさと電話して聞かないとダメですね。
そんなわけで、DTIさんのサーバーとすでに契約しているsakuraのVPSでつないでみます。
DTIはCntOS 7.1、sakuraがCentOS 6.6です。
まずは同じバージョンのmysqlインストールします。
使ったのはmysql Ver 14.14 Distrib 5.6.27です。
次にスレーブから接続できるようにマスター側で穴をあけました。/etc/sysconfig/iptablesに下記を書いてiptablesを再起動。
-A INPUT -i eth0 -s xxx.xxx.xxx.xxx -p tcp -m state –state NEW -m tcp –dport 3306 -j ACCEPT
同期するためのテーブルをマスター側で作成します。テストなので簡単なの。
create table test.member (id int, name varchar(256)) ; insert into test.member(1, 'AAAAA'); insert into test.member(2, 'BBBBB'); insert into test.member(3, 'CCCCC'); insert into test.member(4, 'DDDDD'); insert into test.member(5, 'EEEEE');
外部サーバーからアクセスできるようにレプリケーション用のユーザーを作ります。
mysql > GRANT REPLICATION SLAVE ON *.* TO 'repl'@'xxx.xxx.xxx.xxx' IDENTIFIED BY 'password';
次にマスター側でmy.cnfを修正。下記を追加しました。
ついでに外部サーバーからの接続を制限するような設定がないかを確認。デフォルトでは特にそういう記述はありませんでした。
[mysqld]
log-bin
server-id=1001
で、スレーブ側もmy.cnfを修正。下記を追加してます。
[mysqld]
server-id=1002
my.cnfを修正したのでmysqlを再起動しておきます。
service mysql restart
マスター側から初期データを抜いてスレーブに持ってきます。
まずはサーバーでロックをかけてサーバーのステータスを取得。
mysql > FLUSH TABLES WITH READ LOCK; mysql > SHOW MASTER STATUS; +-------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-------------------+----------+--------------+------------------+-------------------+ | mysqld-bin.000003 | 120 | | | | +-------------------+----------+--------------+------------------+-------------------+
マスターでバックアップをとります。
mysqldump -u root -p –all-databases –lock-all-tables > dbdump.sql
バックアップをスレーブでリストア。
mysql -u root -p < dbdump.sql
スレーブ側でマスターの情報を登録してスレーブ開始!。
mysql > CHANGE MASTER TO MASTER_HOST='atsike.com', MASTER_USER='repl', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysqld-bin.000003', MASTER_LOG_POS=120; mysql > start slave;
サーバーの選定以外はうまくいったかのように書いてますが、実はいろいろトラブってます。下記が要注意事項でしょうか。
・grant replicationのサーバーのアドレスを間違えないように
・iptablesの設定で3306にアクセスできるようになっているか
・マスターとスレーブのmysqlのバージョンが異なる場合、sqlエラーがないように
・マスターに存在してスレーブに存在しないDBスキーマがあってマスター側のテーブルで更新があると同期がこける
・一度同期がこけるとマスター側のバックアップからやり直しなのでとてもめんどくさい
実際に運用するとこれ以外もいろいろあるかもしれませんね。
運用後の記事についてはまたいつか書きたいと思います。
ではまたー。