OSC2008 Tokyo/Fall に行ってきた.

初日は業務として行かせてもらえました.感謝.

メモと感想

  • 仮想化は今後のグリーンITとかエコとかでかなり重要な技術になりそう.
  • またラックの省スペース化に貢献できそうなので,積極的に採用すべきだと思った.
  • 予想以上に性能が良いようだ.
  • ネットワーク越しの RAID1 は便利そう.個人ベースでも利用する価値があるかも.
    • ただし2台も使うかどうかは微妙.
  • Memcached はテキストベースだからこそ汎用的に使える.
  • そろそろうちも Memcached とか使うかな.
  • MySQLPostgreSQL 単体の性能では,実際それほど差はないのかもしれない.
行ってきたセッション
    • 1日目
      • 仮想化環境におけるベンチマーク結果
      • MySQLシステム構成〜高可用性構成編〜
      • ディスクデータ冗長化ソフトウェア DRBDの機能と応用例の紹介
      • やっぱりすごい!Memchaced!!〜最新MySQLサポートツールズのご紹介〜
    • 2日目

仮想化環境におけるベンチマーク結果

日本仮想化技術株式会社 CEO 宮原さん

仮想化環境の設計手法
  • 設計のポイント
    • 目的と優先することを明確化する必要がある
  • 性能要因
    • Core数と仮想化支援技術があるかどうか
    • クロック数はあまり気にしない場合が多い
    • メモリ最大搭載容量は多い方が良い
    • ストレージなどのI/Oの帯域にボトルネックが発生しやすい
      • ストレージコントローラのキャッシュ容量,バス,仮想化支援技術など
    • ソフトウェア
      • スケジューラの特性によって,得手不得手がある.
        • 何を求めるかを考える必要がある.
  • 選定ポイント
    • CPU は仮想化してもそれほど下がりにくい
      • 特に選ばなくてもいい傾向にある
    • メモリ容量は仮想マシン数に影響を与える
      • 積めるだけ積む
    • 高速なI/Oの装備が必須
      • これが一番のキーポイント
      • I/O仮想化支援技術の搭載かどうかにも気をつける
  • 概算での統合計画だと,統合したいサーバのCPU使用率・メモリ容量の総計で見たりする
    • あくまで概算
  • ストレージの選定
    • 速度と「どのようなI/Oアクセスがあるのか」を知る必要がある.
    • DRBD「2つのノードでミラーリング環境&冗長化
ベンチマークについて
  • 汎用的なデータを取得しても,実稼働時とは異なるので,あまり意味のあるデータではない.
    • 何を測定するのか,どう測定するのかを明確化しなければいけない.
  • 仮想化で使えるベンチマーク
    • VMmark
      • 様々な仮想サーバをセットにして,ハードウェアのキャパシティを測定する
      • 6タイルのベンチマークするのに,構築3日,実行8時間かかる.
  • 注意点
    • 仮想マシン内では時間測定が不正確
      • クロックが不定なので,内部時間が不正確になる
    • 仮想化レイヤーのキャッシュが効く場合があるので,物理サーバよりも高速になる場合もある.
Citrix XenServerのベンチマーク結果解説
  • 目的
    • Webサーバ+DBサーバ
      • いわゆるWeb系で必要とされるサーバ構成
    • 仮想化 != 性能低下の数値的な裏付け
      • 性能低下はそれほどではない,もしくは全く低下しない,という裏付けとしてのベンチマーク
    • 一般的なラックサーバの構成でやっている.
  • SPECweb2005
    • 物理サーバのピーク性能と同程度の処理能力が出ている.
      • それ以上はApacheのprefork数やメモリ不足など,さらなる性能調査をしてみないと.
        • 実際に過負荷になったときに,どういう振る舞いをするのかを調査する必要がある.
  • pgbench
    • ストレージ性能が低いと,キャッシュのためか,物理サーバよりも性能が良くなった.
    • ストレージが高性能になると,2VMで物理性能がピークになる.
      • 「高I/O要求 + I/Oを要求しない」のような組み合わせがいいのではないだろうか.
      • DBサーバとWebサーバの組み合わせなど.
  • まとめると
    • 仮想化処理はそれほど重くない.むしろ低い.
    • DB性能はストレージが一番効く.
    • あとメモリ.

MySQLシステム構成〜高可用性構成編〜

  • 梶山さん.いつもの MySQL の人.
  • サーバシステム設計,特にインフラ観点からのセッション
  • Adobe製品の組み込みデータベースエンジンとして採用されていたりする.
データベースインフラ設計
  • インフラ設計で考慮すべき項目
    • 高可用性設計
      • 障害体制や障害時の対策など
    • 拡張方式設計(性能/ストレージ)
      • 分散対策など
    • セキュリティ設計
      • 暗号化など
    • バックアップ設計
    • 監視方式設計
      • MySQL Enterprise Monitorなど
    • メンテナンス方式設計(データ/ログ/時刻同期)
      • データの移動や破棄,バックアップして削除などのデータメンテナンス
高可用性設計
レプリケーション
  • master -> slave
  • かなり枯れた技術
  • 多数のWebでの実績
  • 非同期型
    • Webアプリは 95% が参照,更新が 5% というケースもある.
  • 特徴としては
    • 参照性能の向上
    • バックアップ用途
    • 基本的に一方向だが双方向や循環型もあり得る
    • 更新ログ(bin-log)を利用
  • 構成パターン
    • シングルマスタ -> シングルスレーブ
    • シングルマスタ -> マルチスレーブ
    • シングルマスタ -> シングルスレーブ(リレーサーバ) -> マルチスレーブ
      • そこそこ更新が多い場合
    • マルチマスタ(マスタ <-> マスタ)
      • アプリケーション側でテーブル・データベースのアクセス分散を行うなど
        • 垂直分割をしない場合の解決法かな
  • 仕組み
    • master へ Client から SQL がくる
    • mysqld がデータと binlog に書き込む
    • slave の中継スレッドが master の binlog を参照して中継binlog に書き込む
    • slave の SQL スレッドが中継binlog を監視して,書き込みを実行
  • スケールアウト構成
    • Write1台
    • Read 複数台
  • DRBD
    • Distributed Replicated Block Device
    • 分散ストレージ
    • IPネットワーク上で動作
    • 同期型である.
    • Passive Node に書き込みリクエストを送信してから,Active Node に書き込み,その後レスポンスを返す.
    • Linux 上でのみ利用可能
    • 高可用性を実現
  • DRBD + Linux Heartbeat
    • Linux Hearbeat で実現
  • MySQL + 共有ディスク
    • アクティブ・パッシブ構成
    • データファイルを共有ディスクに
    • 同期型
    • 仮想IPによるフェイルオーバー
    • MyISAM ならアクティブ・アクティブ構成もあり得る
  • レプリケーションマスタの冗長化
    • master を DRBD や共有ディスクでデータの冗長化をする場合が多い.
  • MySQL Proxy
    • クライアントサーバ間で稼働する軽量なアプリケーション
    • LUA言語のインタプリタ同梱
    • 用途例
      • ロードバランス
        • 参照クエリのバランシングなど
      • フェールオーバー
      • ロギング
      • クエリの書き換え
      • パーティショニング
        • 要調査
  • MySQL Cluster
    • トランザクションが多いが,シンプルなクエリが多い場合に有効
    • Single Point of Failure 無し
    • 高可用性
      • 自動フェイルオーバー
      • データは複数のノードに記録
    • 高性能
      • 負荷分散
      • インメモリデータベース
      • 100,000/sec に耐えられるように
    • 管理性
    • 構成要素
      • データノード
        • MySQL ノードからデータを受ける
      • 管理ノード
        • MySQL ノードとデータノードの受け渡しなど?
      • MySQL ノード
        • アプリからクエリを受け付ける
    • データを全件検索やテーブル結合する場合などは,性能面で問題になる場合もある.
  • MySQL Cluster Carrier Grade Edition

ディスクデータ冗長化ソフトウェア DRBDの機能と応用例の紹介

  • DRBD
    • Distributed Replicated Block Device
    • ネットワーク越しの RAID1 のような感じ
    • Linux の LVM の上位レイヤに位置して,2台のサーバ間でこの LVM を同期化・複製・冗長化
  • 基本構成
    • プライマリ + セカンダリ
    • セカンダリからの書き込み完了を待って,プライマリの書き込みが完了する.
      • 完全性というか,同期がとれている状態になる.
    • セカンダリ障害時
      • 処理は停止せず,プライマリにデータは蓄積され続ける.
      • 自動的に切断し,復帰時に同期が取られる.
    • セカンダリとプライマリの交換も可能
    • DRBD Ver.8.2.6 はマルチプライマリ構成が可能
  • クラスタマネージャ
    • マシン・サービスの死活監視
    • 自動・手動でアプリケーションの移動が可能
    • Shared-nothing
      • Single Point of Failure がない
    • 推奨は heartbeat
  • バックアップ
    • DRBDはバックアップにもなる
    • LVMのスナップショットを取る
      • もしくは ZFS を使えるとできるかもしれない.
  • デモ
    • Primary になって初めて mount できる.
    • Secondary で中身を見る場合は,Primary で unmount して,Secondary に変更.その後, Secondary で Primary になって,mount する.
      • ちょっと面倒だが,Primary/Secondary 構成では仕方ないのかもしれない.
    • バックアップの代わりになるのは個人レベルでも使えるかな
      • リポジトリのバックアップなどに,利用する方法もある

やっぱりすごい!Memchaced!!〜最新MySQLサポートツールズのご紹介〜

Memcached
  • 汎用の分散キャッシュシステム
  • Facebook
    • MySQL サーバ 1800台
    • Memcached 搭載メモリ 15TB
    • MySQL サーバメモリ搭載量 25TB
  • なぜ使うか
    • カオスになるから
      • 規模が大きくなると
        • SQLの実行頻度が多いこと
        • データ量が多いこと
    • スケールアップ,スケールアウトして処理をおっつける
      • それでも間に合わない
    • Appサーバが直接 DB サーバにアクセスするのでは,キャッシュが有効活用されていない.
      • キャッシュはあるが,サーバ間で共有できない.
  • テキストベースで動作
  • セキュリティなどはない.
    • 代わりに高速・軽量動作
  • 参考文献
MySQL Enterprise Monitor
  • Agent を各 MySQL サーバに仕込んで監視する
  • サブスクリプション Silver 以上で利用可能
    • Premium 以上で Schema Advisor が利用できる.
    • Trial がある.
MySQL Workbench
  • DBDesigner のような感じ.と言うか DBDesigner の制作に関わっていた人が関与しているそうだ.
    • ER図の作成が可能なデータベースデザインツール
  • Linux 版のα版があるそうだ.
    • その後,Mac 版も出るらしい.
  • 有償版でも $99.
MySQL Proxy
  • まだアルファ版
  • PostgreSQL の pgpool のようなもの.
  • MySQL サーバとクライアントの間に入って,いろいろ便利なことをしてくれる・させられるもの.
  • Lua で動作の拡張が行える
    • INSTALL_DIR/examples の中にサンプルが入ってる.
  • 参照系と更新系のサーバへの振り分けが,MySQL Proxy でロードバランサー的に使えそう.
MySQL Connector/C++ & CMake

オープンソースDB性能検証 SMPスケーラビリティを探る

背景
  • 方針
    • ベンダー依存ではない独自のベンチマーク
      • より客観的で比較しやすい性能評価のやり方
    • シンプルなテストから複雑なものまで,段階的なテストによるボトルネックを洗い出す
      • データベースの本当の限界値・性能を見極めたい
        • INSERT/UPDATE性能のみの限界
      • ネットワーク越しのアクセス・コネクション性能など
      • 実際のサービス(参照8:更新2)の形態で
    • 再現性のある形で
  • テスト項目
    • 単体テスト
      • STORED PROCEDURE, C, Java, PHP
      • INSERT, SELECT, UPDATE, DELETE
      • 機能単体の限界性能
    • 1サーバ 1クライアント
      • C, Java, PHP
      • ネットワーク越しでどこまでパフォーマンスが下がるか
    • 1サーバ マルチクライアント
      • Super Smack
    • シナリオテスト
      • DBT-1 もどき
        • オンラインショップのシナリオテスト
  • 検証条件
    • バージョンにこだわらない
    • データとログのディスクを物理的に分ける
      • 性能値を見るために I/O が足かせにならないように.
        • 逆に言うと,これが性能の足かせになるようだ.
    • 各DB毎にそこそこチューニング
    • MySQL は基本 InnoDB
    • PostgreSQL は適宜 VACUUM, ANALYZE
前回の結果を簡単に
    • MySQL
      • カラム数が多いと性能が下がる
        • カラムのハンドリングに時間がかかるようだ
        • ただし他の DB よりは性能劣化は低い
      • INSERT と DELETE はほぼ同性能
      • SELECT 性能は低いようだ
      • 圧倒的に DELETE 性能が低い
        • 4つのテーブルの結合だと MySQL の方が高速
        • LEFT JOIN だと,PostgreSQL 8.3 との比較で,小接続数では MySQL が高速
          • 接続数が多くなると,差は縮まる
      • GROUP BY では MySQL はさらに高速
      • 更新2:参照8 シナリオテストだと MySQL の方が若干高速
      • innodb_thread_concurrency をむやみに大きくしても意味がない
      • InnoDBMyISAM に比べても十分に早い
      • JOIN は実は早い*1
      • SOCKET 接続は非常に早い
      • ネットワーク接続でもオーバーヘッドが少ない
      • 限界性能を狙うなら UTF-8
        • 内部的に変換が入るから,UTF-8 Native がいい.
        • ただしレコードサイズが増える・大きくなるので,その分を考慮する必要がある.
      • 複雑なクエリだと,PostgreSQL よりも早い
    • PostgreSQL
      • SELECT が非常に早い
        • 単一テーブル・2つのテーブルへの SELECT だと MySQL よりも高速
      • カラム数が増えると INSERT/UPDATE がかなり時間がかかるようになる.
      • DELETE がフラグを立てるだけなので早い
      • VACUUM しないと3割ほど遅くなる
      • 実はかなり早い.
      • シンプルなクエリで多量の結果が返ってくる.
        • SELECT は断然早い
      • プロセスモデルではあるが,同時他接続にも強い
        • 同時 500 接続でもそれほど性能劣化がない
      • 複雑なクエリだと,MySQL に負ける.
    • Firebird
      • INSERT 性能高い
      • ストアドによる単一接続は非常に高速
        • PHP によるネットワーク接続はまだ微妙
        • JDBC はそれなり
その後
  • Super Smack を捨てた
    • Super Smack の問題点
      • クライアント単位に違うクエリーを実行できない
      • テスト毎に同じ乱数列を使えない
      • クライアント内で SELECT でとった値を次のクエリーに使えない
UltraSPARC T2 でのテスト
  • UltraSPARC T2とは
    • 1 Chip 8 Core
    • 1 Core 8 Thread
    • 1 Chip 64 Thread
    • オンラインで Core/Thread を切り替えられる
    • Clock は高くないので,1 Thread あたりの性能はそれなり
  • テスト方針
    • 測定点
      • Thread数 1(1 Core 1 Thread), 8(1C8T), 64(8C8T)
    • MySQL は 5.0 の 64bit バイナリを使う
    • PG 8.3 はビルド
    • FB Classic 1.5 は 64bit バイナリ
    • テスト項目
      • 単純テスト
        • 10万レコード,10/50/500 クライアント
        • DBT-1もどき
          • SELECT 20000 レコード
          • INSERT+UPDATE 5000 レコード
  • テスト結果
    • MySQL
      • MySQL の方がクライアント数にかかわらずおおむね高速
      • 8 Thread で性能は頭打ちになる
    • PostgreSQL
      • 他接続になると,パフォーマンスが下がる
      • 16 Thread で性能は頭打ちになる
    • Firebird
      • 8 Thread で性能は頭打ちになる
    • 現行 DB のスケーラビリティは 8 〜 16 Thread 程度まで.
結論
  • 1CPU -> 8CPU まではがつんとあがる
  • 8CPU -> 16CPU までは,まあまあ,あがる
  • 16CPU -> 64CPU までは,それほど変わらん
  • CPU が増えると Context Switch のオーバーヘッドが大きいのかな?
議論
  • クライアントが同時多接続を送り出せてないのでは?
  • Tomcat/Java はしっかりスケールするらしいので,DB もそれなりにスケールさせられるはず?

*1:意外だ