Your SlideShare is downloading. ×
0
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Handlerさんコンニチワ
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Handlerさんコンニチワ

27

Published on

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

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

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
27
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
1
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

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

×