MySQLレプリケーション設定の最後の所でハマった時の対処法
CASE:
とある案件でMySQLのレプリケーションを作ることになった。
MySQL公式サイトの レプリケーションの設定 の手順通りに進めていったのだが、最後らへんの
#MySQL上のコマンド mysql > show slave status;
を実行した時に、
#抜粋 Last_IO_Error : error connecting to master 'repl@[マスタDBが置いてあるIPアドレス]:3306' - retry-time: 60 retries: 86400
が表示されていて、接続エラーを起こしているという。
スレーブ側の設定が悪かったのかと思って、考えつく限りの方法を(最初から設定し直すなど)試したが何も変わらず。
職場の先輩からのアドバイスで、スレーブ側サーバのコマンドライン上で
$ telnet [マスタDBが置いてあるIPアドレス] 3306
を実行したら、Connection Refused となって接続を拒否られていることを確認した。
拒否られる理由として上がったのが、マスタ側のMySQLのポート3306が外部に公開されていないということ。
ということで、マスタ側サーバのコマンドライン上で
$ netstat -ln
を実行したら
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN
アドレスが127.0.0.1で表示されていた。ポート3306 は、外部に公開されていないというのが判明した。
ポートが外部に公開されていない原因は、MySQLの設定でbind-adressを変更していないからだった。
REMEDY:
マスタ側サーバのMySQL設定を変更する。
$ sudo vim /etc/mysql/my.cnf #書き換える bind-address = 127.0.0.1 ↓ bind-address = 0.0.0.0
MySQLを再起動する。
$ sudo /etc/init.d/mysql restart
これで、
$ netstat -ln
を実行したら
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN
127.0.0.1が0.0.0.0となって外部に公開されるようになった。
同様にスレーブ側サーバのMySQL設定も変更したら、うまくレプリケーションするようになった。