2011年9月6日に行われた、『tokyoLinuxStudy 03〜MySQLはHandlerSocketとSpiderがビールの会〜』に参加させていただきました。
そのときのメモです。
■諸元
日時: 2011/09/06 開場18:30 本編19:00-21:00 懇親会21:00-21:30
会場: 株式会社IDCフロンティア 本社 カスタマーソリューションセンター (東京都新宿区四谷4-29)
タグ: #tlstudy
要綱: http://atnd.org/events/18877
当日のタイムライン抽出: http://togetter.com/li/184637
■19:00-19:37 HandlerSocket について 株式会社ディー・エヌ・エー 樋口 証氏
HandlerSocket pluginとは … MySQLのNoSQLなプラグイン
構成
概要
InnoDB等のストレージエンジンへの非SQLインタフェースを提供
TCP/IPでリクエストを受け、ストレージエンジンを直接たたく
独自プロトコルをしゃべる
C++とPerlのクライアントライブラリを用意 他言語向けもある
Linux/FreeBSD/MacOSで動作 Linuxに最もチューニングされている
ライセンス BSD
インストール方法
ソースからビルト ソースはGithub
Spider For MySQLに同梱されている
Percona Serverに同梱されている
メリット
速い
MySQLはSQLをパースする処理周辺が性能のネックになることがある
HandlerSocketはリクエストを集約実行できる
HandlerSocketはリクエストをパイプライン化できる
クライアントライブラリも速い
同時接続数がほとんど無制限
65536くらいまでいける MySQLはがんばっても1万くらい
通信量が減る
HandlerSocketに向いているケース
データサイズが十分小さくメモリに乗る
joinなどしないような単純なクエリ、サーバのCPUがネック
単純なクエリ、トラフィックがネック
同時接続数が多すぎてMySQLの接続が使えない
HandlerSocketが不向きなケース
クエリが複雑でHandlerSocketで実現困難
クエリ1回あたりのCPU使用量が多くCPUネック
データサイズが大きくDisk I/Oがネック
性能の目安(参照系)
8 Core CPU with HT、1GbのNICx1 InnnoDB plugin
単純な参照クエ率の処理性能
libmysql 〜100,000qps CUネック
HandlerSocket 〜300,000qps ネットワーク周りがネックになる CPUは頭打ちしない
性能の目安(更新系)
前提 … 同期(durable)書き込み
性能
mysql ~1000 qps レプリケーションするとスレーブが追いつかない
HandlerSocket 〜30000qps 書き込みはシリアライズされるのでレプリケーションにしても常にスレーブが追いつく
HandlerSocketの主な機能(参照型)
Indecを使った行取得 そもそもIndexを使った取得しかできない
範囲取得 比較条件に使える演算子は = >= > <= <
SQLの'IN'のような複数行取得
範囲取得+フィルタ
特定提示の条件を満たすだけ
HandlerSocketの主な機能(更新系)
参照クエリで得た行のupdate delete
行のinsert
atmicなincrement /Decrement
トランザクションはサポートしない
リクエストをまたいだレコードロックを取ることはできない つまりselect for update
SQLクエリとの共存
同じDBをSQLとHandlerSocketの涼帆からアクセスできる
バイナリログ HandlerSocketによる更新はrow baseのバイナリログエントリとして記録される
レプリケーション
SQLクエリキャッシュ
HandlerSocketで更新するとクエリキャッシュが破棄される 古いHandlerSocketでは破棄されない問題があった
ACID特性
MySQLと同様
AUTO_INCREMENT
HandlerSocketでNULLをセットするとユニークな値がセットされる
TIMESTAMP型 HandlerSocketの更新では値がセットされない 将来サポートしたい
トリガ HandlerSocketの更新ではトリガは実行されない 将来的にもサポートしない
はまりどころ
HandlerSocketの接続を切るまでテーブルが閉じられない ALTER TABLEなど実行するときは接続をすべて閉じる必要がある
SQLとHandlerSocketの療法から同じDBを更新するとデッドロックすることがある
HandlerSocketでGET_LOCKして更新処理してRELEASE_LOCKすることで回避可
HandlerSocket用クライアントライブラリ
C++用 libhsclient
Perl用 Net:HandlerSocket
Mobageでの負荷分散+冗長化
MyDNSサーバ → SQLサーバのリストを取得 →アプリサーバ
↓
接続するDBサーバ1台を取得
サーバリストの各エントリには重みが指定可能
少しずつサービスに入れるようなことができる
性能の異なるサーバを混ぜられる
サーバリストは10秒に1回程度の頻度で取得
ランダムまたはconsistent hashingでサーバを決定する
DB接続はなるべく接続
HandlerSocketでは30秒間つなぎっぱなし
アプリ自体がリトライする仕組みを持っている
DBサーバが1台死んでも即エラーにはならない
DBサーバ以外も同じ仕組みで負荷分散&冗長化
Mobageで使っている仕組みの一部がHandlerSocketのソースに入っています
perl-Net-HandlerSocket/lib/Net/HandlerSocket/Pool.pm
接続維持、エラー時のリトライなど
まとめ
HandlerSocketを使えばMySQLのDBアクセスを高速化できることがあります
性能を引き出すには負荷分散・冗長化の仕組みも重要です
■19:40-20:01 handlersocket – Spider – handlersocket – InnoDBなど Spider開発者 斯波 健徳氏
Spiderストレージエンジンとは
MySQLのストレージエンジンの1種
複数のDBサーバにあるテーブルを束ねて1つのテーブルとして利用することを可能にする
GPLライセンス
Spiderを利用した構成例
AP-LB-Spider DB-DB
Spiderとhandlersocket
handlersocketインタフェースからSPiderテーブルを利用すると、Spiderがデータノードにアクセスする際にもhandlersocketインタフェースでアクセスします
※テーブルをパーティショニングしている場合はSpiderテーブルにアクセスするとhandlersocketにならないことがある
データノードがhandlersocketに対応していない場合は、データノードへのアクセスをSQLにすることができる
Spiderとhandlersocketを組み合わせと何がいいのか
handlersocketを分散環境で利用できる
スケールアウトでメモリやCPUリソースを拡張できる
handlersocketアクセスとSQLアクセスで見ているデータが同じなのでデータ矛盾が発生しない
冗長化機能などSpiderの機能を合わせて利用できる
handlersocketアクセスをSQLアクセスでーブルの分散ルールを統一することができる
テーブルによってデータノードへのアクセスをhandlersocketアクセスがSQLアクセスか選択できるのでテーブルによってSQLアクセスを選択しトリガを仕掛けるなど柔軟性の高い利用が可能
更新をシリアライズできる
handlersocketにオプションを追加してみた
handlersocket_support_merge_table 1を設定するとhandlersocketでmerge_myisam、vpのテーブルを利用できるようになる ただしテーブルオープンのコストが増える
handlersocket_client_update_mode 更新の情報をストレージエンジン層にそのまま渡し、大量更新を高速化するためのオプション
handlersocket_unlimited_boundary limitを無制限とみなすしきい値 テーブルパーティショニングしているテーブルでdirect_update_modeを利用するために必要
handlersocket_bulk_insert handlersocketに対して行われるinsertをbulk insertとしてまとめてinsertするオプション 複数ユーザからのinsertもbulk insertできる
handlersocket_bulk_insert_timeout handlersocket_bulk_insertのレコード数に達しない場合でもbulk insertする待機値
spider_direct_sql()でhandlersocketを呼び出せるようにしてみた
spider_direct_sql()はSpiderストレージエンジンのインストールスクリプトを実行すると利用可能になるUDF
SQLインタフェースから他サーバへ直接SQLを実行し結果をテンポラリテーブルに格納することができる
使い方 参考 handlersocketのprotocolja.txtが参考になる
Spiderとhandlersocketに関する今度の活動予定
handlersocketバンドル版MySQLのhandlersocket最新化
Spider側へのhandlersocket新機能への対応
handlersocketの全文検索対応
まとめ
分散DB環境でhandlersocketを利用できる
冗長化機能などのSpider機能をhandlersocketに組み合わせることができる
■20:05-21:00 座談会 モデレーター 社団法人クラウド利用促進機構 代表理事 荒井 康宏氏
開発を始めたきっかけ
樋口 構成全体をみてもっとも高速化のメリットがあるDB周りを改善したかった
斯波 アプリケーションをどうDBにアクセスするかの分散アクセス手法を考えていて、その実現としてSpiderを開発した
類似または競合技術に比較したメリット
樋口 mycachedは知っていたが開発し始めていたので、開発は続行した
斯波 SpiderはMySQLの手前に位置するなるので、MySQLのリソースをそのまま使えるメリットがある
お互いのプロダクトを使ってみての感想
樋口 MySQLに詳しいわけではなくソースを読んでいた。Spiderのソースが参考になる
斯波 handlersocketはいろいろな割り切りで成り立っている。これが面白い
Spider+HandlerSocketの展開について今後追加したい機能など
樋口 己のニースに従って機能を増やしているので、今後の課題次第で機能が増える。アプリの機能をできるだけサーバ側に持って行きたい
斯波 Spiderの開発の余地は残っている。更新を速くしたい。管理系の要望が高まっているので用意していきたい
※続きは抽出TLを参照(力尽きた)
0 件のコメント:
コメントを投稿