2011年9月6日

『tokyoLinuxStudy 03〜MySQLはHandlerSocketとSpiderがビールの会〜』のメモ

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 件のコメント: