tombo2-progress’s diary

できるだけ毎日1時間を切り取ってここに晒す。誤字脱字気にしない。日本語が崩壊するのも気にしない。最終的にまとめて本ブログに書く

deserializerのつづきとHAツール

HAツールどうにかしたい、とりあえずMHA見てるけど、perlはもういいんだよな、、、 deserializerは早くステート持つようにしないとならない。

benchmark取るとchannel使うのが厳しいのがわかる

チャネル使って並列ド上げつつredigo.Send多用して行きたいけど、パフォーマンス上がらん package main import ( "github.com/go-redis/redis" redigo "github.com/gomodule/redigo/redis" "runtime" "sync" "testing" ) var redisOpts = &redis.Options{ Ad…

パフォーマンス改善していく

fmt.Sprintfするのは%dとか書いてるあたりがおもそうということでstrconv.Itoa()で書いたらその部分が半分以下の時間でできるようになった。 redigoのredis.Do()を毎回呼ぶのは重いという話はわかって入るけど、どうしようか調査中 connection poolからコネ…

MQRのpprofとってみた

sysbenchで適当な負荷をかけてMQRのpprof, general_log, slow_log, tcpdumpをとってみた pprofの結果 (pprof) peek main ----------------------------------------------------------+------------- [16/90] flat flat% sum% cum cum% calls calls% + conte…

評価軸を考える

最終的に何を目指すか考えてみる クエリが再現できること 5.1以上でgeneral_logと比較して、全く同じクエリが取れることgeneral_logと同じ順序じゃなくて良い QPSが同等になること 実際のQPSを再現できること このツール自体がボトルネックにならないこと 2…

gopacketで取ったパケットを高速に処理したい

無限にgoroutine作られても困るので、goroutineの数を制御する Go言語でCPU数に応じて並列処理数を制限する | SOTA tcpdumpみたいにバッファリングしてくれないか。。。 FastHash()使うとload balancingできそう gopacket - GoDoc

MySQL server宛てのパケットからクエリをとる

connection poolingでコネクションが切れない状況でCOM_QUERYを取るのはステートを持ってパケットをパースする必用があるかと思ったけど、sequence_idはクエリごとにリセットされるようなので、sequence_id=0のものでcommand_typeがクエリのものを取れば良さ…

mysql, yumとかaptで入れられたのを確認する方法ないか

systemctlのserviceの場所 /usr/lib/systemd/ /etc/systemd/ /lib/systemd https://dev.mysql.com/doc/refman/8.0/en/binary-installation.html

dimStat, AWSで構築すると何故かhostが発見できない問題(pingは通る, MySQLへはつながる)が発生していて辛い。 ローカルのPCでやってもMySQLの情報だけ取れなかったりして、どうもおかしいくてつまってる

dimStatためしてる

本家の方の更新が滞りまくっているので、そちらに書く。

やはりステートレスは厳しい

com_queryやcom_stmt_prepaereくらいが取れればよいなら別として、deserializerとしてパケットを取ろうとするならステートレスにやるのは無理な気がする。 com_query_responseで結果セットのカラム数がcommand_typeが入るはずの5byte目に入ってきてしまうこ…

document合わない

MySQL :: MySQL Internals Manual :: 14.7.6 COM_STMT_EXECUTE のNULL-bitmap, length: (num-params+7)/8 の計算が合わないnum-params+7/8すると0になるしその後のtype of each parameter, length: num-params * 2 もこういうルールではないと思う

MySQLパケットが途切れる原因

MySQLのパケットが途切れる問題が合って、後続のパケットを見ても途切れたクエリの続きが入ってこなくて困っていた。 結論、tcpdumpの-sオプション(snapshotのサイズ)がCentos5.xでは96byteらしくこれが原因で切れていた。 なので、-s 0を追加してパケットが…

prepared_statementの投げ方とMySQLからの確認の仕方

以前書いたような気がするのだが、検索してもなかったので書く。 Prepared statementを使ってcom_stmt_prepareが流れるか見てみる。 結論:流れた。 実際のサービスでは使われないらしいがどうなのだろうか?prepareしてidとパラメータ指定の2往復になってし…

そろそろtcpdumpでやっていく

wiresharkでの絞り込みは良いとして、tcpdumpでファイル出力は以下。 tcpdump -nn -i any dst host <IP> and dst port 3306 -w <filename> ackパケットが大量に混ざり込むので、そのフィルタをどうにかしたい。</filename></ip>

character set実装

一日の時間のうちお仕事に結構時間使っていて、調査と実装が厳しい。 ようやくcharacter-setのwireshark実装からわかる値で実装をした。

golang のMySQL driverも読んで見る

読めん。。。golang雰囲気で読んでる、、、 go/ctxutil.go at 50bd1c4d4eb4fac8ddeb5f063c099daccfb71b26 · golang/go · GitHub

character setについて

ドキュメントにある説明は↓だけだとおもう。 https://dev.mysql.com/doc/internals/en/character-set.html wiresharkのmysqlモジュールのコードから主要な部分は判定できそうなので、これで良いかも。 https://github.com/wireshark/wireshark/blob/3a514caa…

サンプル作成

sakila database突っ込んだMySQLで各コマンドを打ったサンプルを作成する show databases; use sakila show tables; select * from city order by city_id desc limit 3; insert into city (city, country_id) values ('Tokyo', 50); select * from city whe…

どこまで対応するか

対応予定 statusFlag未実装部分 SSL移行後の解決(別リポジトリでやるかも?) character_set部分的にでも(utf8とか有名どころだけでも) パケット内の複数パケットのパース X protocol (一般的なprotocol bufferのパース) 対応しない protocolバージョン320のも…

character setの一覧はないわけ?

character setのフラグなり値の一覧がないとcharacter setのフィールド埋められないんだが。 一旦structをmarshalしてjson出力したらそれなりにwiresharkなりと比較しやすい形になったので、いくつかサンプル作ったりして構造がただし以下確認していく。 そ…

全てstringが入ってくるパケットをどうするか

responseパケットでアプリケーションレイヤが全てstringで埋め尽くされたものをどうするか問題。 ステートレスにかつ途中からのMySQLパケットを解析しようとして無理してるんだけど、それ諦めれば良いじゃんって気持ちになっている 方法としては3つ? initia…

65565byteを越えたサイズのパケットなのか、MySQLレイヤのヘッダ(packet length(3), seaquence id(1))すらなくstringをぶち込んでくるパケットがある command_typeが0x02, 0x04あたりでpacket lengthが1で2つめ以降のMySQL packetでレスポンスデータを突っ込…

if more data ってなに?

Protocol::HandshakeV10の if more dataってなに? ココらへんはMySQL本体がどうやってパースしているか確認しないと行けない 0xfeのときのOK_PacketとAUTH_SWITCH_REQUESTの判別が難しくて、これは1こずつパースしてどっちかとしてうまくパースできないかど…

とにかくflagが厄介

Connection phaseで5byte目で判断できない厄介なケースのまとめ Protocol::HandshakeResponse41 4 capability flags, CLIENT_PROTOCOL_41 always set 4 max-packet size 1 character set string[23] reserved (all [0]) 頭の部分がこれで来る。 string[23]で…

Command Phase Packetようやく実装

体調崩しててどうもだめだった。 ようやく回復してきたので、実装の続きを進めた。 Command Phaseのパケットのデシリアライズがひとまず終わった。 COM_CHANGE_USERとCOM_STMT_EXECUTEはinitial handshake時のオプションを見ていないとパースが難しいので、…

どうもパースがうまく行かない原因がわかった

これまでのルールでほとんど全てのパケットをパースできると思っていたが、どうもうまく行かない。 Network上の1packetごとにMySQLプロトコルのパケットが複数含まれるので、そのMySQLパケットの中身がうまくパースできないことはわかっていた。 よく見るとC…

Hexで覚え始めた文字列たち

MySQLパケットを追っているときにhexのまま追えると便利というか、いちいちstringに直されたの見るの面倒なので、hex見てたら覚えた文字列たち。 よくある文字列 MySQL: 4d 79 53 51 4c select: 73 65 6c 65 63 74 SELECT: 53 45 4c 45 43 54 update: 75 70 …

MySQL packet分類

Connection Phase, Command Phase, General Responseのパケットの分類方法を確認した。 5byte目とpacket全体の長さで大体判断できる。 [fe]のものはhandshakeだとstring, stringがきてOK responseの[fe] int, intがくるので治安が悪い。 これはマッチングし…

MySQL Packet読んでる

MySQLのパケットはStateを保持して読んでいくのが基本なので、State/Modeがコネクションごとに存在する。 それがよくわかるのが↓で、 MySQL: Connection Lifecycle ここの図がわかりやすい。 更に、Handshakeあたりは こんな感じ。 Authentication exchange …