[前][次][番号順一覧][スレッド一覧]

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]