Quantcast
Channel: 日々の覚書
Viewing all articles
Browse latest Browse all 581

MySQL Router 2.1.5経由でのMySQLへの接続に失敗する

$
0
0

TL;DR


ことの起こりは単なる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に全然つながらなくなった。
隣の同僚こと 角煮の深町が「2.1.4では問題なくて2.1.5にバージョンアップしてから発生する」というところまで切り分けてくれたので、そのへんを重点的に調べることに。
取り敢えずリリースノートにはそんな変なことは書いてない。
とはいえタイムアウトって書いてあるからタイムアウトなんだろうけどなんか変わったのかな? って調べたらごっついコミットが出てきた。
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_timeout1000倍しなければならないのにそれをせずにそのまま渡しているので、タイムアウトまでの単位がミリ秒になってしまった。
mysqlrouter.conf の [routing:xx]セクションに明示的に connect_timeout = 今までの値の1000倍を書けば取り敢えず回避可能なので踏み抜いた際にはお試しください。

Viewing all articles
Browse latest Browse all 581

Trending Articles