狠狠撸

狠狠撸Share a Scribd company logo
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 のデータベースアクセスを高速化できることがあります 性能を引き出すには負荷分散?冗長化の仕組みも重要です
?
?

More Related Content

What's hot (20)

MySQL ガチBeginnerがやってみたことと反省したこと
MySQL ガチBeginnerがやってみたことと反省したことMySQL ガチBeginnerがやってみたことと反省したこと
MySQL ガチBeginnerがやってみたことと反省したこと
Satoshi Suzuki
?
惭测厂蚕尝チューニング
惭测厂蚕尝チューニング惭测厂蚕尝チューニング
惭测厂蚕尝チューニング
yoku0825
?
MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話
Yoshinori Matsunobu
?
惭测厂蚕尝の运用でありがちなこと
惭测厂蚕尝の运用でありがちなこと惭测厂蚕尝の运用でありがちなこと
惭测厂蚕尝の运用でありがちなこと
Hiroaki Sano
?
配布用Beginnerならきっと役立つmaster slave環境
配布用Beginnerならきっと役立つmaster slave環境配布用Beginnerならきっと役立つmaster slave環境
配布用Beginnerならきっと役立つmaster slave環境
yut148atgmaildotcom
?
惭测厂蚕尝バックアップの基本
惭测厂蚕尝バックアップの基本惭测厂蚕尝バックアップの基本
惭测厂蚕尝バックアップの基本
yoyamasaki
?
Mysql casial01
Mysql casial01Mysql casial01
Mysql casial01
matsuo kenji
?
惭测厂蚕尝メインの人が笔辞蝉迟驳谤别厂蚕尝のベンチマークをしてみた话
惭测厂蚕尝メインの人が笔辞蝉迟驳谤别厂蚕尝のベンチマークをしてみた话惭测厂蚕尝メインの人が笔辞蝉迟驳谤别厂蚕尝のベンチマークをしてみた话
惭测厂蚕尝メインの人が笔辞蝉迟驳谤别厂蚕尝のベンチマークをしてみた话
hiroi10
?
贬补苍诲濒别谤さんコンニチワ
贬补苍诲濒别谤さんコンニチワ贬补苍诲濒别谤さんコンニチワ
贬补苍诲濒别谤さんコンニチワ
yoku0825
?
MySQL 5.6新機能解説@dbtechshowcase2012
MySQL 5.6新機能解説@dbtechshowcase2012MySQL 5.6新機能解説@dbtechshowcase2012
MySQL 5.6新機能解説@dbtechshowcase2012
Mikiya Okuno
?
顿叠スキーマもバージョン管理したい!
顿叠スキーマもバージョン管理したい!顿叠スキーマもバージョン管理したい!
顿叠スキーマもバージョン管理したい!
kwatch
?
惭测厂蚕尝日本语利用彻底入门
惭测厂蚕尝日本语利用彻底入门惭测厂蚕尝日本语利用彻底入门
惭测厂蚕尝日本语利用彻底入门
Mikiya Okuno
?
今から备える惭测厂蚕尝最新バージョン5.7
今から备える惭测厂蚕尝最新バージョン5.7今から备える惭测厂蚕尝最新バージョン5.7
今から备える惭测厂蚕尝最新バージョン5.7
yoku0825
?
わたしを支える技术
わたしを支える技术わたしを支える技术
わたしを支える技术
yoku0825
?
SQL Server 2014 In Memory OLTP Overview
SQL Server 2014 In Memory OLTP OverviewSQL Server 2014 In Memory OLTP Overview
SQL Server 2014 In Memory OLTP Overview
Masayuki Ozawa
?
[B31,32]SQL Server Internal と パフォーマンスチューニング by Yukio Kumazawa
[B31,32]SQL Server Internal と パフォーマンスチューニング by Yukio Kumazawa[B31,32]SQL Server Internal と パフォーマンスチューニング by Yukio Kumazawa
[B31,32]SQL Server Internal と パフォーマンスチューニング by Yukio Kumazawa
Insight Technology, Inc.
?
How to backup your mroonga database?
How to backup your mroonga database?How to backup your mroonga database?
How to backup your mroonga database?
yoku0825
?
颁笔鲍の同时実行机能
颁笔鲍の同时実行机能颁笔鲍の同时実行机能
颁笔鲍の同时実行机能
Shinichiro Niiyama
?
fluentd を利用した大規模ウェブサービスのロギング
fluentd を利用した大規模ウェブサービスのロギングfluentd を利用した大規模ウェブサービスのロギング
fluentd を利用した大規模ウェブサービスのロギング
Yuichi Tateno
?
MySQL ガチBeginnerがやってみたことと反省したこと
MySQL ガチBeginnerがやってみたことと反省したことMySQL ガチBeginnerがやってみたことと反省したこと
MySQL ガチBeginnerがやってみたことと反省したこと
Satoshi Suzuki
?
惭测厂蚕尝チューニング
惭测厂蚕尝チューニング惭测厂蚕尝チューニング
惭测厂蚕尝チューニング
yoku0825
?
MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話
Yoshinori Matsunobu
?
惭测厂蚕尝の运用でありがちなこと
惭测厂蚕尝の运用でありがちなこと惭测厂蚕尝の运用でありがちなこと
惭测厂蚕尝の运用でありがちなこと
Hiroaki Sano
?
配布用Beginnerならきっと役立つmaster slave環境
配布用Beginnerならきっと役立つmaster slave環境配布用Beginnerならきっと役立つmaster slave環境
配布用Beginnerならきっと役立つmaster slave環境
yut148atgmaildotcom
?
惭测厂蚕尝バックアップの基本
惭测厂蚕尝バックアップの基本惭测厂蚕尝バックアップの基本
惭测厂蚕尝バックアップの基本
yoyamasaki
?
惭测厂蚕尝メインの人が笔辞蝉迟驳谤别厂蚕尝のベンチマークをしてみた话
惭测厂蚕尝メインの人が笔辞蝉迟驳谤别厂蚕尝のベンチマークをしてみた话惭测厂蚕尝メインの人が笔辞蝉迟驳谤别厂蚕尝のベンチマークをしてみた话
惭测厂蚕尝メインの人が笔辞蝉迟驳谤别厂蚕尝のベンチマークをしてみた话
hiroi10
?
贬补苍诲濒别谤さんコンニチワ
贬补苍诲濒别谤さんコンニチワ贬补苍诲濒别谤さんコンニチワ
贬补苍诲濒别谤さんコンニチワ
yoku0825
?
MySQL 5.6新機能解説@dbtechshowcase2012
MySQL 5.6新機能解説@dbtechshowcase2012MySQL 5.6新機能解説@dbtechshowcase2012
MySQL 5.6新機能解説@dbtechshowcase2012
Mikiya Okuno
?
顿叠スキーマもバージョン管理したい!
顿叠スキーマもバージョン管理したい!顿叠スキーマもバージョン管理したい!
顿叠スキーマもバージョン管理したい!
kwatch
?
惭测厂蚕尝日本语利用彻底入门
惭测厂蚕尝日本语利用彻底入门惭测厂蚕尝日本语利用彻底入门
惭测厂蚕尝日本语利用彻底入门
Mikiya Okuno
?
今から备える惭测厂蚕尝最新バージョン5.7
今から备える惭测厂蚕尝最新バージョン5.7今から备える惭测厂蚕尝最新バージョン5.7
今から备える惭测厂蚕尝最新バージョン5.7
yoku0825
?
わたしを支える技术
わたしを支える技术わたしを支える技术
わたしを支える技术
yoku0825
?
SQL Server 2014 In Memory OLTP Overview
SQL Server 2014 In Memory OLTP OverviewSQL Server 2014 In Memory OLTP Overview
SQL Server 2014 In Memory OLTP Overview
Masayuki Ozawa
?
[B31,32]SQL Server Internal と パフォーマンスチューニング by Yukio Kumazawa
[B31,32]SQL Server Internal と パフォーマンスチューニング by Yukio Kumazawa[B31,32]SQL Server Internal と パフォーマンスチューニング by Yukio Kumazawa
[B31,32]SQL Server Internal と パフォーマンスチューニング by Yukio Kumazawa
Insight Technology, Inc.
?
How to backup your mroonga database?
How to backup your mroonga database?How to backup your mroonga database?
How to backup your mroonga database?
yoku0825
?
fluentd を利用した大規模ウェブサービスのロギング
fluentd を利用した大規模ウェブサービスのロギングfluentd を利用した大規模ウェブサービスのロギング
fluentd を利用した大規模ウェブサービスのロギング
Yuichi Tateno
?

Viewers also liked (6)

カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09
カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09
カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09
Mikiya Okuno
?
HandlerSocket plugin for MySQL (English)
HandlerSocket plugin for MySQL (English)HandlerSocket plugin for MySQL (English)
HandlerSocket plugin for MySQL (English)
akirahiguchi
?
MariaDB Spider Mroonga 20140218
MariaDB Spider Mroonga 20140218MariaDB Spider Mroonga 20140218
MariaDB Spider Mroonga 20140218
Kentoku
?
Spiderの最新動向 20130419
Spiderの最新動向 20130419Spiderの最新動向 20130419
Spiderの最新動向 20130419
Kentoku
?
日本語:Mongo dbに於けるシャーディングについて
日本語:Mongo dbに於けるシャーディングについて日本語:Mongo dbに於けるシャーディングについて
日本語:Mongo dbに於けるシャーディングについて
ippei_suzuki
?
In-Database Analyticsの必要性と可能性
In-Database Analyticsの必要性と可能性In-Database Analyticsの必要性と可能性
In-Database Analyticsの必要性と可能性
Satoshi Nagayasu
?
カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09
カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09
カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09
Mikiya Okuno
?
HandlerSocket plugin for MySQL (English)
HandlerSocket plugin for MySQL (English)HandlerSocket plugin for MySQL (English)
HandlerSocket plugin for MySQL (English)
akirahiguchi
?
MariaDB Spider Mroonga 20140218
MariaDB Spider Mroonga 20140218MariaDB Spider Mroonga 20140218
MariaDB Spider Mroonga 20140218
Kentoku
?
Spiderの最新動向 20130419
Spiderの最新動向 20130419Spiderの最新動向 20130419
Spiderの最新動向 20130419
Kentoku
?
日本語:Mongo dbに於けるシャーディングについて
日本語:Mongo dbに於けるシャーディングについて日本語:Mongo dbに於けるシャーディングについて
日本語:Mongo dbに於けるシャーディングについて
ippei_suzuki
?
In-Database Analyticsの必要性と可能性
In-Database Analyticsの必要性と可能性In-Database Analyticsの必要性と可能性
In-Database Analyticsの必要性と可能性
Satoshi Nagayasu
?

Similar to Handlersocket etc. 20110906 (20)

node-handlersocket
node-handlersocketnode-handlersocket
node-handlersocket
koichik
?
[db tech showcase Tokyo 2017] D21: ついに Red Hat Enterprise Linuxで SQL Serverが使...
[db tech showcase Tokyo 2017] D21: ついに Red Hat Enterprise Linuxで SQL Serverが使...[db tech showcase Tokyo 2017] D21: ついに Red Hat Enterprise Linuxで SQL Serverが使...
[db tech showcase Tokyo 2017] D21: ついに Red Hat Enterprise Linuxで SQL Serverが使...
Insight Technology, Inc.
?
OpenShift v3 Technical Overview
OpenShift v3 Technical OverviewOpenShift v3 Technical Overview
OpenShift v3 Technical Overview
Nakayama Kenjiro
?
顿罢谤补肠别による惭测厂蚕尝解析ことはじめ
顿罢谤补肠别による惭测厂蚕尝解析ことはじめ顿罢谤补肠别による惭测厂蚕尝解析ことはじめ
顿罢谤补肠别による惭测厂蚕尝解析ことはじめ
Mikiya Okuno
?
Lxc on cloud
Lxc on cloudLxc on cloud
Lxc on cloud
Yukihiko SAWANOBORI
?
Cld011 windows server_2016_hyper-v_と_virtual_machine_manager_2016_で
Cld011 windows server_2016_hyper-v_と_virtual_machine_manager_2016_でCld011 windows server_2016_hyper-v_と_virtual_machine_manager_2016_で
Cld011 windows server_2016_hyper-v_と_virtual_machine_manager_2016_で
Tech Summit 2016
?
[Japan Tech summit 2017] DEP 005
[Japan Tech summit 2017] DEP 005[Japan Tech summit 2017] DEP 005
[Japan Tech summit 2017] DEP 005
Microsoft Tech Summit 2017
?
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14
Masahiro Nagano
?
贬鲍て?6000万辫惫のトラフィックを捌くまて?に起ったことをありのままに话すせ?
贬鲍て?6000万辫惫のトラフィックを捌くまて?に起ったことをありのままに话すせ?贬鲍て?6000万辫惫のトラフィックを捌くまて?に起ったことをありのままに话すせ?
贬鲍て?6000万辫惫のトラフィックを捌くまて?に起ったことをありのままに话すせ?
basicinc_dev
?
How to Make Own Framework built on OWIN
How to Make Own Framework built on OWINHow to Make Own Framework built on OWIN
How to Make Own Framework built on OWIN
Yoshifumi Kawai
?
OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lisp
irix_jp
?
20120528 aws meister-reloaded-awssd-kforjava-public
20120528 aws meister-reloaded-awssd-kforjava-public20120528 aws meister-reloaded-awssd-kforjava-public
20120528 aws meister-reloaded-awssd-kforjava-public
Amazon Web Services Japan
?
Cloudstack user group meeting in osaka
Cloudstack user group meeting in osakaCloudstack user group meeting in osaka
Cloudstack user group meeting in osaka
Naotaka Jay HOTTA
?
OpenStack API
OpenStack APIOpenStack API
OpenStack API
Akira Yoshiyama
?
20120117 13 meister-elasti_cache-public
20120117 13 meister-elasti_cache-public20120117 13 meister-elasti_cache-public
20120117 13 meister-elasti_cache-public
Amazon Web Services Japan
?
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platform
Toru Yamaguchi
?
SQL Server エンジニア のための コンテナ入門
SQL Server エンジニア のための コンテナ入門SQL Server エンジニア のための コンテナ入門
SQL Server エンジニア のための コンテナ入門
Tomoyuki Oota
?
SQL Server エンジニアのためのコンテナ入門
SQL Server エンジニアのためのコンテナ入門SQL Server エンジニアのためのコンテナ入門
SQL Server エンジニアのためのコンテナ入門
Insight Technology, Inc.
?
Tottoruby 20110903
Tottoruby 20110903Tottoruby 20110903
Tottoruby 20110903
Takashi SAKAGUCHI
?
クラウド环境向け窜补产产颈虫カスタマイズ绍介(第5回窜补产产颈虫勉强会)
クラウド环境向け窜补产产颈虫カスタマイズ绍介(第5回窜补产产颈虫勉强会)クラウド环境向け窜补产产颈虫カスタマイズ绍介(第5回窜补产产颈虫勉强会)
クラウド环境向け窜补产产颈虫カスタマイズ绍介(第5回窜补产产颈虫勉强会)
Daisuke Ikeda
?
node-handlersocket
node-handlersocketnode-handlersocket
node-handlersocket
koichik
?
[db tech showcase Tokyo 2017] D21: ついに Red Hat Enterprise Linuxで SQL Serverが使...
[db tech showcase Tokyo 2017] D21: ついに Red Hat Enterprise Linuxで SQL Serverが使...[db tech showcase Tokyo 2017] D21: ついに Red Hat Enterprise Linuxで SQL Serverが使...
[db tech showcase Tokyo 2017] D21: ついに Red Hat Enterprise Linuxで SQL Serverが使...
Insight Technology, Inc.
?
OpenShift v3 Technical Overview
OpenShift v3 Technical OverviewOpenShift v3 Technical Overview
OpenShift v3 Technical Overview
Nakayama Kenjiro
?
顿罢谤补肠别による惭测厂蚕尝解析ことはじめ
顿罢谤补肠别による惭测厂蚕尝解析ことはじめ顿罢谤补肠别による惭测厂蚕尝解析ことはじめ
顿罢谤补肠别による惭测厂蚕尝解析ことはじめ
Mikiya Okuno
?
Cld011 windows server_2016_hyper-v_と_virtual_machine_manager_2016_で
Cld011 windows server_2016_hyper-v_と_virtual_machine_manager_2016_でCld011 windows server_2016_hyper-v_と_virtual_machine_manager_2016_で
Cld011 windows server_2016_hyper-v_と_virtual_machine_manager_2016_で
Tech Summit 2016
?
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14
Masahiro Nagano
?
贬鲍て?6000万辫惫のトラフィックを捌くまて?に起ったことをありのままに话すせ?
贬鲍て?6000万辫惫のトラフィックを捌くまて?に起ったことをありのままに话すせ?贬鲍て?6000万辫惫のトラフィックを捌くまて?に起ったことをありのままに话すせ?
贬鲍て?6000万辫惫のトラフィックを捌くまて?に起ったことをありのままに话すせ?
basicinc_dev
?
How to Make Own Framework built on OWIN
How to Make Own Framework built on OWINHow to Make Own Framework built on OWIN
How to Make Own Framework built on OWIN
Yoshifumi Kawai
?
OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lisp
irix_jp
?
20120528 aws meister-reloaded-awssd-kforjava-public
20120528 aws meister-reloaded-awssd-kforjava-public20120528 aws meister-reloaded-awssd-kforjava-public
20120528 aws meister-reloaded-awssd-kforjava-public
Amazon Web Services Japan
?
Cloudstack user group meeting in osaka
Cloudstack user group meeting in osakaCloudstack user group meeting in osaka
Cloudstack user group meeting in osaka
Naotaka Jay HOTTA
?
SQL Server エンジニア のための コンテナ入門
SQL Server エンジニア のための コンテナ入門SQL Server エンジニア のための コンテナ入門
SQL Server エンジニア のための コンテナ入門
Tomoyuki Oota
?
SQL Server エンジニアのためのコンテナ入門
SQL Server エンジニアのためのコンテナ入門SQL Server エンジニアのためのコンテナ入門
SQL Server エンジニアのためのコンテナ入門
Insight Technology, Inc.
?
クラウド环境向け窜补产产颈虫カスタマイズ绍介(第5回窜补产产颈虫勉强会)
クラウド环境向け窜补产产颈虫カスタマイズ绍介(第5回窜补产产颈虫勉强会)クラウド环境向け窜补产产颈虫カスタマイズ绍介(第5回窜补产产颈虫勉强会)
クラウド环境向け窜补产产颈虫カスタマイズ绍介(第5回窜补产产颈虫勉强会)
Daisuke Ikeda
?

Handlersocket etc. 20110906

  • 1. HandlerSocket について + α 2011/09/06 tokyoLinuxStudy #3   @  四谷 株式会社ディー?エヌ?エー システム統括本部 IT 基盤部 樋口 証
  • 2. HandlerSocket plugin とは MySQL の NoSQL なインタフェース ○ NoSQL × NoRDB
  • 3. 構成 mysqld client app Handler Interface Innodb MyISAM Other storage engines … SQL Layer HandlerSocket Plugin Listener for libmysql libmysql libhsclient Applications
  • 4. 概要 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
  • 5. 入手&インストール方法 ソースからビルド https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL Spider For MySQL に同梱されている http://spiderformysql.com/ 斯波さんによる様々な機能追加有り Percona Server に同梱されている http://www.percona.com/software/percona-server/downloads/
  • 6. メリット 速い MySQL は SQL をパースする処理周辺が性能のネックになることがある HandlerSocket はリクエストを集約実行できる HandlerSocket はリクエストをパイプライン化できる クライアントライブラリも速い 同時接続数がほとんど無制限に 65536 本くらいまでいける 通信量が減る
  • 7. HandlerSocket に向いているケース データサイズが十分小さくメモリに乗る 単純なクエリ、サーバの CPU がネック 単純なクエリ、トラフィックがネック 同時接続数が多すぎて MySQL の持続接続が使えない
  • 8. HandlerSocket に不向きなケース クエリが複雑で HandlerSocket で実現困難 クエリ一回あたりの CPU 使用量が多く CPU ネック データサイズが大きく Disk IO がネック
  • 9. 性能の目安 ( 参照系 ) 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 ネック
  • 10. 性能の目安 ( 更新系 ) 前提 : 同期 (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 書き込みはシリアライズされるので、レプリしても常にスレーブが追いつく
  • 11. HandlerSocket の主な機能 ( 参照系 ) Index を使った行取得 Index を使った取得しかできない 範囲取得 比較条件に使える演算子は =, >=, >, <=, < SQL の’ IN’ のような複数行取得 範囲取得 + フィルタ 条件を満たす行だけを取得
  • 12. HandlerSocket の主な機能 ( 更新系 ) 参照クエリで得た行の UPDATE と DELETE 行の INSERT Atomic な Increment/Decrement トランザクションはサポートしない リクエストを跨いだレコードロックを取ることはできない つまり select ... for update
  • 13. SQL クエリとの共存 ○ 同じ DB を SQL と HandlerSocket の両方からアクセスできる ○ バイナリログ HandlerSocket による更新は row base のバイナリログエントリとして記録される ○ レプリケーション ○ SQL クエリキャッシュ HandlerSocket で更新するとクエリキャッシュが破棄される 古い HandlerSocket では破棄されない問題があった ○ ACID 特性 ○ AUTO_INCREMENT HandlerSocket で NULL をセットすると一意な値が生成される × TIMESTAMP 型 HandlerSocket での更新では値がセットされない × トリガ HandlerSocket での更新ではトリガは実行されない
  • 14. はまりどころ (1) HandlerSocket の接続を切るまでテーブルが閉じられない ALTER TABLE とか打つときは接続を全部閉じる必要がある
  • 15. はまりどころ (2) SQL と HandlerSocket の両方から同じ DB を更新するとデッドロックすることがある SQL で更新する際に次のように排他処理するとデッドロックしない SELECT GET_LOCK(‘handlersocket_wr’, 5); (SQL による更新処理 ) SELECT RELEASE_LOCK(‘handlersocket_wr’);
  • 17. 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 ], ]);
  • 18. その他の言語用クライアントライブラリ 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
  • 20. Mobage での負荷分散 & 冗長化 (1) MySQL アプリサーバ MyDNS サーバ MySQL MySQL MySQL サーバのリストを取得
  • 21. Mobage での負荷分散 & 冗長化 (2) MySQL アプリサーバ MyDNS サーバ MySQL MySQL 一台を選択しクエリ実行
  • 22. Mobage での負荷分散 & 冗長化 (3) MySQL アプリサーバ MyDNS サーバ MySQL MySQL エラーが起きたら次を試す
  • 23. Mobage での負荷分散と冗長化 サーバリストの各エントリには重みが指定可能 少しずつサービスに入れるようなことができる 性能の異なるサーバを混ぜられる サーバリストは 10 秒に一回程度の頻度で取得 ランダム又は consistent hashing でサーバを決定する DB 接続はなるべく持続 HandlerSocket では 30 秒間繋ぎっぱなし アプリ自体がリトライする仕組みを持っている DB サーバが一台死んでも即エラーにはならない DB サーバ以外も同じ仕組みで負荷分散&冗長化
  • 24. Mobage での負荷分散と冗長化 Mobage で使っている仕組みの一部が HandlerSocket のソースに入っています perl-Net-HandlerSocket/lib/Net/HandlerSocket/Pool.pm 持続接続、エラー時のリトライ処理など
  • 25. まとめ HandlerSocket を使えば MySQL のデータベースアクセスを高速化できることがあります 性能を引き出すには負荷分散?冗長化の仕組みも重要です
  • 26. ?
  • 27. ?