Handlersocket etc. 20110906
Upcoming SlideShare
Loading in...5
×
 

Handlersocket etc. 20110906

on

  • 3,894 views

 

Statistics

Views

Total Views
3,894
Views on SlideShare
3,888
Embed Views
6

Actions

Likes
6
Downloads
41
Comments
0

4 Embeds 6

http://paper.li 2
http://a0.twimg.com 2
http://slideclip.b-prep.com 1
https://si0.twimg.com 1

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Handlersocket etc. 20110906 Handlersocket etc. 20110906 Presentation Transcript

  • HandlerSocket について + α 2011/09/06 tokyoLinuxStudy #3   @  四谷 株式会社ディー・エヌ・エー システム統括本部 IT 基盤部 樋口 証
  • HandlerSocket plugin とは
    • MySQL の NoSQL なインタフェース
    • ○ NoSQL
    • × NoRDB
  • 構成 mysqld client app Handler Interface Innodb MyISAM Other storage engines … SQL Layer HandlerSocket Plugin Listener for libmysql libmysql libhsclient Applications
  • 概要
    • InnoDB 等のストレージエンジンへの非 SQL インタフェースを提供
    • TCP/IP でリクエストを受け、ストレージエンジンを直接叩く
    • 独自プロトコルを喋る
    • C++ と Perl のクライアントライブラリを用意
      • PHP, Java, Python, Ruby, JavaScript(node.js), Scala のライブラリが存在
    • Linux/FreeBSD/MacOS で動作
      • Linux に最もチューニングされている
    • BSD ライセンス
    • ソース : https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL
  • 入手&インストール方法
    • ソースからビルド
      • https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL
    • Spider For MySQL に同梱されている
      • http://spiderformysql.com/
      • 斯波さんによる様々な機能追加有り
    • Percona Server に同梱されている
      • http://www.percona.com/software/percona-server/downloads/
  • メリット
    • 速い
      • MySQL は SQL をパースする処理周辺が性能のネックになることがある
      • HandlerSocket はリクエストを集約実行できる
      • HandlerSocket はリクエストをパイプライン化できる
      • クライアントライブラリも速い
    • 同時接続数がほとんど無制限に
      • 65536 本くらいまでいける
    • 通信量が減る
  • HandlerSocket に向いているケース
    • データサイズが十分小さくメモリに乗る
    • 単純なクエリ、サーバの CPU がネック
    • 単純なクエリ、トラフィックがネック
    • 同時接続数が多すぎて MySQL の持続接続が使えない
  • HandlerSocket に不向きなケース
    • クエリが複雑で HandlerSocket で実現困難
    • クエリ一回あたりの CPU 使用量が多く CPU ネック
    • データサイズが大きく Disk IO がネック
  • 性能の目安 ( 参照系 )
    • 8 Core CPU with HT 、 1Gb の NIC x1 、 InnoDB plugin 、単純な参照クエリの処理性能
      • libmysql: ~ 100,000 qps
        • CPU ネック
      • HandlerSocket: ~ 300,000 qps
        • ネットワーク周りがネックになる
        • CPU は頭打たない
      • HandlerSocket(pipelined): ~ 800,000 qps
        • CPU ネック
      • HandlerSocket(pipelined) AHI 有効 : ~ 3,000,000 qps
        • CPU ネック
  • 性能の目安 ( 更新系 )
    • 前提 :
      • 同期 (durable) 書き込み
        • sync_binlog = 1
        • innodb_flush_log_at_trx_commit = 1
        • innodb_support_xa = 1
      • バッテリ付き write-back cache 又は SSD
    • 性能 :
      • mysql: ~ 1000 qps
        • innodb plugin で sync_binlog = 0 だと group commit が効いてさらに速くなるが、レプリするとスレーブが追いつかない
      • HandlerSocket: ~ 30000 qps
        • 書き込みはシリアライズされるので、レプリしても常にスレーブが追いつく
  • HandlerSocket の主な機能 ( 参照系 )
    • Index を使った行取得
      • Index を使った取得しかできない
    • 範囲取得
      • 比較条件に使える演算子は =, >=, >, <=, <
    • SQL の’ IN’ のような複数行取得
    • 範囲取得 + フィルタ
      • 条件を満たす行だけを取得
  • HandlerSocket の主な機能 ( 更新系 )
    • 参照クエリで得た行の UPDATE と DELETE
    • 行の INSERT
    • Atomic な Increment/Decrement
    • トランザクションはサポートしない
    • リクエストを跨いだレコードロックを取ることはできない
      • つまり select ... for update
  • SQL クエリとの共存
    • ○ 同じ DB を SQL と HandlerSocket の両方からアクセスできる
    • ○ バイナリログ
      • HandlerSocket による更新は row base のバイナリログエントリとして記録される
    • ○ レプリケーション
    • ○ SQL クエリキャッシュ
      • HandlerSocket で更新するとクエリキャッシュが破棄される
      • 古い HandlerSocket では破棄されない問題があった
    • ○ ACID 特性
    • ○ AUTO_INCREMENT
      • HandlerSocket で NULL をセットすると一意な値が生成される
    • × TIMESTAMP 型
      • HandlerSocket での更新では値がセットされない
    • × トリガ
      • HandlerSocket での更新ではトリガは実行されない
  • はまりどころ (1)
    • HandlerSocket の接続を切るまでテーブルが閉じられない
      • ALTER TABLE とか打つときは接続を全部閉じる必要がある
  • はまりどころ (2)
    • SQL と HandlerSocket の両方から同じ DB を更新するとデッドロックすることがある
      • SQL で更新する際に次のように排他処理するとデッドロックしない
      • SELECT GET_LOCK(‘handlersocket_wr’, 5);
      • (SQL による更新処理 )
      • SELECT RELEASE_LOCK(‘handlersocket_wr’);
  • libhsclient
    • HandlerSocket 用クライアントライブラリ
      • C++
      • 低水準インタフェース
  • Net::HandlerSocket
    • Perl 用クライアントライブラリ
      • xs 経由で libhsclient を呼んでいる
    my $cli = new Net::HandlerSocket( {host => ‘localhost’, port => 9999}); $cli->open_index(1, ‘db1’, ‘table1’, ‘PRIMARY’, ‘k,v’); my $res = $cli->exec_multi([ [ 1, ‘=‘, [ ’33’ ], 1, 0 ], [ 1, ‘=‘, [ ’44’ ], 1, 0, ‘U’, [ ’44’, ‘hoge’ ] ], [ 1, ‘>=‘, [ ’55’ ], 10, 20 ], ]);
  • その他の言語用クライアントライブラリ
    • PHP
      • http://openpear.org/package/Net_HandlerSocket
      • http://github.com/tz-lom/HSPHP
      • http ://code.google.com/p/php-handlersocket/
    • Java
      • http://code.google.com/p/hs4j/
      • http ://code.google.com/p/handlersocketforjava/
    • Python
      • http://pypi.python.org/pypi/python-handler-socket
      • https ://code.launchpad.net/~songofacandy/+junk/pyhandlersocket
    • Ruby
      • https://github.com/winebarrel/ruby-handlersocket
      • https ://github.com/miyucy/handlersocket
    • JavaScript
      • https://github.com/koichik/node-handlersocket
    • Scala
      • https://github.com/fujohnwang/hs2client
  • Mobage での負荷分散と冗長化
  • Mobage での負荷分散 & 冗長化 (1) MySQL アプリサーバ MyDNS サーバ MySQL MySQL MySQL サーバのリストを取得
  • Mobage での負荷分散 & 冗長化 (2) MySQL アプリサーバ MyDNS サーバ MySQL MySQL 一台を選択しクエリ実行
  • Mobage での負荷分散 & 冗長化 (3) MySQL アプリサーバ MyDNS サーバ MySQL MySQL エラーが起きたら次を試す
  • Mobage での負荷分散と冗長化
    • サーバリストの各エントリには重みが指定可能
      • 少しずつサービスに入れるようなことができる
      • 性能の異なるサーバを混ぜられる
    • サーバリストは 10 秒に一回程度の頻度で取得
    • ランダム又は consistent hashing でサーバを決定する
    • DB 接続はなるべく持続
      • HandlerSocket では 30 秒間繋ぎっぱなし
    • アプリ自体がリトライする仕組みを持っている
      • DB サーバが一台死んでも即エラーにはならない
    • DB サーバ以外も同じ仕組みで負荷分散&冗長化
  • Mobage での負荷分散と冗長化
    • Mobage で使っている仕組みの一部が HandlerSocket のソースに入っています
      • perl-Net-HandlerSocket/lib/Net/HandlerSocket/Pool.pm
      • 持続接続、エラー時のリトライ処理など
  • まとめ
    • HandlerSocket を使えば MySQL のデータベースアクセスを高速化できることがあります
    • 性能を引き出すには負荷分散・冗長化の仕組みも重要です
  •  
  •