mysql:9804
From: "HIROSE, Masaaki" <"HIROSE, Masaaki" <hirose31@xxxxxxxxxx>>
Date: Fri, 09 Jul 2004 19:06:39 +0900
Subject: [mysql 09804] Re: レプリケーションスレーブの能動的な同期
ひろせといいます on "[mysql 09789] レプリケーションスレーブの能動的な同期" <20040707153336.0f2a2d61.y-ito@xxxxxxxxxx> at Wed, 7 Jul 2004 15:33:36 +0900 Yasumitsu Ito <y-ito@xxxxxxxxxx> wrote: > レプリケーションスレーブが同期していないことを気づいたときに、 > スレーブ側から能動的に同期を取りに行く方法を探しています。 > > [環境] > mysql-4.0.18-*.rpm (mysql.comから取得したRPM) > > *master > TurboLinux 8.0WS > 常時接続 固定IP > > *slave > VineLinux 2.6r4 > ダイアルアップルータを介して 64Kで接続 > > マスター-スレーブ 間はインターネットを介しており、 > stunnel-4.04にてSSL暗号化しています。 > (ここではstunnelについては除外して書きます) > > [問題点] > 何らかの原因で、ネットワークが切断されるため、 > 同期がとれず、同期回復まで待たなければならない。 > そこで、スレーブから能動的に同期をあわせたい。 ネットワーク接続が回復すれば、マスターとスレーブ(のI/Oスレッド)のやり とりも再開されて、待てばマスターに追いつきませんか? > [質問] > スレーブ側で > > slave$ mysql --user=root --password=pass -e "show slave status" > slave$ mysql --user=slave_account --host=master --password=pass -e "show master status" > > を行い、ポジションの違いを発見した場合に、 『同期がとれていない』と判断するのは、『ポジションが一致しない場合』じゃ なくて『ポジションがある程度以上離れている場合』としないとまずいと思い ます。 なぜなら、 o MySQLのレプリケーションは非同期である。 o 『同時に』SHOW MASTER STATUS と SHOW SLAVE STATUS が実行できるわけ ではない。 の 2 つの理由からです。 > slave$ mysql_synchronise > > の様な自作コマンドを発行して、強制的に同期をあわせる作業を行いたい。 > > たとえば、その中身を > slave mysql> slave stop; > slave mysql> slave start; > slave mysql> select master_pos_wait('master_log_file', master_log_pos); > > などと考えるのですが、どうでしょうか? SELECT MASTER_POS_WAIT を実行したからといって、レプリケーションの処理が 速くなるわけでも遅くなるわけでもありません。単に、指定したポジションに 達した時点でスレーブのレプリケート処理が停止するだけです。 どうしても同期させたいのであれば、 『Q: スレーブが追いつくまでマスタの更新をブロックするにはどうしますか。』 http://dev.mysql.com/doc/mysql/ja/Replication_FAQ.html にあるように、マスターで更新ロックをしてから SELECT MASTER_POS_WAIT し ないといけませんが、先にも述べたように、SHOW SLAVE STATUS で確認して I/O スレッドと SQL スレッドが動いていれば、放っておけばマスターに追いつ くはずです。 # スレーブ機の性能が低くて更新処理が追いつかないとか、ネットワークの帯 # 域が小さすぎてバイナリログのコピーが遅れるといったことがなければの話 # ですが。 > LANケーブルを引っこ抜いてしまったあとに、 > slave stop; > slave start; > を実行しても、すんなりと通ってしまったり、 > 逆に slave stop; を実行したときにプロンプトがかえってくるまでに > 非常に多くの時間がかかったりと、 > いまいち挙動が掴めていないのが現状です。 SLAVE STOPに時間がかかるのはわかりませんが、 マスターで ifconfig down (/etc/init.d/network stop) しても、スレーブで は I/O、SQL スレッド共に動いたままなので、マスターで ifconfig up すれ ば STOP/START SLAVE などしなくてもレプリケーションは再開されました。 > slave_net_timeout の時間を小さくする方法も考えられますが、 > あまり小さな値では、無駄なトラフィックを生むだけのような気がします。 > デフォルトでは3600秒になっているのですが、 > たとえば、これを10秒などとしてしまうと、なにか弊害があったりするのでしょうか? slave_net_timeout が使われるのは最初の1回だけなので、小さくしても問題 ないんじゃないかと思います。 ただ、slave_net_timeout や master-connect-retry を小さくしてもしなくて も、マスターが復活すれば程なくレプリケーションは再開されます。そのため にはスレーブで I/O と SQL スレッドが動いている必要があるので、SHOW SLAVE STATUS で両スレッドの状態を監視する必要はあります。 ふと思ったのですが、もし、回線復旧後になかなかレプリケーションが再開さ れないのが問題なのであれば、回線復旧後の stunnel の再接続がうまくいっ てないという問題だったりしませんか? ではでは -- ひろせ http://www.irori.org/
9789 2004-07-07 15:33 [Yasumitsu Ito <y-ito] レプリケーションスレーブの能動的な同期 9790 2004-07-07 21:58 ┣["Ohashi Koji" <ohash] mysqldumpの出力結果を取り込もうとするとUnknwon command -> 9804 2004-07-09 19:06 ┗["HIROSE, Masaaki" <h] 9805 2004-07-09 23:43 ┗[Yasumitsu Ito <y-ito] 9845 2004-07-14 00:22 ┗[Yasumitsu Ito <y-ito] 9866 2004-07-16 00:08 ┗["HIROSE, Masaaki" <h]