北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

今日は「Club MySQL #2:(MySQLの)XProtocolはじめました、Haskellで」の日です

マニアックなイベント に来てますので、メモを残しています。

XProtocol始めました、Haskellで / Naoto Ogawaさん

  • 意外とHaskellの人が多いかな、と
  • haskellMySQLで半分半分
  • XProtocol
    • ProtocolBuffer
    • Xはクロス (いろいろな言語から)
    • CRUDスタイルAPIもある
    • ドキュメントストアとの親和性
    • パイプライン処理(これに注目したい)
  • XDev API
    • EBNFの定義がある
    • BNFとは? → 文法を定義したもの
    • 複数DBサーバのコネクション管理も含む(理解しきれてないけど)
  • XPluginをMySQLへインストールする
    • Xdev API経由でユーザプログラムが利用
  • world_x データベースをサンプルとしてインストールしておくと良い
    • doc_id があるテーブルがドキュメントストアとして扱われる
    • _iddoc 内のJSONのものとも一致させる
    • _idGENERATED だけど自動に作ってくれるわけではない。アプリが入れる
  • mysqlx.so を入れる
  • mysqlsh
    • 3306 ではなく 33060 を使う(スライドではミスって 33061 だけど)
    • プロトコルを覗くプロクシを作ったためミスった
    • mysql-js> というプロトコルで、JSのコードを実行できる
    • find("$.GNP = 828")$ はルートのイメージ
    • *ワイルドカードが使えたり
  • XProtocolのドライバが文字列の式を解釈して、XProtocolにしてあげなければならない
    • 昔のドライバは、サーバ側でSQLをパースしている
  • XProtocolとして生のSQLを投げることは可能
    • .find とかを使って、一部だけをSQLにするとかはダメ
  • 様々な知識が必要だが、今日は「XProtocolの仕様」と「ProtocolBufferの理解」
    • 課題: 名前の衝突、TLSの難しさ、パーサライブラリの選択など → 作り直しかも
  • .proto ファイルにも仕様が書かれているので、読んだほうがいい
  • .proto ファイルから、ツールを使って各言語のオブジェクトを生成する
  • XProtocol
    • メッセージ長、タイプ、ペイロード(protobuf)、の繰り返し
    • 全体のメッセージ長がない
    • 全体のメッセージ長が欲しいのは、実装上のチョイス。ストリーミング処理すれば不要かも
    • メッセージ長はリトルエンディアン
    • 例えば ClientMessages のタイプ 19CRUD_UPDATE
    • EXPECT_OPENEXPECT_CLOSE はパイプライン処理用
    • ServerMessages で、 RESULTSET_FETCH_DONE_MORE_RESULTSETS が来たら、フェッチの残りがあるということ
  • Find メッセージ
    • collection スキーマやテーブル
    • criteria WHERE句
    • args バインド
    • grouping_criteria having句
    • 17 CRUD_FIND
  • protobuf は、フィールド名は送っていない。数字のタグのみ
    • protoファイルに定義されている

本当はこわいMySQLプロトコル / tmtmsさん

  • RubyMySQL X Protocol 作ってたけど、今日は古いプロトコルの話
  • 参照系: フィールド数でループ。レコードはEOFまで
  • クライアントはクエリが更新系か参照系かは知ってない
    • サーバから戻ってくるフィールド数を見て、判断する
  • LOAD DATA LOCAL INFILE
    • クエリをサーバが解釈。ファイル名をサーバに教えてもらう(!)
    • Proxyでサーバ名を書き換えることができる!
    • Proxyはクエリを LOAD DATA LOCAL INFILE に書き換えることができる(!!!)
  • 対策
    • SSL接続
    • クライアント側で LOCAL INFILE を無効化

XProtocol始めました、Haskellで(後半) / Naoto Ogawaさん

  • 結果セット Row メッセージ
  • Expr で表現
    • LITERAL Scalar V_SINT
  • ProtocolBufferのzigzag encoding
    • -99197 となる
  • 関数はドライバが文字列をパースして XProtocol の表現に
    • 構文解析の知識が必要
    • SQLで利用される関数すべてが、XDevAPIでサポートされているとは限らない
    • 関数名を XXX などとした場合は、サーバ側がエラーとする
    • SUM(DISTINCT hoge) とか 'a' not_regex 'aaa' とかできなかったり
  • パイプライン
  • エラー処理
    • Error メッセージとして却ってくる
    • protoファイル側に書いてある
  • XProtocolの注意
    • ObjectとErrorが2箇所くらいある
    • protoファイルごとに名前空間を変えてみては?
  • ドライバの設計
    • 型の整合性とか
    • 正常であればメッセージがあるケースとか
    • ドライバのレイヤの厚さは?
    • 依存を少なくしたいとか
  • haskellのライブラリ
    • XDev APIのEBNFには従ってない
    • XProtocolっが正しく吐ければいい
  • 展望
    • 交渉、ストリーミング、データ型、結果セット分割、などなど
  • MySQL5.7で試している
    • bindの謎の文字列は、文字列じゃなくていいでしょ
  • RubyでのXProtocolの実装を再開しようかな」
  • このプロトコルはGA?? わからず
  • プロトコルオタク的には楽しいけど、一般人の用途は・・・?

この会について

  • いつもは短い話を聞く会
  • 長くじっくり聞く会として、この会を開いている
  • また来てください