[go: up one dir, main page]
More Web Proxy on the site http://driver.im/

GA

ラベル MySQL Router の投稿を表示しています。 すべての投稿を表示
ラベル MySQL Router の投稿を表示しています。 すべての投稿を表示

2020/09/03

mysqlrouterのdisconnect_on_metadata_unavailableはURIに書く

TL;DR

The metadata-cache URI options are:


disconnect_on_metadata_unavailable なるものの存在を知って mysqlrouter.conf に書いてみたけど反映されなくてよく読んだらURIオプションだった。

$ sudo vim /etc/mysqlrouter/mysqlrouter.conf
..
[routing:myRs_ro]
bind_address=0.0.0.0
bind_port=6447
destinations=metadata-cache://myRs/?role=SECONDARY
round-robin-with-fallback
protocol=classic
disconnect_on_promoted_to_primary=yes  ### 間違い!!!
..

↑のようにルーティングセクションにそのまま書くのではなくて、ルーティングセクションの destinationsのURIに 指定する。

$ sudo vim /etc/mysqlrouter/mysqlrouter.conf
..
[routing:myRs_ro]
bind_address=0.0.0.0
bind_port=6447
destinations=metadata-cache://myRs/?role=SECONDARY&disconnect_on_promoted_to_primary=yes  ### ここ!
round-robin-with-fallback
protocol=classic
..

間違った書き方をしてもUnknown variables的なエラーもワーニングも出してくれないのでしばらく悩んでいた。

3306, 3307, 3308がメンバーの実ポートでmysqlrouter経由で接続している場合に3306から3307に rs.setPrimaryInstance でスイッチオーバーした時の切断の有無は以下のとおり。

クライアントから見た接続先 実際の接続先 3306から3307へのsetPrimaryInstance
6446 3306 切断される
6447 3307 disconnect_on_promoted_to_primary依存
6447 3308 切断されない

read-onlyの6447経由で昇格も降格もしていない3308への接続が切断されないのは良いこと。read-writeの6446経由は常に切断される。

6447経由で3307への接続はdisconnect_on_metadata_unavailable=yesなら切断されるしデフォルトのnoなら切断はされない。

コネクションプールのことを考えるとyesが良い気がしますね。

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はどう振る舞うんだろうってちょっと心配になってきた。

2020/08/31

MySQL InnoDB Cluster/ReplicaSet 8.0.21で「mysqlrouterから参照されないように」設定する

TL;DR

まずはフツーにMySQL Shellでサンドボックスを3つばかり作る。

$ mysqlsh -- dba deploySandboxInstance 3306 { --password="" }
$ mysqlsh -- dba deploySandboxInstance 3307 { --password="" }
$ mysqlsh -- dba deploySandboxInstance 3308 { --password="" }

3306のインスタンスで dba.createaReplicaSet('myRs')

$ mysqlsh --uri=root:""@localhost:3306 -- dba createReplicaSet myRs

--replicasetrs に受けてからの rs.addInstance
(このコマンドラインオプションの奇妙な書き方は 日々の覚書: CentOS 7のAMIでEC2を起動してGroup Replicationを組むところまでを何も考えずに をやってる時に見つけた)

$ mysqlsh --uri=root:""@localhost:3306 --replicaset -- rs addInstance root@localhost:3307 { --recoveryMethod=clone }
$ mysqlsh --uri=root:""@localhost:3306 --replicaset -- rs addInstance root@localhost:3308 { --recoveryMethod=clone }

以前にInnoDB Clusterとかを組んだことがあると mysqlrouter.conf に書かれていたりするので一度消してから mysqlrouter --bootstrap

$ sudo rm /etc/mysqlrouter/mysqlrouter.conf
$ sudo mysqlrouter --bootstrap=root@localhost:3306 --user=mysqlrouter
Please enter MySQL password for root:
$ sudo systemctl start mysqlrouter

この状態でRead-Onlyな6447は3307と3308にラウンドロビンされている。

$ mysql -h127.0.0.1 -P6447 -sse "SELECT @@port"
3307
$ mysql -h127.0.0.1 -P6447 -sse "SELECT @@port"
3308
$ mysql -h127.0.0.1 -P6447 -sse "SELECT @@port"
3307
$ mysql -h127.0.0.1 -P6447 -sse "SELECT @@port"
3308
$ mysql -h127.0.0.1 -P6447 -sse "SELECT @@port"
3307
$ mysql -h127.0.0.1 -P6447 -sse "SELECT @@port"
3308

rs.setInstanceOption(‘127.0.0.1:3308’, ‘tag:_hidden’, true) とやると

$ mysqlsh --uri=root:""@localhost:3306 --replicaset -- rs setInstanceOption '127.0.0.1:3308' 'tag:_hidden' 'true'
WARNING: Using a password on the command line interface can be insecure.
You are connected to a member of replicaset 'myRs'.

ルーターを再起動とかしなくても読み取り分散から外れる。

$ mysql -h127.0.0.1 -P6447 -sse "SELECT @@port"
3307
$ mysql -h127.0.0.1 -P6447 -sse "SELECT @@port"
3307
$ mysql -h127.0.0.1 -P6447 -sse "SELECT @@port"
3307
$ mysql -h127.0.0.1 -P6447 -sse "SELECT @@port"
3307

これはうまく使えば便利そう。


ただし、_hidden: trueのままでもsetPrimaryInstanceできてしまうし、_hiddenは効いたままなのでその辺はどうなのか感ある。

2018/12/26

ペパボがProxySQLならこちらはMySQL Routerだ!

TL;DR
  • パッチはだいぶ下にあります。しかも大したやつじゃないです。
  • 9割余談です。

このエントリーは GMOペパボ Advent Calendar 2018 の26日目の記事です。
25日目は kurotaky さんの「結婚式の後に書きます!」の予定だったんですが、どう考えても結婚式の後にブログ書いてる暇があったら奥さんと結婚式の余韻に浸ってください。 末永くお幸せに!
ところでなぜ26日目なのかというと、
中の人へ
https://qiita.com/organizations/pepabo に所属すると登録できるようになります。お近くの CTL に Qiita のユーザ名を伝えて追加してもらってください
さすがにこの組織に追加してもらう訳にはいきません(注: わたしはペパボの中の人ではありません) が、26日目なら名乗ってもOKとのことだったので、これは26日目の記事(論理)です!
メリークリスマス! (プラス1日)

さて、2018年のペパボと言えば、 ProxySQL だったように思います(独断と偏見と観測範囲による、主に おっくんさん と仲良くしてたからそう思うだけな気がする)
おもむろに もりたこさん がProxySQLの中身を読みだしたりしているところからもその気配は感じられますね。
あとは k1low さんが tcpdp を公開していたり
監査大事! クエリーログ! っていうふいんき(略)が伝わってきます。

ところでおっくんさんのスライドで紹介されている「いろいろなクエリログの取得方法」ですが
_人人人人人人人人人人人人_
> MySQL Routerがない! <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
ProxySQLはあるのに!!!
と思ったら、どうも
俺もProxySQL勧めたんだった!!!!!1
orz
ウチの環境では mikasafabric for MySQL というMySQL Fabricの なれの果て フォークプロダクトをバリバリ本番で使っていますので、MySQL Routerのハックはまれにですがよくやります。
今年の9月いっぱいくらいはMySQL Router 8.0.12にfabric+cache pluginをポーティングする 苦行 作業をしていました。やったぜ、これでMySQL 8.0でもmikasafabric for MySQLが使える! つらくない!
ちなみにテスト用に入れていたパッチはこんな簡単なやつだったようです。
これアカウント名とか取るには認証パケットの段階で記録しておかないといけなさそうで、面倒でやめた気がしますが、ジェネラルログみたいに、CONNECTの時にスレッドIDと接続元とかアカウントを記録してやって、ログを見る時にスクリプトでほげればいいんだなきっと。
176 #ifdef QUERY_LOG
177     if (buffer[4] == 0x3)
178     {
179       // Com_QUERY
180       auto pkt = mysql_protocol::Packet(buffer);
181       auto query_length= pkt.get_lenenc_uint(0);
182       if (query_length > 2)
183         log_info(pkt.get_string(4, query_length).c_str());
184     }
185 #endif
もうちょっとカジュアルにMySQL Routerをゴニョれるようになりたいですね、来年は。

完璧に余談ですが、 おっくんさん は実は 席替えスクリプト
の時に何となく名前を認識して、MySQL Casualの時に「すごい人だなーってどこかで聞いたことのある名前だなー」って思って、今年ようやくリアルでも改めて交流ができた年でもありました。
さあ、また来年もMySQLやっていき!

2018/10/03

mysqlrouter.logの "keepalive" が気になる人へ

TL;DR
  • アレは単に一定間隔でログを吐いているだけ、ログ監視でもしない限り意味はない
  • 実は “[keepalive]” セクションに “interval” と “runs” が設定できる
  • もちろんマニュアルには何も書いてない

初めてMySQL Routerを使い始めたころから、ずっと「なんだろうこれ」「どことkeepaliveしてんねん」と思っていたこのログ。
$ sudo less /var/log/mysqlrouter/mysqlrouter.log
..
2018-04-03 16:33:00 INFO    [7fe222415700] keepalive
2018-04-03 16:34:00 INFO    [7fe222415700] keepalive
2018-04-03 16:35:00 INFO    [7fe222415700] keepalive
実はどことも通信なんてしていない。
ソースコードはここ。
mysql-router/keepalive.cc at 8.0.12 · mysql/mysql-router
120行もないコードの中でしていることといえば、(最終的には)wait_forで “interval * 1000” ミリ秒 スリープするのを “runs” で指定された回数(0の場合は無限に)繰り返すだけ。
確かに言われてみればコンフィグファイルに書いてあったけど…なんか腑に落ちない…。。
ちなみにこの “runs” 、満了すると黙って keepalive プラグインだけが沈黙する。なんか言えよ…。(ちなみにkeepalive以外のプラグインが有効でない場合は全プラグインがアンロードされてプロセスが正常終了する)
$ tail -f /var/log/mysqlrouter/mysqlrouter.log
2018-10-03 12:30:38 main INFO [7fd33d238780] Loading all plugins.
2018-10-03 12:30:38 main INFO [7fd33d238780]   plugin 'keepalive:' loading
2018-10-03 12:30:38 main INFO [7fd33d238780]   plugin 'routing:master' loading
2018-10-03 12:30:38 main INFO [7fd33d238780] Initializing all plugins.
2018-10-03 12:30:38 main INFO [7fd33d238780]   plugin 'keepalive' initializing
2018-10-03 12:30:38 main INFO [7fd33d238780]   plugin 'routing' initializing
2018-10-03 12:30:38 main INFO [7fd33d238780] Starting all plugins.
2018-10-03 12:30:38 main INFO [7fd339fec700]   plugin 'keepalive:' starting
2018-10-03 12:30:38 keepalive INFO [7fd339fec700] keepalive started with interval 6
2018-10-03 12:30:38 keepalive INFO [7fd339fec700] keepalive will run 3 time(s)
2018-10-03 12:30:38 keepalive INFO [7fd339fec700] keepalive
2018-10-03 12:30:38 main INFO [7fd3397eb700]   plugin 'routing:master' starting
2018-10-03 12:30:38 main INFO [7fd33d238780] Running.
2018-10-03 12:30:38 routing INFO [7fd3397eb700] [routing:master] started: listening on 127.0.0.1:13306
2018-10-03 12:30:44 keepalive INFO [7fd339fec700] keepalive
2018-10-03 12:30:50 keepalive INFO [7fd339fec700] keepalive
取り敢えず3年来の謎は解けたので良いとしよう。。

2018/10/02

MySQL Router 8.0.12に同梱されているhttp_serverプラグインの謎について

TL;DR
もちろん MySQL :: MySQL Router 8.0 を全文検索しても “http” で引っかかってこない。
コミットを見るとMySQL Router 8.0.12から入ったっぽいけれど、もちろん MySQL :: MySQL Router Release Notes :: Changes in MySQL Router 8.0.12 (2018-07-27, General Availability) にも何も書いてない。
流石に “Linux Generic” やrpmパッケージには入ってなかったけど、特にcmakeにオプションを渡すでもなく、ソースビルドすると何の断りもなく勝手に http_server.so というプラグインが出来上がる。
$ cd mysql-router-8.0.12
$ cmake .
$ make
$ ll stage/lib/mysqlrouter/http*
-rwxrwxr-x 1 yoku0825 yoku0825 494096 Oct  2 14:59 stage/lib/mysqlrouter/http_server.so
名前から察するに、全国 1.000000人のファンを擁するMySQL HTTP Plugin的な感じなのかしらん。MySQL RouterがHTTPをしゃべって、裏ではMySQLプロトコルでmysqldとやり取りしてくれる…的な。
(MySQL HTTP Pluginについてはこのへん… 日々の覚書: MySQLジャンキーにngx_mrubyを与えた結果
http_server_plugin.cc を見る限り、 [http_serevr] セクションを見つけると立ち上がるらしい。
デフォルトは 0.0.0.0:5555バインド されるようで、 static_folder というパラメーターもあるようだ。
…他は?;
取り敢えず試してみる。
plugin_folderをビルドしたパスに合わせるのと、最後に “[http_server]” とセクションだけ定義してやる。
$ cp packaging/rpm-oel/mysqlrouter.conf ./mysqlrouter.conf
$ vim ./mysqlrouter.conf
..
plugin_folder = /home/yoku0825/mysql-router-8.0.12/stage/lib/mysqlrouter
..
[http_server]

$ sudo ./stage/bin/mysqlrouter --config=./mysqlrouter.conf

$ sudo less /var/log/mysqlrouter/mysqlrouter.log

2018-10-02 16:15:52 main INFO [7f250a835780] Loading all plugins.
2018-10-02 16:15:52 main INFO [7f250a835780]   plugin 'http_server:' loading
2018-10-02 16:15:52 main INFO [7f250a835780]   plugin 'keepalive:' loading
2018-10-02 16:15:52 main INFO [7f250a835780] Initializing all plugins.
2018-10-02 16:15:52 main INFO [7f250a835780]   plugin 'http_server' initializing
2018-10-02 16:15:52 http_server INFO [7f250a835780] listening on 0.0.0.0:5555
2018-10-02 16:15:52 main INFO [7f250a835780]   plugin 'keepalive' initializing
2018-10-02 16:15:52 main INFO [7f250a835780] Starting all plugins.
2018-10-02 16:15:52 main INFO [7f2507a67700]   plugin 'http_server:' starting
2018-10-02 16:15:52 main INFO [7f2507266700]   plugin 'keepalive:' starting
2018-10-02 16:15:52 keepalive INFO [7f2507266700] keepalive started with interval 60
2018-10-02 16:15:52 keepalive INFO [7f2507266700] keepalive
2018-10-02 16:15:52 main INFO [7f250a835780] Running.

$ curl localhost:5555
<HTML><HEAD>
<TITLE>404 Not Found</TITLE>
</HEAD><BODY>
<H1>Not Found</H1>
</BODY></HTML>
…しゃべった………。
static_folderを設定してもっかい起動してみる。
$ vim ./mysqlrouter.conf
..
[http_server]
static_folder= /home/yoku0825/mysql-router-8.0.12

$ sudo ./stage/bin/mysqlrouter --config=./mysqlrouter.conf

$ curl localhost:5555/src/http/src/http_server_plugin.cc
..
ファー、見えた…。
これ、いつか static_folder 以外にもURIとSQLのマッピングとかできるようになってmyhttpプラグイン再び、になるのかしらん。
期待age(?)

2018/02/23

MySQL Router 2.1.5経由でのMySQLへの接続に失敗する(MySQL Router 2.1.6で直るらしい)

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倍 を書けば取り敢えず回避可能なので踏み抜いた際にはお試しください。

2016/05/16

MySQL Routerの接続でMySQL Fabricのlogテーブルがあふれた(event_schedulerをOFFにするとあぶない)

MySQL Fabricには /etc/mysql/fabric.cfg の [logging]セクションの他にもログを取る部分が仕込まれていて、


mysql> SELECT * FROM fabric.log;
+---------------------------+----------------------------+------------------------------+-----------------------------------------------------------------------+----------+------+
| subject                   | reported                   | reporter                     | message                                                               | category | type |
+---------------------------+----------------------------+------------------------------+-----------------------------------------------------------------------+----------+------+
| 0                         | 2016-05-16 06:48:47.000000 | mysql.fabric.services.manage | Fabric node version (1.5.6) started.                                  |        0 |    0 |
| manage.ping               | 2016-05-16 06:48:52.000000 | mysql.fabric.command         | Started command (manage, ping).                                       |        1 |    0 |
| manage.ping               | 2016-05-16 06:48:52.000000 | mysql.fabric.command         | Finished command (manage, ping).                                      |        1 |    1 |
..
| dump.servers              | 2016-05-16 06:55:53.000000 | mysql.fabric.command         | Finished command (dump, servers).                                     |        1 |    1 |
| dump.sharding_information | 2016-05-16 06:55:53.000000 | mysql.fabric.command         | Started command (dump, sharding_information).                         |        1 |    0 |
| dump.sharding_information | 2016-05-16 06:55:53.000000 | mysql.fabric.command         | Finished command (dump, sharding_information).                        |        1 |    1 |
+---------------------------+----------------------------+------------------------------+-----------------------------------------------------------------------+----------+------+
1297 rows in set (0.02 sec)

なんというか、どぱーと吐いている。

( ´-`).oO(こんなトランザクションで保護される必要もなさそうな間っ平なログをMySQLに突っ込むとか、何考えてるのか小一時間問い詰めたい。


そしてなんか周辺の流れを見ても、何のフィルターもなく毎回INSERTされてるように見える。マジか(Python詳しい人誰か)

https://github.com/mysql/mysql-fabric/blob/release/1.5.5/lib/mysql/fabric/handler.py#L305-L307



$ mysqlbinlog -R -uroot -h 172.17.0.4 --stop-never -vv --start-position=182893 bin.000001 | grep "^#"
..

# at 285377
#160516 15:55:53 server id 1  end_log_pos 285408 CRC32 0x7f70413b       Xid = 5500
# at 285408
#160516 15:55:53 server id 1  end_log_pos 285473 CRC32 0xb35843f4       Anonymous_GTID  last_committed=772      sequence_number=773
# at 285473
#160516 15:55:53 server id 1  end_log_pos 285555 CRC32 0xd3de3d80       Query   thread_id=4     exec_time=0     error_code=0
# at 285555
#160516 15:55:53 server id 1  end_log_pos 285614 CRC32 0x12ff61e4       Table_map: `fabric`.`log` mapped to number 110
# at 285614
#160516 15:55:53 server id 1  end_log_pos 285734 CRC32 0x3c061fb3       Write_rows: table id 110 flags: STMT_END_F
### INSERT INTO `fabric`.`log`
### SET
###   @1='dump.servers' /* VARSTRING(120) meta=120 nullable=0 is_null=0 */
###   @2=1463349353.000000 /* TIMESTAMP(6) meta=6 nullable=0 is_null=0 */
###   @3='mysql.fabric.command' /* VARSTRING(192) meta=192 nullable=0 is_null=0 */
###   @4='Finished command (dump, servers).' /* BLOB/TEXT meta=2 nullable=1 is_null=0 */
###   @5=1 /* INT meta=0 nullable=0 is_null=0 */
###   @6=1 /* INT meta=0 nullable=0 is_null=0 */
# at 285734
#160516 15:55:53 server id 1  end_log_pos 285765 CRC32 0x39af684e       Xid = 5508
# at 285765
#160516 15:55:53 server id 1  end_log_pos 285830 CRC32 0xe449e1fe       Anonymous_GTID  last_committed=773      sequence_number=774
# at 285830
#160516 15:55:53 server id 1  end_log_pos 285912 CRC32 0x239e9184       Query   thread_id=4     exec_time=0     error_code=0
# at 285912
#160516 15:55:53 server id 1  end_log_pos 285971 CRC32 0xe2235101       Table_map: `fabric`.`log` mapped to number 110
# at 285971
#160516 15:55:53 server id 1  end_log_pos 286116 CRC32 0xf5cc5f55       Write_rows: table id 110 flags: STMT_END_F
### INSERT INTO `fabric`.`log`
### SET
###   @1='dump.sharding_information' /* VARSTRING(120) meta=120 nullable=0 is_null=0 */
###   @2=1463349353.000000 /* TIMESTAMP(6) meta=6 nullable=0 is_null=0 */
###   @3='mysql.fabric.command' /* VARSTRING(192) meta=192 nullable=0 is_null=0 */
###   @4='Started command (dump, sharding_information).' /* BLOB/TEXT meta=2 nullable=1 is_null=0 */
###   @5=1 /* INT meta=0 nullable=0 is_null=0 */
###   @6=0 /* INT meta=0 nullable=0 is_null=0 */

MySQL Routerを起動している間中、ずっとこれが来る。
それぞれのmysqlrouterから1秒に3リクエストずつ来ているらしく、そんな感じで倍々ゲームになっている:(;゙゚'ω゚'):

さてどうしようか。


【2016/05/17 13:46】

event_schedulerをOFFにしてたのがいけなかったのか!!!!

mysql> SELECT * FROM events\G
*************************** 1. row ***************************
       EVENT_CATALOG: def
        EVENT_SCHEMA: fabric
          EVENT_NAME: prune_log
             DEFINER: mikasa_fabric@127.0.0.1
           TIME_ZONE: SYSTEM
          EVENT_BODY: SQL
    EVENT_DEFINITION: DELETE FROM log WHERE TIMEDIFF(UTC_TIMESTAMP(), reported) > MAKETIME(3600,0,0)
          EVENT_TYPE: RECURRING
          EXECUTE_AT: NULL
      INTERVAL_VALUE: 3600
      INTERVAL_FIELD: SECOND
            SQL_MODE: NO_ENGINE_SUBSTITUTION
              STARTS: 2016-04-04 15:49:10
                ENDS: NULL
              STATUS: ENABLED
       ON_COMPLETION: NOT PRESERVE
             CREATED: 2016-04-04 15:49:10
        LAST_ALTERED: 2016-04-04 15:49:10
       LAST_EXECUTED: NULL
       EVENT_COMMENT:
          ORIGINATOR: 33893
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
  DATABASE_COLLATION: utf8_general_ci
*************************** 2. row ***************************
       EVENT_CATALOG: def
        EVENT_SCHEMA: fabric
          EVENT_NAME: prune_error_log
             DEFINER: mikasa_fabric@127.0.0.1
           TIME_ZONE: SYSTEM
          EVENT_BODY: SQL
    EVENT_DEFINITION: DELETE FROM error_log WHERE TIMEDIFF(UTC_TIMESTAMP(), reported) > MAKETIME(3600,0,0)
          EVENT_TYPE: RECURRING
          EXECUTE_AT: NULL
      INTERVAL_VALUE: 3600
      INTERVAL_FIELD: SECOND
            SQL_MODE: NO_ENGINE_SUBSTITUTION
              STARTS: 2016-04-04 15:49:11
                ENDS: NULL
              STATUS: ENABLED
       ON_COMPLETION: NOT PRESERVE
             CREATED: 2016-04-04 15:49:11
        LAST_ALTERED: 2016-04-04 15:49:11
       LAST_EXECUTED: NULL
       EVENT_COMMENT:
          ORIGINATOR: 33893
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
  DATABASE_COLLATION: utf8_general_ci
2 rows in set (0.00 sec)

mysql> SELECT @@event_scheduler;
+-------------------+
| @@event_scheduler |
+-------------------+
| OFF               |
+-------------------+
1 row in set (0.00 sec)


MySQL Bugs: #73206: MySQL Fabric should report a warning when MySQL Event Scheduler is disabled




1. logテーブルをBlackhole化する

mysql> use fabric
mysql> ALTER TABLE log Engine= Blackhole;

一番最初にこれが出てくるのもなんだかななんだけど、なんとこれ無事に動く。
mysqlfabricデーモンを再起動してもフツーに動いた。マジか。


2. ロギングをすっ飛ばすようにMySQL Fabric側をゴニョる

$ diff -C1 /usr/lib/python2.6/site-packages/mysql/fabric/handler.py handler.py
*** /usr/lib/python2.6/site-packages/mysql/fabric/handler.py    2015-09-11 14:31:50.000000000 +0900
--- handler.py  2016-05-16 16:51:12.000000000 +0900
***************
*** 209,214 ****
          """
-         persister.exec_stmt(_INSERT_FABRIC_LOG,
-             {"params": (subject, reported, reporter, info, info_category,
-             info_type)}
-         )

--- 209,210 ----

これでももちろんMySQL Routerはちゃんと動く。


3. 定期的にlogテーブルからレコードをパージする

至極当たり前すぎる。
何故かすごくごちゃごちゃとインデックスが張ってあるので、reportedで期間を切って定期的に消すのはそんなに難しくないはずだ。
(最近のMySQLはOPTIMIZE TABLEもオンラインでできるのでー。。)

mysql> SHOW CREATE TABLE log\G
*************************** 1. row ***************************
       Table: log
Create Table: CREATE TABLE `log` (
  `subject` varchar(40) NOT NULL,
  `reported` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
  `reporter` varchar(64) NOT NULL,
  `message` text,
  `category` int(11) NOT NULL,
  `type` int(11) NOT NULL,
  KEY `key_subject_reported` (`subject`,`reported`),
  KEY `key_reporter` (`reporter`),
  KEY `key_reported` (`reported`),
  KEY `key_category` (`category`),
  KEY `key_type` (`type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)


これ、実際に運用してる人はどうしてるんでしょうか。
お客様の中にMySQL Fabricを運用している方はいらっしゃいませんか?


…いらっしゃいませんね。