handlersocket – Spider –
 - handlersocket – InnoDBなど



                             斯波健徳
         kentokushiba[at]gmail[dot]com
Spiderストレージエンジンとは
Spiderストレージエンジンとは?
Spiderストレージエンジンとは、MySQLのストレージ
エンジンの1種で、複数のデータベースサーバにある
テーブルを束ねて、1つのテーブルとして利用することを
可能にします。

これは、クラウド環境においては、増え続けるデータを、
サーバをどんどん増やしながら分割して管理する
ために利用することができます。

MySQLと同じく、GPLライセンスで公開しています。
Spiderを利用した構成例

          AP        AP

               LB



          DB        DB


          DB        DB

   アプリケーションはSpiderの入ったMySQLに
 SQL(参照/更新)を実行すると、Spiderが透過的に
後ろにあるデータノードにアクセスして結果を返します。
Spiderを利用した構成例

     AP   AP        AP   AP

               LB



     DB   DB        DB   DB


     DB   DB        DB   DB

トラフィックが増えたり、データが増えたりした場合は、
このようにサーバを追加して、負荷分散を行います。
「Spider」と「handlersocket」
Spider経由で、分散環境のhandlersocketにアクセスできる


 handlersocketインターフェースからSpiderテーブルを
 利用すると、Spiderがデータノードにアクセスする際にも
 handlersocketインターフェースでアクセスします。
 (use_hs_read、use_hs_writeを1に設定してください)


 ※テーブルパーティショニングを利用しているSpiderテーブルに、
  offset、limit付きの更新をした場合など、設定に関わらず
  SQLでのアクセスとなるケースもあります。
Spider経由で、分散環境のhandlersocketにアクセスできる




 データノードがhandlersocketに対応していない場合は、
 use_hs_read、use_hs_writeを0に設定することで、
 データノードへのアクセスをSQLにすることができます。
 (テーブル単位で設定可能)
アプリケーションからDB(Spiderノード)へのアクセス

           AP        AP

                LB



           DB        DB


           DB        DB

   アプリケーションはSpiderの入ったMySQLの
   handlersocketインターフェースにアクセス。
Spiderからデータノードへのアクセス

           AP        AP

                LB



           DB        DB


           DB        DB

      SpiderはデータノードのMySQLの
   Handlersocketインターフェースにアクセス。
「Spider」と「handlersocket」を
組み合わせると何がいいのか?
Spiderとhandlersocketを組み合わせると何がいいのか?


・handlersocketを分散環境で利用できる。
 スケールアウトで、メモリやCPUリソースを拡張できる。

・handlersocketアクセスとSQLアクセスで、見ているデータが
 同じなので、データ矛盾が発生しない。

・冗長化機能など、Spiderの機能を合わせて利用できる。
Spiderとhandlersocketを組み合わせると何がいいのか?


・handlersocketアクセスとSQLアクセスで、テーブルの
 分散ルールを統一することができる。

・テーブルによってデータノードへのアクセスをhandlersocket
 アクセスかSQLアクセスかを選択できるので、テーブルによって
 SQLアクセスを選択し、データノードにトリガを仕掛けるなど、
 柔軟性の高い利用が可能。

・更新が並列化できる。
 1サーバに複数MySQLインスタンスを立てる。
「handlersocket」に
オプションを追加してみた
handlersocketにオプションを追加してみた


・handlersocket_support_merge_table
 1を設定すると、handlersocketでmerge_myisam、vpのテーブルを
 利用できるようになる。
 ただし、テーブルオープンのコストが少し増える。
handlersocketにオプションを追加してみた

・handlersocket_direct_update_mode
 更新の情報をストレージエンジン層にそのまま渡し、大量更新を
 高速化するためのオプション。現在のところSpiderのみがこの
 オプションの恩恵を受けることができる。

0:direct update mode off
1:direct update mode 1
  direct updateが機能した場合に、ローカルサーバにバイナリログを残すことができる
  モードです。
2:direct update mode 2
  direct updateが機能した場合に、ローカルサーバにバイナリログを残さない
  モードですが、最速のモードになります。
  データノード側(Spiderのアクセス先)でバイナリログを残すことは可能です。
handlersocketにオプションを追加してみた


・handlersocket_unlimited_boundary
 limitを無制限とみなす閾値です。
 テーブルパーティショニングを利用しているテーブルで
 direct_update_modeを利用するために必要になります。
handlersocketにオプションを追加してみた


・handlersocket_bulk_insert
 handlersocketに対して行われるinsertを、bulk insertとして
 まとめてinsertするオプション。
 複数ユーザからのinsertもbulk insertになるという特徴があり、
 単一行のinsertをマルチスレッドで行うようなアプリケーションの
 insertの高速化に威力を発揮する。(特にSpider)

0:bulk insertを実施せず、1レコードずつのinsertを行います。
1-:指定された値を超えるレコードが蓄積されると、bulk insertが実施されます。
handlersocketにオプションを追加してみた


・handlersocket_bulk_insert_timeout
 handlersocket_bulk_insertのレコード数に達しない状態でも、
 bulk insertを実施する最大待機時間。(秒)
「spider_direct_sql()」で
  「handlersocket」を
呼び出せるようにしてみた
spider_direct_sql()でhandlersocketを呼び出せるようにしてみた

spider_direct_sql()は、Spiderストレージエンジンのインストール
スクリプトを実行すると利用可能になるUDFです。
SQLインターフェースから、他のサーバへ直接SQLを実行し
結果をテンポラリテーブルへ格納することができます。

この、spider_direct_sql()でhandlersocketを呼び出せるように
してみました。
spider_direct_sql()でhandlersocketを呼び出す場合、
性能的なメリットは、工夫した使い方をしないとあまりないと
思いますが、お手軽にhandlersocketを利用することが
可能になるかと思います。
性能を出すためのポイント:spider_direct_sql()側では、テンポラリテーブルへの
             格納のオーバーヘッドがありますが、
             handlersocket側の性能は変わりません。
spider_direct_sql()でhandlersocketを呼び出せるようにしてみた

使い方(handlersocketのprotocol.ja.txtが参考になります)
・テーブルオープン
  select spider_direct_sql('P¥t1¥ttest¥tt1¥tPRIMARY¥ta,b,c','','host "localhost", port
      "9999", access_mode "2"');
・INSERT
  select spider_direct_sql('1¥t+¥t3¥t503¥tr¥t2011-09-06 18:30:00','','host "localhost", port
      "9999", access_mode "2"');
・SELECT (tmp_tというテンポラリテーブルに結果を格納する)
  select spider_direct_sql('1¥t=¥t1¥t503¥t3¥t0','tmp_t', 'host "localhost", port "9999",
      access_mode "2"');
・UPDATE
  select spider_direct_sql('1¥t=¥t1¥t503¥t1¥t0¥tU¥t500¥tq¥t2011-09-06 19:40:00','','host
      "localhost", port "9999", access_mode "2"');
・DELETE
  select spider_direct_sql('1¥t=¥t1¥t500¥t1¥t0¥tD','','host "localhost", port "9999",
      access_mode "2"');
spider_direct_sql()でhandlersocketを呼び出せるようにしてみた




この機能は、Spider 2.27から
          利用可能になります。
「Spider」と「handlersocket」に関する
         今後の活動予定
Spiderとhandlersocketに関する今後の活動予定


・handlersocketバンドル版MySQLのhandlersocket最新化

・Spider側へのhandlersocket新機能への対応

・handlersocketの全文検索対応




                                     など。
handlersocketバンドル版MySQLのhandlersocket最新化


handlersocketは、そのままだと別でコンパイルしてinstallすることは
できるのですが、MySQLのソースコードにバンドルしてコンパイルは
できないので、それができるように、加えてSpiderなどInnoDB
以外のストレージエンジンでもいい感じに動くようにMySQLに
パッチを当てつつ手直しして、バンドルしています。

このため、今バンドルされているhandlersocketは、今年の4月
ぐらいのものになっているので、これを最新化します。
Spider側へのhandlersocket新機能への対応


handlersocketは、更新を行った際に更新対象のレコードを
検索結果のように返すことができるようになっていたり、
インデックス以外の条件で絞り込みを行うフィルタをサポートしたり、
機能追加が積極的に行われています。

Spider経由でhandlersocketを利用する場合も、当然それらの
恩恵を享受できる必要があるため、対応を行います。
handlersocketの全文検索対応


handlersocketで全文検索ができれば、それはそれで便利なのでは
ないかということで、計画中です。
handlersocketは独自プロトコルなので、SQLではできないことに
踏み込みやすいという利点があります。

樋口さんには今日相談しますので、話がなくなったらすみません。
まとめ
まとめ

Spiderとhandlersocketを組み合わせると ・・・・・

・分散DB環境でhandlersocketが利用できる。

・冗長化機能などのSpiderの機能をhandlersocketに
 組み合わせることができる。

など、可能性が広がります。
まとめ




今後も継続的に開発していきますので、

      どうぞよろしくおねがいします。
Any Questions?


Thank you for taking
    your time!!



  Kentoku SHIBA (kentokushiba@gmail.com)
  http://wild-growth-ja.blogspot.com/
  http://spiderformysql.com

hs_spider_hs_something_20110906