GA

2020/09/01

mysqlrouterに ERROR 2003 (HY000): Can't connect to remote MySQL server for client connected to '0.0.0.0:6446' と言われたら

TL;DR

  • ポートに対応する宛先(デフォルトでは6446はマスター、6447なら全てのスレーブとマスターも(デフォルトだとフォールバックするから))のmysqldが全滅していると、CR_CONN_HOST_ERROR(2003)の後ろのアドレスがmysqlrouterのLISTENポートになる

    • どこが落ちてるのかメッセージからわかりにくいと嘆かないで、「全滅した時だけ」だから
    • 切り分けの一助になれば幸い
  • ただしこの「全滅」は _hidden: true を含む。


フツーに「起動していないmysqld」のIPアドレスとポートを指定して接続できないと、エラーメッセージの後半は指定したIPアドレスが出る。括弧書きの中はOSエラーコード。たとえば111は ECONNREFUSED なのでIPアドレスかポート番号間違ってるよねというのがすぐにわかる。

$ mysql -h127.0.0.1 -P64080
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111)

それに対して、宛先を全滅させたmysqlrouterはちょっと違う感じのエラーを返す。エラー番号は同じ2003でもメッセージがちょっと違うしOSエラーコードも出ていない。mysqlコマンドラインクライアントから見た接続先である 127.0.0.1 もエラーメッセージには出てこない。

$ mysql -h127.0.0.1 -P6446
ERROR 2003 (HY000): Can't connect to remote MySQL server for client connected to '0.0.0.0:6446'

mysqlrouterプロセスそのものを止めてしまうと、いつも通り(?)のエラーメッセージになる。

$ sudo systemctl stop mysqlrouter
$ mysql -h127.0.0.1 -P6446
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111)

と、このようにエラーメッセージがちょっと違うことをおぼえておくと、mysqlrouterがおかしいのか、宛先のmysqldがおかしいのかの切り分けのチャンスになる鴨。

ちなみにルーティングそのものに失敗したのはmysqlrouter.logには出力されてなかった(今回は全滅させているので、延々(InnoDB RSの)メタデータ取得に失敗したログだけが吐かれている)

2020-09-01 18:49:10 metadata_cache WARNING [7fbc59665700] Failed connecting with Metadata Server 127.0.0.1:3306: Can't connect to MySQL server on '127.0.0.1' (111) (2003)
2020-09-01 18:49:10 metadata_cache WARNING [7fbc59665700] Could not connect to the instance: fd1c9072-ec24-11ea-b2bc-0201965f8d32 on 127.0.0.1:3306
2020-09-01 18:49:10 metadata_cache WARNING [7fbc59665700] Failed connecting with Metadata Server 127.0.0.1:3307: Can't connect to MySQL server on '127.0.0.1' (111) (2003)
2020-09-01 18:49:10 metadata_cache WARNING [7fbc59665700] Could not connect to the instance: 06d3bc79-ec25-11ea-8c8c-0201965f8d32 on 127.0.0.1:3307
2020-09-01 18:49:10 metadata_cache WARNING [7fbc59665700] Failed connecting with Metadata Server 127.0.0.1:3308: Can't connect to MySQL server on '127.0.0.1' (111) (2003)
2020-09-01 18:49:10 metadata_cache WARNING [7fbc59665700] Could not connect to the instance: 135d0639-ec25-11ea-8bbd-0201965f8d32 on 127.0.0.1:3308
2020-09-01 18:49:10 metadata_cache ERROR [7fbc59665700] Failed fetching metadata from any of the 3 metadata servers.

ところで、「クライアントサイドのエラーってクライアントライブラリにハードコーディングで可変部分そんなに多くなかったよね?」と思ったそこのアナタ。アナタは鋭い。


この2003、クライアントサイドエラーの番号を使ってはいるが「mysqlrouterがmysqlコマンドラインクライアントに対して『サーバーサイドエラーパケット』として送り込んでいる」

なのでクライアントの実装によらずに「クライアントライブラリまでエラーメッセージの本文が渡る」であろうことが期待できる。

エラーメッセージの本文を握りつぶすので有名(?)なConnector/Jはどう振る舞うんだろうってちょっと心配になってきた。

0 件のコメント :

コメントを投稿