Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Handlerさんコンニチワ
主にInnoDB memcached PluginとNDB memcached Engineの違
いについて
2015/06/26
yoku0825
MyNA・JPUG合同DB勉強会
MySQLはこんな
こともできるん
だ、と思ったら
1/59
さすが変態
(c)tmtms
元ネタ
2/59
褒め⾔葉です
(たぶん)
3/59
\こんにちは/
yoku0825@とある企業のDBA
オラクれない-
ポスグれない-
マイエスキューエる-
家に帰ると
妻の夫-
せがれの⽗-
ムスメの⽗-
Twitter: @yoku0825
Blog: ⽇々の覚書
MyNA ML: ⽇本M...
とある企業(未承諾広告※)
5/59
GMOメディアでは
SQLもNoSQLも⼤
好きなエンジニア
を募集しています
6/59
CMおし
まい
7/59
MySQL
de NoSQL
8/59
HandlerSocket
は有名ですよね
9/59
MySQL de NoSQLのパターン
mysqldがMySQLプロトコル以外の何かをしゃべる1.
MySQLがNoSQLデータベースをバックエンドに持っている2.
MySQLがJSON/BLOB/TEXT型にJSONを⼊出⼒する関数を
持って...
1. mysqldがMySQLプロトコル以外の何かをしゃべる
HandlerSocket Plugin
InnoDB Memcached Plugin
memcachedプロトコルはasciiもbinaryも–
daemon̲memcached...
補⾜(daemon plugin)
MySQL 5.1から使える
mysqldの中にもう1つ(じゃなくてもいいけど)バックグラウ
ンド(じゃなくてもいいけど)スレッドを⽣やす
派⽣したスレッドはMySQLの動作にそれほど縛られずに
mysqld...
さすが
変態
13/59
2. MySQLがNoSQLデータベースをバックエンドに持っ
ている
MySQL Cluster(NDBCLUSTER)
Mroonga(Groonga)
CONNECT(ODBC, CSV, JSON, XML, ..)
Cassandra,...
PostgreSQLにしゃべりかけるストレージエンジンもあり
ましたよ︖ :)
NoSQLじゃなくてSQLだと思うけど。
my-post-engine?: a postgres-engine for MySQL
15/59
さすが
変態
16/59
3. MySQLがJSON/BLOB/TEXT型にJSONを⼊出⼒する
関数を持っている
MariaDBのDynamic Column
MySQL JSON UDF
FacebookMySQLのDocstore
MySQL 5.7はJSON型が...
5. MySQLプロトコルでSQL以外の何かを語り掛けても結
果が戻ってくる
Query Rewrite Plugin (From 5.7)
HANDLERステートメント
18/59
さすが
変態
19/59
6. MySQLじゃない何かがMySQLプロトコルじゃない何
かをしゃべってMySQLじゃないところからデータを引っ
張ってくる
daemon protocol backend
InnoDB
memcached
Plugin
mysqld me...
さすが
変態
21/59
MySQLの仕組み
22/59
MySQLの仕組み
アプリケーション
ライブラリー
–↓ここからmysqld↓–
Connector
SQL Parser
Optimizer
Executor
Handler
Storage Engine
23/59
分類はテキ
トーです
24/59
たとえばSELECTしてみる
25/59
Connector
UNIX Socket, TCP SocketをLISTEN
メインスレッドが担当
mysqld̲main関数の中⾝のことを⾔っているつもり-
接続があったらclone
認証その他はcloneされたスレッドがやる-
26/59
Parser
MySQLプロトコルのコマンド(COM̲SHUTDOWNとか
COM̲PINGとか)も解析
COM̲QUERYならSQLとしてパース
クエリーキャッシュを叩くのはコイツ
ジェネラルログを吐くのもコイツ
27/59
Optimizer
1テーブルだけでもJOINクラス
統計情報は(Handlerレイヤー通さず)ストレージエンジンの
infoメソッドを直接たたいてるっぽい。
28/59
Executor
WHEREやORDER BYがインデックス(=ストレージエンジン
)だけで解決できなかった時はExecutorがやる(Using
where; Using filesort; Using temporary;)
ストレージエン...
Handler
ストレージエンジンを抽象化するためのレイヤー
HANDLERステートメントはParserからいきなりここを叩く
Executorから透過的
30/59
Storage Engine
Handlerクラスを継承して作る。
handlertonってなんか 飯度拉豚(ハンドラートン) って感じでお
なかがすいた
Handlerレイヤーに公開するAPIさえ実装してあれば、それ
以外は⾃由。
31/59
Handler(とそれより上)は
APIを提供するだけで
実際にデータを格納しない-
実際にトランザクションを提供しない-
それらはストレージエンジンのレイヤーで実装されている
32/59
というわ
けで
33/59
MySQL de NoSQLのいいところ
トランザクションで保護されるかどうかとか、それはちゃん
とストレージエンジンを選べば気にしなくていい
ストレージエンジンを間違えると死ぬ
34/59
再掲
35/59
HandlerSocket
daemon plugin
Handlerレイヤーのちょっと上あたりを叩く
もともとの設計思想は 「通信量の削減」(=非MySQLプロトコルの利⽤)と
「パーサー, オプティマイザーのCPUコストの削減」が狙いだった...
InnoDB Memcached Plugin
daemon plugin
InnoDB API(の、結構下の部分)を直接叩く
Handler APIでなくInnoDB APIを叩くのでInnoDB専⽤-
37/59
MySQL HTTP Plugin
daemon plugin
ちゃんと(?) Parserから通しているので、HandlerSocketや
InnoDB memcached PluginのようにパースのCPUコストをか
っ⾶ばすとかそういうつ...
HANDLERステートメント
Optimizerを通さずに直接Handlerレイヤーを叩くための ステー
トメント
MySQL :: MySQL 5.6 Reference Manual :: 13.2.4 HANDLER Syntax-
さす...
クエリーキャッシュ
パースしてすぐに結果を返す
こうやって並べてみるとアグレッシブだなこいつ
40/59
NDBCLUSTER
MySQLプロトコルの上に乗ったSQLをパースして、NDB APIに
変換してくれる変換器
NDBはそれ⾃体で独⽴したトランザクション対応の分散データストア-
41/59
memcached NDB Engine
MySQL何の関係もない
NDB APIをしゃべれるmemcached
mod̲ndb? 知らない⼦ですね
42/59
Mroonga
Groongaもそれ⾃体で独⽴したデータベースサーバー
Groonga-serverはgqtp, http(nginxでラップ), memcachedプロトコル
あたりもしゃべれる
-
ラッパーモードにより更に変態度が上がる
転...
CONNECTストレージエンジン
ストレージエンジンの中に更にプラガブルストレージエンジンの
層を作っちゃったみたいな
44/59
Cassandra, LevelDB, S3, Postgres ストレージエンジ
ン
理屈はNDBCLUSTERやCONNECTと⼀緒で、MySQLプロト
コルを他のAPIに変換する器としてのmysqld
これ系は最近かなり廃れている(と思う...
redisストレージエンジン
本当はredis daemon pluginも作って、「ほら、redisプロ
トコルでしゃべりかけるとredis-serverからデータを引いて
返してくれるMySQL︕︕1」とかやりたかった。
いかにも変態っぽい...
partitionストレージエンジン
mysql56> show pluginsG
..
*************************** 42. row ***************************
Name: partiti...
PERFORMANCE̲SCHEMAストレージエンジン
mysql56> show pluginsG
..
*************************** 10. row ***************************
Name...
Binlogストレージエンジン
( ゚д゚) えっ
mysql56> SHOW PLUGINSG
*************************** 1. row ***************************
Name: binl...
Binlogストレージエンジン
ちゃんとhandlertonを持ってる
Breakpoint 1, binlog_init (p=0x147bcc0) at /home/yoku0825/mysql-5.6.25/sql/binlo
g.cc:...
Binlogストレージエンジン
おそらく、2相コミットをフツーのXAと同じAPIで処理した
かったから
ha̲binlogクラスは存在しない(フツーのHandlerレイヤーを通ったマ
ッピングじゃない)
-
sql/handler.ccの中にち...
MySQLプロトコル
でSQL以外の何か
を語り掛けても結
果が戻ってくる
52/59
Query Rewrite Plugin
Parserの⼿前を取るPre-parse Query Rewriteと
Parserの後ろ(Optimizerの⼿前)を取るPost-parse Query
Rewriteがある
53/59
クエリーリライト
mysqlコマンドラインクライアントを起動してるのに、うっ
かりlsとか叩いちゃったことありませんか︖
mysql57> ls;
+--------------+
| Tables_in_d1 |
+-------------...
クエリーリライト
catとかお好きですか︖
mysql57> cat t1;
+-----+-------+
| num | val |
+-----+-------+
| 1 | one |
| 2 | two |
| 3 | three |...
クエリーリライト
サーバーサイドで書き換えているので、クライアントを選ばな
い。
56/59
夢は無限
⼤
57/59
さすが
変態
58/59
Questions
and/or
Suggestions?
59/59
Upcoming SlideShare
Loading in …5
×

Handlerさんコンニチワ

8,879 views

Published on

2015/06/26 JPUG/MyNA合同勉強会

Published in: Technology
  • Be the first to comment

Handlerさんコンニチワ

  1. 1. Handlerさんコンニチワ 主にInnoDB memcached PluginとNDB memcached Engineの違 いについて 2015/06/26 yoku0825 MyNA・JPUG合同DB勉強会
  2. 2. MySQLはこんな こともできるん だ、と思ったら 1/59
  3. 3. さすが変態 (c)tmtms 元ネタ 2/59
  4. 4. 褒め⾔葉です (たぶん) 3/59
  5. 5. \こんにちは/ yoku0825@とある企業のDBA オラクれない- ポスグれない- マイエスキューエる- 家に帰ると 妻の夫- せがれの⽗- ムスメの⽗- Twitter: @yoku0825 Blog: ⽇々の覚書 MyNA ML: ⽇本MySQLユーザ会 4/59
  6. 6. とある企業(未承諾広告※) 5/59
  7. 7. GMOメディアでは SQLもNoSQLも⼤ 好きなエンジニア を募集しています 6/59
  8. 8. CMおし まい 7/59
  9. 9. MySQL de NoSQL 8/59
  10. 10. HandlerSocket は有名ですよね 9/59
  11. 11. MySQL de NoSQLのパターン mysqldがMySQLプロトコル以外の何かをしゃべる1. MySQLがNoSQLデータベースをバックエンドに持っている2. MySQLがJSON/BLOB/TEXT型にJSONを⼊出⼒する関数を 持っている 3. MySQLがデータ型としてJSONを持っている4. MySQLプロトコルでSQL以外の何かを語り掛けても結果が 戻ってくる (new!!) 5. MySQLじゃない何かがMySQLプロトコルじゃない何かをし ゃべってMySQLじゃないところからデータを引っ張ってく る (えっ) 6. 10/59
  12. 12. 1. mysqldがMySQLプロトコル以外の何かをしゃべる HandlerSocket Plugin InnoDB Memcached Plugin memcachedプロトコルはasciiもbinaryも– daemon̲memcached̲option=”-B ..”で渡してやればいけそう - MySQL HTTP Plugin daemon pluginの類 11/59
  13. 13. 補⾜(daemon plugin) MySQL 5.1から使える mysqldの中にもう1つ(じゃなくてもいいけど)バックグラウ ンド(じゃなくてもいいけど)スレッドを⽣やす 派⽣したスレッドはMySQLの動作にそれほど縛られずに mysqldの構造体もろもろに⼿が出せる 3306以外のポートをLISTENしたり- 本当にバックグラウンド処理っぽく動いてもいい- 12/59
  14. 14. さすが 変態 13/59
  15. 15. 2. MySQLがNoSQLデータベースをバックエンドに持っ ている MySQL Cluster(NDBCLUSTER) Mroonga(Groonga) CONNECT(ODBC, CSV, JSON, XML, ..) Cassandra, LevelDB, S3 Storage Engine Pluginの類 14/59
  16. 16. PostgreSQLにしゃべりかけるストレージエンジンもあり ましたよ︖ :) NoSQLじゃなくてSQLだと思うけど。 my-post-engine?: a postgres-engine for MySQL 15/59
  17. 17. さすが 変態 16/59
  18. 18. 3. MySQLがJSON/BLOB/TEXT型にJSONを⼊出⼒する 関数を持っている MariaDBのDynamic Column MySQL JSON UDF FacebookMySQLのDocstore MySQL 5.7はJSON型がどうこうというより、JSON UDFで SQLっぽく出し⼊れ可能にして、Generated Columnでイン デックスを張れるようにしているのが⼤きい。 17/59
  19. 19. 5. MySQLプロトコルでSQL以外の何かを語り掛けても結 果が戻ってくる Query Rewrite Plugin (From 5.7) HANDLERステートメント 18/59
  20. 20. さすが 変態 19/59
  21. 21. 6. MySQLじゃない何かがMySQLプロトコルじゃない何 かをしゃべってMySQLじゃないところからデータを引っ 張ってくる daemon protocol backend InnoDB memcached Plugin mysqld memcached InnoDB NDB memcached Engine memcached memcached NDB mod̲ndb httpd http NDB openldap slapd LDAP NDB Native NDB API ndbmtd NDB NDB MySQL ClusterでNoSQLって⾔ったら基本これ。 20/59
  22. 22. さすが 変態 21/59
  23. 23. MySQLの仕組み 22/59
  24. 24. MySQLの仕組み アプリケーション ライブラリー –↓ここからmysqld↓– Connector SQL Parser Optimizer Executor Handler Storage Engine 23/59
  25. 25. 分類はテキ トーです 24/59
  26. 26. たとえばSELECTしてみる 25/59
  27. 27. Connector UNIX Socket, TCP SocketをLISTEN メインスレッドが担当 mysqld̲main関数の中⾝のことを⾔っているつもり- 接続があったらclone 認証その他はcloneされたスレッドがやる- 26/59
  28. 28. Parser MySQLプロトコルのコマンド(COM̲SHUTDOWNとか COM̲PINGとか)も解析 COM̲QUERYならSQLとしてパース クエリーキャッシュを叩くのはコイツ ジェネラルログを吐くのもコイツ 27/59
  29. 29. Optimizer 1テーブルだけでもJOINクラス 統計情報は(Handlerレイヤー通さず)ストレージエンジンの infoメソッドを直接たたいてるっぽい。 28/59
  30. 30. Executor WHEREやORDER BYがインデックス(=ストレージエンジン )だけで解決できなかった時はExecutorがやる(Using where; Using filesort; Using temporary;) ストレージエンジンだけで解決できる場合は handler::ha̲index̲nextすればいいだけ - ストレージエンジンから戻された結果に対してsql/filesort.cc的なこ とをやったりする。 - スローログを吐くのはコイツ。 29/59
  31. 31. Handler ストレージエンジンを抽象化するためのレイヤー HANDLERステートメントはParserからいきなりここを叩く Executorから透過的 30/59
  32. 32. Storage Engine Handlerクラスを継承して作る。 handlertonってなんか 飯度拉豚(ハンドラートン) って感じでお なかがすいた Handlerレイヤーに公開するAPIさえ実装してあれば、それ 以外は⾃由。 31/59
  33. 33. Handler(とそれより上)は APIを提供するだけで 実際にデータを格納しない- 実際にトランザクションを提供しない- それらはストレージエンジンのレイヤーで実装されている 32/59
  34. 34. というわ けで 33/59
  35. 35. MySQL de NoSQLのいいところ トランザクションで保護されるかどうかとか、それはちゃん とストレージエンジンを選べば気にしなくていい ストレージエンジンを間違えると死ぬ 34/59
  36. 36. 再掲 35/59
  37. 37. HandlerSocket daemon plugin Handlerレイヤーのちょっと上あたりを叩く もともとの設計思想は 「通信量の削減」(=非MySQLプロトコルの利⽤)と 「パーサー, オプティマイザーのCPUコストの削減」が狙いだったらしい。 - 「memcachedプロトコルしゃべるようにすればよかった」って松信さん が嘆いていたらしい。 - 36/59
  38. 38. InnoDB Memcached Plugin daemon plugin InnoDB API(の、結構下の部分)を直接叩く Handler APIでなくInnoDB APIを叩くのでInnoDB専⽤- 37/59
  39. 39. MySQL HTTP Plugin daemon plugin ちゃんと(?) Parserから通しているので、HandlerSocketや InnoDB memcached PluginのようにパースのCPUコストをか っ⾶ばすとかそういうつもりはなさそう 38/59
  40. 40. HANDLERステートメント Optimizerを通さずに直接Handlerレイヤーを叩くための ステー トメント MySQL :: MySQL 5.6 Reference Manual :: 13.2.4 HANDLER Syntax- さすが変態 39/59
  41. 41. クエリーキャッシュ パースしてすぐに結果を返す こうやって並べてみるとアグレッシブだなこいつ 40/59
  42. 42. NDBCLUSTER MySQLプロトコルの上に乗ったSQLをパースして、NDB APIに 変換してくれる変換器 NDBはそれ⾃体で独⽴したトランザクション対応の分散データストア- 41/59
  43. 43. memcached NDB Engine MySQL何の関係もない NDB APIをしゃべれるmemcached mod̲ndb? 知らない⼦ですね 42/59
  44. 44. Mroonga Groongaもそれ⾃体で独⽴したデータベースサーバー Groonga-serverはgqtp, http(nginxでラップ), memcachedプロトコル あたりもしゃべれる - ラッパーモードにより更に変態度が上がる 転置索引部分はGroonga API、データ部分は他のエンジンのHandlerを使 う - 43/59
  45. 45. CONNECTストレージエンジン ストレージエンジンの中に更にプラガブルストレージエンジンの 層を作っちゃったみたいな 44/59
  46. 46. Cassandra, LevelDB, S3, Postgres ストレージエンジ ン 理屈はNDBCLUSTERやCONNECTと⼀緒で、MySQLプロト コルを他のAPIに変換する器としてのmysqld これ系は最近かなり廃れている(と思う) 45/59
  47. 47. redisストレージエンジン 本当はredis daemon pluginも作って、「ほら、redisプロ トコルでしゃべりかけるとredis-serverからデータを引いて 返してくれるMySQL︕︕1」とかやりたかった。 いかにも変態っぽいでしょ︖ :)- redisプロトコルをしゃべるdaemon pluginがつらくて挫 折。 ストレージエンジンはスケルトン(Exampleストレージエンジン)があ るので割と書きやすい。 - yoku0825/bogus̲redis̲storage̲engine 46/59
  48. 48. partitionストレージエンジン mysql56> show pluginsG .. *************************** 42. row *************************** Name: partition Status: ACTIVE Type: STORAGE ENGINE Library: NULL License: GPL .. ha̲partitionクラスが物理的には別のテーブルであるパーテ ィションを透過的に扱ってくれる。 47/59
  49. 49. PERFORMANCE̲SCHEMAストレージエンジン mysql56> show pluginsG .. *************************** 10. row *************************** Name: PERFORMANCE_SCHEMA Status: ACTIVE Type: STORAGE ENGINE Library: NULL License: GPL .. カウンターの更新はHandler使ってないので、SELECTでア クセスするためのインターフェイス以外にあんまり思いつか ない。。 48/59
  50. 50. Binlogストレージエンジン ( ゚д゚) えっ mysql56> SHOW PLUGINSG *************************** 1. row *************************** Name: binlog Status: ACTIVE Type: STORAGE ENGINE Library: NULL License: GPL .. 49/59
  51. 51. Binlogストレージエンジン ちゃんとhandlertonを持ってる Breakpoint 1, binlog_init (p=0x147bcc0) at /home/yoku0825/mysql-5.6.25/sql/binlo g.cc:887 (gdb) p *hton $4 = { state = SHOW_OPTION_YES, db_type = DB_TYPE_BINLOG, slot = 2, savepoint_offset = 0, close_connection = 0x895db0 <binlog_close_connection(handlerton*, THD*)>, savepoint_set = 0x89bed0 <binlog_savepoint_set(handlerton*, THD*, void*)>, savepoint_rollback = 0x89cb60 <binlog_savepoint_rollback(handlerton*, THD*, vo id*)>, savepoint_rollback_can_release_mdl = 0x8944a0 <binlog_savepoint_rollback_can_r elease_mdl(handlerton*, THD*)>, savepoint_release = 0, commit = 0x892590 <binlog_commit(handlerton*, THD*, bool)>, rollback = 0x8a27a0 <binlog_rollback(handlerton*, THD*, bool)>, prepare = 0x892580 <binlog_prepare(handlerton*, THD*, bool)>, 50/59
  52. 52. Binlogストレージエンジン おそらく、2相コミットをフツーのXAと同じAPIで処理した かったから ha̲binlogクラスは存在しない(フツーのHandlerレイヤーを通ったマ ッピングじゃない) - sql/handler.ccの中にちょこちょこいるくらい。- innodb̲support̲xaを切るとバイナリーログのシリアル性 が損なわれるかもよ、というのもそれなら頷ける MySQL :: MySQL 5.6 Reference Manual :: 14.11 InnoDB Startup Options and System Variables - 51/59
  53. 53. MySQLプロトコル でSQL以外の何か を語り掛けても結 果が戻ってくる 52/59
  54. 54. Query Rewrite Plugin Parserの⼿前を取るPre-parse Query Rewriteと Parserの後ろ(Optimizerの⼿前)を取るPost-parse Query Rewriteがある 53/59
  55. 55. クエリーリライト mysqlコマンドラインクライアントを起動してるのに、うっ かりlsとか叩いちゃったことありませんか︖ mysql57> ls; +--------------+ | Tables_in_d1 | +--------------+ | t1 | +--------------+ 1 row in set, 1 warning (0.01 sec) mysql57> SHOW WARNINGS; +-------+------+---------------------------------------------------------------- ---+ | Level | Code | Messag e | +-------+------+---------------------------------------------------------------- ---+ | Note | 1105 | Query 'ls' rewritten to 'SHOW TABLES' by plugin: rewrite_exampl e. | +-------+------+---------------------------------------------------------------- ---+ 1 row in set (0.00 sec) 54/59
  56. 56. クエリーリライト catとかお好きですか︖ mysql57> cat t1; +-----+-------+ | num | val | +-----+-------+ | 1 | one | | 2 | two | | 3 | three | +-----+-------+ 3 rows in set, 1 warning (0.02 sec) 55/59
  57. 57. クエリーリライト サーバーサイドで書き換えているので、クライアントを選ばな い。 56/59
  58. 58. 夢は無限 ⼤ 57/59
  59. 59. さすが 変態 58/59
  60. 60. Questions and/or Suggestions? 59/59

×