ハマログ

株式会社イーツー・インフォの社員ブログ

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;

では同期を確認します。
マスターでデータを登録してー
mysql_0001

スレーブで確認すると同期されてます!
mysql_0002

サーバーの選定以外はうまくいったかのように書いてますが、実はいろいろトラブってます。下記が要注意事項でしょうか。
・grant replicationのサーバーのアドレスを間違えないように
・iptablesの設定で3306にアクセスできるようになっているか
・マスターとスレーブのmysqlのバージョンが異なる場合、sqlエラーがないように
・マスターに存在してスレーブに存在しないDBスキーマがあってマスター側のテーブルで更新があると同期がこける
・一度同期がこけるとマスター側のバックアップからやり直しなのでとてもめんどくさい

実際に運用するとこれ以外もいろいろあるかもしれませんね。
運用後の記事についてはまたいつか書きたいと思います。
ではまたー。

  池島 篤則   2016年1月18日


関連記事

これ読める?日本語が読める人なら読めないフォント

これ読めますか? こちらはタイに行った際に見かけたフォントなんですが、日本人から…

リザーブドインスタンスの期限が近づいたら通知する

AWSのリザーブドインスタンス(RI)を購入し、運用を続けていましたが、期限切れ…

仕事でも使うあの記号を出したいお話

つ~じ~です。気づいたら2023年も終わりを迎えようとしております、早いです。今…


← 前の投稿

次の投稿 →