GREE オープンソース勉強会 第18回 MySQLハッキングの手引きに行ってきた

すごい雨の中,GREE Labs さん主催による http://labs.gree.jp/Top/Study/20090807.html に参加してきました.以下,そのログなど.

###まとめと感想

  • すごい雨降ってました
    • それにしては人多い気がする
  • 日本MySQLユーザ会 松信さん
  • ust ありません
    • 来て良かった
  • トラックバックまでが勉強会メソッド
  • ちょっと寒かった
  • ソースコード読むの楽しそう!
    • いろいろ奥が深そう
  • プラグインレベルなら何とか作れそうな感じがした
  • EXPLAIN じゃない実行計画をしっかり知りたいなと思った.それを理解しないと MySQL を使いこなせない印象.

##MySQLハッキングの手引き

  • MySQl のアーキテクチャ
  • ビルド方法
  • デバッグ方法
  • プラグイン開発の方法
  • 本体拡張の方法
  • 本家へのコントリビュートの方法
  • 自己紹介
    • MySQLコンサルタント
    • 執筆
    • 現場で使える MySQL
    • Linux-DB に関する本(200909 予定)
    • DBマガジンで10月から連載?

###MySQL とは

  • C/C++/アセンブラ
  • 現在は MySQL 5.4 beta, MySQL 5.15.0 stable

###アーキテクチャ

  • 固定部分
    • リスナー(認証) -> パーサ -> オプティマイザ -> テーブルアクセス/ジョイン
    • 全文検索インデックス
    • レプリケーション
  • プラグイン部分

    • 監査ログ
    • Information Schema
    • UDF
    • ストレージエンジン(MyISAM/InnoDB/etc)
  • 特徴

    • 外部ライブラリには極力依存しない
    • STL/boost とか使っていない
      • プラットフォーム依存性を減らすため
    • Drizzle では方針が逆転している
    • デバッグ用の機能
    • malloc/free, pthread_* は wrapper がある
    • エンディアンフリー
    • リトルエンディアン
    • マルチプラットフォームのため
    • 関数ポインタ,サブクラスを多用して汎用性を上げている
    • ストレージエンジンなどの,プラグインのために
    • 実行時速度重視のビルド

###MySQL を拡張する

  • MySQL の本体に手を入れる
    • なんでもできるがリスクは伴う
  • MySQLの「プラグイン」を開発する
    • プラグインは共有ライブラリ (.so/.dll)
    • 要件によっては実装できない場合がある
    • プラグインインターフェイスの範囲内

###MySQL の入手方法

  • 本家サイトから
  • bzr を利用
  • launchpad 上でホストされている

###開発の流れ

  • 初期ビルド -> 改変 -> デバッグビルド -> テスト -> 改変 ->
    • BUILD/autorun.sh
    • 1~2分(速いマシン)
    • 松信さんは VisualStudio でやっているそうです
    • VisualStudio は少数派
  • BUILD/以下にテンプレートがある
  • VisualStudio -> あとで資料見て

###デモ(1) デバッグ/トレース

  • 目的
    • クラッシュ原因を探る
    • 動作過程を探るため
  • login_connection
    • ログインに関わる接続とか
  • mysql_parse
    • SQL の parse
    • MYSQL_parse で構文解析
    • クエリーキャッシュにヒットするかどうか調べて,ヒットするれば返す
  • mysql_execute_command
    • クエリーを実行する
    • SQL コマンドによって処理の場合分けをしている
    • SELECT だと,その中で権限管理するとか
  • JOIN::optimize()
    • 実行計画を決める
    • 毎回呼ばれる
  • 主キー指定の検索をすると
    • make_join_statistics
    • 主キーを使うのかとか,どういう条件かとか処理
    • EXPLAIN で Const <- JT_CONST
  • 範囲検索
    • InnoDB の storage engine の API records_in_range を呼んでいる
    • どのぐらいのレコードを scan するかを問い合わせて,インデックスを使うか table scan かを決めている的な
    • join->examined_rows++ で処理レコード数を出している
      • slow-query-log のあれ
  • トレース
    • Solaris の dtrace で
    • call stack を見る
    • やってみてください!
    • 単純な SELECT で 4000行程度

###プラグイン化の流れ

  • 本体改変の難易度が高い
    • QA の観点からパッチは入りにくい
  • 同期レプリケーションプラグインとかデータベースエンジンとかもプラグイン
    • プラグイン化の流れが進んでいる
    • さらに推し進めたのが Drizzle

###デモ(2) プラグインの開発

  • information_schema に関するもの
  • /proc/meminfo を information_schema から見れるようにする
    • ST_FIELD_INFO
    • 列情報
    • file_meminfo
    • fopen で /proc/meminfo を拾って,table に入れる
    • schema_table_store_record で information_schema に入れる
    • mysql_is_meminfo_plugin_init 初期化
    • mysql_declare_plugin(mysql_meminfo) マクロで初期化補助?
  • ビルド方法

    • –shared 共有ライブラリ
  • UDF

    • ストレージエンジンAPI を使って直接テーブルにアクセスする
    • Key Value Store を使うような感覚
    • 友人100人の,最新投稿メッセージIDを取得する
      • SQL でやるとフルインデックススキャン
    • UDF でやることでかなり高速化できる
  • ベンチマーク

    • SQL < STORED PROCEDURE << UDF
    • optimizer にキャッシュ機能がないので,毎回実行計画を立てている
    • UDF はオレオレ実行計画なので,そこをすっ飛ばすから高速!

###プラグイン開発の一般的な注意事項

  • mysqld を落とすことが出来る
    • 一般権限を付与しないこと
  • セキュリティホールになるので注意
    • root で実行しない
  • バージョン依存性が高くなる

###次世代RDBMSアーキテクチャ?

  • パーサー -> クエリ書き換えで,テーブル実体に高速アクセス

###MySQl 本体に手を入れる

  • レビューのプロセスが必要
  • 多くの場合互換性の確保が大きな壁になる

###デモ(3) MySQL本体拡張

  • レコードサイズの最大サイズを 64kb 以上にする
  • .frm = テーブル定義ファイル
  • pack_header
    • reclength が max_record_length 超えているとエラーになる
    • これを拡張
    • さらにストレージエンジンの最大長も拡張
    • .frm に保存領域がないので,最後の方に無理矢理書き込む
      • 読み込みの時にも細工をする

###WorkLog

  • 開発計画
  • パッチを投げると
    • レビューアがついてレビューされる
    • コーディング規約に準拠しているか

###テスト

  • mysql-test
  • mysql-stress-test.pl
    • ストレステスト

###WorkLogの例

  • バイナリログの追記 -> 上書き変更パッチ
    • 上書きにするとレプリケーションの binlog が EOF に来たことがわからない
    • EOF -> 転送終わりの判定をしている
    • かなり他の部分も変更しなくてはならないので,簡単ではない

###参考文献

Expert MySQL

著者: Charles Bell
出版日: 2007-01-26
出版社/メーカー: Apress
カテゴリ: Book

  • UDF,ストレージエンジンを自作する方法など
  • Understanding MySQL internals
Understanding MySQL Internals

著者: Sasha Pachev
出版日: 2007-04
出版社/メーカー: Oreilly &amp; Associates Inc
カテゴリ: Book

  • 超極める MySQL
超・極める!MySQL

著者: 坂井 恵, 志村 和彦, ひろせ まさあき, 松信 嘉範
出版日: 2006-10-04
出版社/メーカー: 翔泳社
カテゴリ: Book

##懇親会

  • いつも通り「まずは食う」ー>「落ち着いたら話す人探す」手法
  • @littlestarling さんの DB の師匠さんとずっと話してました.いい話が聞けた.
  • 楽天の安武さんは emacs 使い仲間でした.
 
comments powered by Disqus