TL;DR
- MySQL Router 2.1.5からおもむろに connect_timeout がミリ秒単位になった
- 2.1.4とそれ以前では単位は 秒 だった
- 多分バグ
- 暗黙のデフォルトは1
- 1ミリ秒以上時間がかかる(たとえばインターネット越しの)destinationに接続できないエラーが出る…
- 【2018/02/28 23:24】バグ認定されて、MySQL Router 2.1.6 で直るらしい とのこと
ことの起こりは単なるError: 2013(実際はコマンドラインクライアントじゃなくて、 レプリケーションのI/Oスレッドが起こしたんだけど )
$ mysql -h127.0.0.1 -P13306
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0
$ sudo less /var/log/mysqlrouter/mysqlrouter.log
2018-02-21 12:27:25 INFO [7fe221c14700] [routing:test] started: listening on 127.0.0.1:13306; read-write
2018-02-21 12:27:39 WARNING [7fe213fff700] Timeout reached trying to connect to MySQL Server xxxx:3306: Connection timed out
2018-02-21 12:27:48 INFO [7fe213fff700] [routing:test] fd=5 Pre-auth socket failure 127.0.0.1: client auth timed out
こればっかり出て、destinationに全然つながらなくなった。
取り敢えずリリースノートにはそんな変なことは書いてない。
とはいえタイムアウトって書いてあるからタイムアウトなんだろうけどなんか変わったのかな? って調べたらごっついコミットが出てきた。
select
から poll
にまるっと書き換わってる。だが8か月前。だったら2.1.5関係ないかと思ったら、2.1.4が2017/07のリリースだから8か月前でも2.1.5が初出だった。マジか。
で、 バグレポート に書いたとおり、以前は
select
のタイムアウト timeval型の tv_secにそのまま connect_timeout
を渡していたのでタイムアウトまでの単位は秒だったが、 poll
のタイムアウト int型のtimeout_msに connect_timeout
を 1000倍しなければならないのにそれをせずに そのまま渡しているので、タイムアウトまでの単位がミリ秒になってしまった。
mysqlrouter.conf の
[routing:xx]
セクションに明示的に connect_timeout = 今までの値の1000倍
を書けば取り敢えず回避可能なので踏み抜いた際にはお試しください。
0 件のコメント :
コメントを投稿