2009年04月30日

MySQL Conference & Expo 2009 に参加してきました

 先週一週間、MySQL Conference & Expo 2009 に参加してきました。ほとんどのキーノートのビデオや一部のセッションの資料は公開されているようなので、それ以外、全体からうけたイメージなどについて、つらつらと。

キーノートの動画一覧 (「Mysqlconf 09」で始まるもの)
プレゼン資料一覧

 サービスをスケールアウトする話は、意外と聞かなかったように思います。今回が初参加だったので間違っているのかもしれませんが、単純な「スケールアウトできるよね」という話ではなく、むしろ、アプリケーションデベロッパに負担をかけずにスケールアウト (もしくはスケールアップ) するデータベースを、どのように作るか、というところが盛り上がっていたように思います。一方で、クラウドコンピューティングに関しては、サービスをスケールさせる道具というよりは、(リソースの確保が)柔軟で安定したインフラストラクチャとして期待されている側面が大きいように感じました。今後は、両者をどう組み合わせていくか、というのが課題になってくるのかもしれません。

 カンファレンスにおいて、私は Q4M の発表 (Q4M (and Pathtraq) at MySQL Conference & Expo 2009) を行いました。Q4M の設計方針から使い方にはじまり、事例までをカバーした (かつてない) 丁寧な資料になっていますので、Q4M を使ってみようかな、という方はごらんください。また、既にお使いいただいている皆さんには、あらためて御礼申し上げさせていただきたいと思います。事例は引き続き絶賛募集中です。

 また、併催されていた Percona Performance Conference (プレゼン資料一覧) でパストラックのバックエンドに関する発表 (Running a Realtime Stats Service on MySQL) を行い、こちらも好評を得ることができ、ほっとしています。

 なかなか密度が濃くてつかれましたが、充実した一週間でした。お世話になったサンマイクロシステムズの方々をはじめ皆さん、ありがとうございました。

投稿者 kazuho : 2009年04月30日 17:28 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2009年02月09日

Q4M 0.8.4 をリリースしました

 MySQL 5.1 用のメッセージキュー「Q4M」のバージョン 0.8.4 をリリースしました。MySQL 5.1.31 用のバイナリもアップロードしてあるので、興味のある方はご覧ください。

q4m.31tools.com

 今回の変更は、唯一、linux (i386) 上において、テーブルサイズが 2GB を超えようとする際にクラッシュする問題の修正です。他の環境においては、変更はありません。

投稿者 kazuho : 2009年02月09日 20:43 | コメント (3) | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2009年02月06日

SSD (フラッシュメモリ) のベンチマークと選定基準

 サーバ側での使用を目的とした SSD のベンチマークや選定基準については、これまでもいろいろ書いてきましたが、では、どのような点に着目して SSD を選定すべきかについて、少し触れておきたいと思います。というわけで、まずはベンチマークの紹介から。データベースのストレージとして使うことを念頭においた、16KB のランダムアクセステストです。

続きを読む "SSD (フラッシュメモリ) のベンチマークと選定基準"

投稿者 kazuho : 2009年02月06日 15:07 | コメント (2) | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2008年12月20日

MySQL Conference & Expo 2009 で Q4M の話をします

 来年4月にカリフォルニアで開催される MySQL Conference & Expo 2009 で、開発・公開しているストレージエンジン Q4M について話をする機会をいただくことができました。しかも 45 分間! 光栄です。

 「MySQL のカンファレンス」なので、運用や実装面について、相当突っ込んだ話ができそう (というかツッコミが怖い...)。自分にとってもいい成長のチャンスだと思うので、しっかり準備していきたいと思います。

Using Q4M - a Message Queue Storage Engine for MySQL

Q4M is a message queue that works as a pluggable storage engine of MySQL 5.1.

Originally developed for Pathtraq (one of Japan’s largest web access stats service), the performance and stability of Q4M is highly renowned within the nation, and other organizations have started using it, including Mixi (Japan’s largest SNS provider).

In the presentation, the original developer of Q4M will explain:

  • the design goals and architecure of Q4M
  • how to use Q4M
  • various usage senarios
  • real-world use cases
so that the audiences can understand and start using Q4M to offload, modularize, stabilize web services, and/or to create loosely-coupled services using the message queue.

Using Q4M - a Message Queue Storage Engine for MySQL: MySQL Conference & Expo 2009 - O'Reilly Conferences, April 20 - 23, 2009, Santa Clara, CA

投稿者 kazuho : 2008年12月20日 00:01 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2008年12月12日

MySQL の order by 〜 limit を高速化する方法

 filesort が回避できない場合に、MySQL の order by 〜 limit を高速化する方法というのを書いてみました。半分は効果測定が目的の実装のため、UDF になっていたりと、利用にはある程度のスキルが必要だとは思いますが、興味のある方はどうぞ。

Using Top N Sort on MySQL

投稿者 kazuho : 2008年12月12日 18:41 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2008年11月27日

ウェブサービスの SSD 化について話してきました

 本日 (11/27) 開催の Shibuya Perl Mongersテクニカルトーク#10 で、ウェブサービスの SSD 化について話しました。スライドを置いておきますので、開発しているウェブアプリケーションフレームワーク NanoA について話してきました とあわせてご覧いただければ幸いです。

 末筆となりますが、Shibuya.pm の実行委員(?)の方々、ありがとうございました&おつかれさまです。 (まだ終わってないけど ^^;)

Web Service on SSD
View SlideShare presentation or Upload your own. (tags: web ssd)

投稿者 kazuho : 2008年11月27日 20:40 | コメント (3) | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2008年11月04日

ウェブサービスにおけるダメージコントロール (MySQL のスロークエリを自動的に kill する方法)

 適切な設計によって、信頼性の高いソフトウェアやサービスを構築することが重要なのは、言うまでもないことです。一方で、なんらかの原因で問題が発生した際に、障害を局所化し、損害を小さく食い止める「ダメージコントロール」という概念もあります。ウェブサービスの場合も、特に検索や集計といった、計算量がクエリの種類によって大幅に異なるようなケースでは、次善の策として後者の手法が有効に働く場合もあるかと思います。

続きを読む "ウェブサービスにおけるダメージコントロール (MySQL のスロークエリを自動的に kill する方法)"

投稿者 kazuho : 2008年11月04日 21:45 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2008年10月28日

ウェブサービスにおける SSD 導入にむけて〜検索サービスの可能性

実際に試してみた結果については、ウェブサービスの SSD 化について話してきましたをご参照ください。

検索エンジンや小さな行が多いデータベース等で使用する目的での SSD (Intel X25-M) のベンチマーク結果については、Kazuho at Work: Benchmarking SSD for MySQL をご覧ください (InnoDB の話をしていますが、Senna / Tritonn でも基本的に同じ)

 Sun が SSD 製品の投入を表明 (マイコミジャーナル) したり、Google が Intel の製品をテスト (The Register) したりと、クライアントサイドに続きサーバサイドへもソリッドステートドライブ (SSD) の波が押し寄せてきつつあります。パストラックでも SSD を使いたいなぁという思いはあったので、ちょっと導入を検討してみることにしました。

1. SSD がむいている箇所

続きを読む "ウェブサービスにおける SSD 導入にむけて〜検索サービスの可能性"

投稿者 kazuho : 2008年10月28日 20:28 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2008年10月17日

Filter::SQL でデータベースを叩くワンライナーを簡単に書く方法

 Perl と SQL を使ってワンライナーを書くことが多いのですが、いろいろ面倒なことが多かったので、以前作成したお気に入りのモジュール Filter::SQL を改良してみました。

 DSL (ドメイン固有言語) は、プログラム開発の生産性を向上させる有力な手段です。そして、よく使われる DSL の代表例が正規表現と SQL だと思うのですが、前者に比して後者を嫌いな人が多いようです。なぜだろうと思ってつぶやいたところ、「SQL はリテラルじゃないから!」という答えが tokuhirom さんから返ってきました。そういえば例えば Pro*C のように C で Embedded SQL というのは良く聞く話なのに、Perl では同様の例がないような感じだったので、作ってみました。Perl で埋め込み SQL を実現するソースフィルター Filter::SQL です。

Kazuho@Cybozu Labs: Perl で埋め込み SQL を使って楽をする話

続きを読む "Filter::SQL でデータベースを叩くワンライナーを簡単に書く方法"

投稿者 kazuho : 2008年10月17日 17:06 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2008年09月02日

Q4M 0.8.3 をリリースしました (含 FreeBSD サポート)

MySQL 5.1 のプラガブルストレージエンジンとして動作するメッセージキュー Q4M のバージョン 0.8.3 をリリースしました。今回の修正点は、以下のとおりです。

  • シャットダウン時 (および DROP TABLE 時) に発生する可能性のあるデッドロックの修正
  • FreeBSD のサポート
FreeBSD のサポートについては、ソースからのビルドエラーを修正したのに加え、バイナリ版も同時にリリースするようにしました。MySQL AB の公式バイナリと組み合わせて動作確認を行っておりますので、よろしければご利用ください。

2008年9月3日追記: Akinori MUSHA さんが Q4M を FreeBSD Ports Collection に追加してくださいました。ありがとうございます。Ports からのインストール方法については、Kazuho at Work: Q4M becomes part of FreeBSD Ports Collectionをご覧ください。

投稿者 kazuho : 2008年09月02日 01:46 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2008年08月30日

MicroblogCon1 の報告と Q4M 0.8.1 リリースのお知らせ

 先日 (8/27 水) 、弊社を会場にして、マイクロブログのサービス開発やそのミドルェアに関するカンファレンス「MicroblogCon1」を開催いたしました。スピーカーの方々、お越しいただいた方々、ありがとうございました (当日の模様は coji さんが撮影して中継、techtalk.jp にて公開してくださっています。 ありがとうございます) 。奥はその中で、Q4M の概論から入門的な話をしたので、興味のある方はスライドをご覧ください。

Q4M Microblogcon
View SlideShare presentation or Upload your own. (tags: q4m mysql)

 カンファレンスの中で、Gearman/TheSchwartz と Q4M の比較について話された id:tokuhirom 氏を始め複数の方から指摘されたのは、「Q4M はインストールがめんどくさい」という点でした。なるほどと思うところがあったので、自動ビルド&テスト環境を作成し、昨日公開したバージョン 0.8.1/0.8.2 からは、linux および Mac OS X 向けにコンパイル済みのバイナリをリリースに含めることができるようになりました (リリースの詳細)。

 Q4M のバイナリ版およびインストール手順については、q4m.31tools.com/install.php をご参照ください。バイナリ版を使うことで、これまでよりも気軽に Q4M をお試しいただけるようになったことと思います。

投稿者 kazuho : 2008年08月30日 16:03 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2008年08月13日

Q4M バージョン 0.8 をリリースしました

MySQL 5.1 用のメッセージキュー Q4M のバージョン 0.8 をリリースしました。基本的にバグフィックスリリースですが、特に優先度付きサブスクリプションあるいは条件付きサブスクリプションを使用している場合は、アップデートをお勧めします。

Q4M の最新版につきましては、q4m.31tools.com からダウンロード可能です。バグフィックスの詳細につきましては、Kazuho at Work: Q4M adoption by Mixi, and the release of version 0.8 をご覧ください。

投稿者 kazuho : 2008年08月13日 13:25 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2008年06月20日

MySQL の ORDER BY を高速化

 Pathtraq の拡張にむけて、いろいろ技術的な可能性を調査していると、MySQL の ORDER BY に負荷がかかっていることが分かりました。他にもボトルネックはあるのですが、ここは比較的最適化しやすそうだったので、試しに書いてみました。

mysql51-sort-opt.patch

 やっていることは、ソートルーチンのベタな最適化です。ORDER BY 句によって悪名高き filesort が実行される場合に、最大30%〜50%ほど高速に動作するようになりました。ただ、自分が書く類いのクエリだと、本質的には top n sort を実装すべきなので、どうしたものかと思っています。現状、x86-64 向けに書いているので、RISC だと確実に落ちると思いますが、at your own risk で試したい方はどうぞ。

投稿者 kazuho : 2008年06月20日 15:46 | コメント (1) | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2008年06月12日

MySQL (InnoDB) に直接アクセスしてタイムライン処理を高速化する話

 フレンド・タイムライン処理の原理と実践 の続きです。

 先のエントリでは、プルモデルの速度が当初予測していたよりも遅かった (というより SQL レイヤでのオーバーヘッドが大きそうだった) ので、MySQL Internals メーリングリストで質問したりしながら、C++ で直接 InnoDB にアクセスするようなコードを書いてみました。

タイムライン構築速度
タイムライン/秒
SQL56.7
ストアドプロシージャ136
C++ での直接アクセス1,7102,000 (追記参照)

 そしたら、10倍以上高速に! ベンチマークを perl ベースのものから mysqlslap に変えたのですが、プッシュモデルの 2/3 の速度が出ています。これなら、データサイズが約 1/10 になることを考えると、メモリの代わりに CPU に投資するほうが良い、という判断も非常に現実味を帯びてきます。また、最近のクアッドコアな CPU を使えば 10,000 タイムライン/秒クラスも夢じゃないでしょうから、memcached による支援の必要もないのかもしれません。

続きを読む "MySQL (InnoDB) に直接アクセスしてタイムライン処理を高速化する話"

投稿者 kazuho : 2008年06月12日 17:12 | コメント (1) | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2008年06月09日

フレンド・タイムライン処理の原理と実践

MySQL (InnoDB) に直接アクセスしてタイムライン処理を高速化する話に続きます。

 Twitter が注目されるようになって久しい今日この頃ですが、友人の投稿を時系列に並べて表示する、というのは、Twitter に限らず Mixi の「マイミクシィ最新日記」やはてなブックマークの「お気に入り」等、ソーシャルなウェブサービスにおいては一般的な手法です。ですが、この処理 (以下「フレンド・タイムライン」と呼ぶ) は、一見簡単そうに見えて、実装には様々な困難が伴います。本記事では、「フレンド・タイムライン」を実現する、プッシュ型とプル型の二種類の手法について、その原理的な特徴と問題、および実践的なテクニックについて説明したいと思います。

 なお、以下では基本的に SQL を用いて話を進めて行きますが、原理的な部分は、どのようなストレージを使おうと、あるいはスケールアウトしようがしまいが、変わらないと思います。

1. プッシュ型

続きを読む "フレンド・タイムライン処理の原理と実践"

投稿者 kazuho : 2008年06月09日 14:06 | コメント (8) | トラックバック (6) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

MySQL のクエリ最適化における、もうひとつの検証方法

 EXPLAIN を使用して MySQL の SQL を最適化するというのは、良く知られた手法だと思います。しかし、EXPLAIN の返す結果が、かならずしもアテになるわけではありません。たとえば、以下のような EXPLAIN を見て、このクエリが最適かどうか、判断ができるでしょうか。私には分かりません。

続きを読む "MySQL のクエリ最適化における、もうひとつの検証方法"

投稿者 kazuho : 2008年06月09日 11:38 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2008年05月27日

メッセージキュー事始め with Q4M

 今日、奥が開発し Pathtraq でも使っているメッセージキュー Q4M について説明する機会があったので、自分の頭を整理しながらスライドに起こしてみました。メッセージキューとはそもそも何か、という所から始まって、Q4M の内部構造と使用方法、さらには、ウェブサービス等でキューを使うべきいくつかのシナリオについても書いてありますので、よろしければご覧ください。

 Q4M については、パフォーマンスチューニングの結果、オンメモリなら1秒間に万単位のメッセージを転送できるようになってきています。サイボウズ・ラボ以外でも Q4M が使われるようになるといいな、と思いました。

投稿者 kazuho : 2008年05月27日 18:17 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2008年03月19日

Q4M (Queue for MySQL) 0.3 リリース

 MySQL 上で動作するメッセージキュー「Q4M」のバージョン 0.3 をリリースしました。今回のバージョンアップで、以下の機能が追加になっています。

メッセージリレー機能

続きを読む "Q4M (Queue for MySQL) 0.3 リリース"

投稿者 kazuho : 2008年03月19日 06:29 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2008年02月05日

Tritonn (MySQL+Senna) の join を高速化

 自分の利用形態において、Tritonn の処理を最適化するパッチを書きました。具体的には、2種類の最適化を行いました。ひょっとするとバグがあるかもしれませんが、興味がある方は、以下のパッチ (tritonn-1.0.9用) とあわせてごらんください。

tritonn-embed-primary-key-v3.patch

1. 全文索引内にプライマリキーを格納

続きを読む "Tritonn (MySQL+Senna) の join を高速化"

投稿者 kazuho : 2008年02月05日 14:58 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2008年01月15日

Q4M - MySQL 上で動作するメッセージキュー

 数年来ずっと「RDBMSに統合されたメッセージキューがほしい」と言ってきたわけですが、昨年末にストレージエンジンをプラグインとして開発できる MySQL 5.1 が RC になっていることに気づき、自分で作ってみました。

Q4M (Queue for MySQL) は MySQL 5.1 のプラガブル・ストレージ・エンジンとして動作するメッセージキューであり、堅牢・高速・柔軟であるよう設計されています。昨年12月遅くに開発が開始され、まだ非常に原始的ですが、かなり高速に動作します。
q4m.31tools.com

 自分の英語を日本語訳するというのも変なものですが、ともかくそういったものです。なんだかんだ言っても、ちゃんとしたバイナリプロトコルの上に C + pthread で書かれたサーバなので、それなりに高速だと思います。ディスクに同期をとりつつパフォーマンスを稼ぐために必須の技術であるグループコミットも実装しましたし。

 Q4M は MySQL のストレージエンジンとして動作するので、MySQL に接続できるあらゆるプログラミング言語から利用することができます。また、Perl むけには、既に dmaki さんによって Perl 用のラッパーモジュール (Queue::Q4M) が開発されています。初回リリースですし、運用環境での使用をお薦めするものではありませんが、興味のある方はお試しいただければ幸いです。

PS. Q4M に興味をもたれた方で del.icio.us のアカウントをお持ちの方は、こちらからブックマークしていただければ幸いです。

投稿者 kazuho : 2008年01月15日 05:25 | トラックバック (1) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク