NoSQLとしてMySQLを使うDeNAが、memcachedよりも高速な75万クエリ/秒を実現

2010年10月27日

モバゲーで知られるDeNAは、バックエンドデータベースにNoSQLを使っていません。なぜか? それはMySQL/InnoDB 5.1の環境で秒間75万クエリという、多くのNoSQLでも実現できないような高性能を実現しているから。DeNAの松信嘉範(まつのぶよしのり)氏は、自身のブログにこんな内容のエントリ「Using MySQL as a NoSQL - A story for exceeding 750,000 qps on a commodity server」(英語)をボストしています。

Yoshinori Matsunobu's blog: Using MySQL as a NoSQL - A story for exceeding 750,000 qps on a commodity server

松信氏が指摘するように、大規模なネットサービスを提供している企業の多くは分散環境での性能を追求するためにNoSQLデータベースやMemcachedなどの展開を検討したり、実際に採用したりしていることはこのブログでも伝えてきました。

しかしDeNAではMySQLをNoSQLのように使うことで、NoSQLやMemcachedを使わずに高性能なデータベースを実現しているというのです。その仕組みを松信氏は解説しています。

すべてがメモリに乗っていてもSQLのオーバーヘッドは大きい

まず松信氏は、memcachedによるベンチマークを示します。

When you run simple multi-threaded "memcached get" benchmarks, you can probably execute 400,000+ get operations per second, even though memcached clients are located on remote servers. When I tested with the latest libmemcached and memcached, I could get 420,000 get per sec on a 2.5GHz x 8 core Nehalem box with a quad-port Broadcom Gigabit Ethernet card.

シンプルなマルチスレッド対応の“memcached get”ベンチマークを走らせると、恐らくは秒間40万回以上のget操作が可能でしょう。リモートサーバに対するアクセスであってもそうでしょう。私が実際に最新のlibmemcachedとmemcachedでテストすると、秒間42万回を2.5GHz×8コアのNehalemサーバに4ポートのギガビットイーサネットカードの構成で達成できました。

では素のMySQLではどうでしょうか。これもベンチマークを実行した結果、10万回以上だったとのこと。

100,000+ queries per second seems not bad, but much slower than memcached.

秒間10万回以上のクエリは悪くない。memcachedよりは遅いけれども。

そして、クエリ対象のデータがすべてMySQLのメモリにのっていたとして、以下の操作がオーバーヘッドとなっているため、MySQLはmemcachedやNoSQLよりも多くのオーバーヘッドがあると指摘しています。

  • Parsing SQL statements
  • Opening, locking tables
  • Making SQL execution plans
  • Unlocking, closing tables

直接ストレージエンジンにアクセス

そこで、MySQLのデータベースエンジン(ここではInnoDB)に対して、パースなどを行わず直接アクセスするアプローチが最良だと。

We thought that the best approach was implementing a NoSQL network server inside MySQL. That is, writing a network server as a MySQL plugin (daemon plugin) which listens on specific ports, accepting NoSQL protocols/APIs, then accessing to InnoDB directly by using MySQL internal storage engine APIs.

最良のアプローチは、MySQL内部にNoSQLネットワークサーバを実装することだと考えた。MySQLのプラグインとして実装し、NoSQLのプロトコル/APIを受け入れ、MySQL内部のストレージエンジンAPIを使ってInnoDBに直接アクセスするのだ。

これは昨年、サイボウズラボ奥一穂氏が最初に発案したMyCachedという実装があるそうです。そしてもう1つ、DeNAの樋口証(ひぐちあきら)氏が開発したHandlerSocketがあります。

HandlerSocket is a MySQL daemon plugin so that applications can use MySQL like NoSQL. The biggest purpose of the HandlerSocket is that it talks with storage engines like InnoDB without SQL-related overheads.

HandlerSocketはMySQLのデーモンプラグインで、アプリケーションからMySQLをNoSQLのように扱えます。HandlerSocket最大の目的は、InnoDBのようなストレージエンジンに対し、SQL関連のオーバーヘッドなしにアクセスすることです。

そしてすべてのデータがメモリにのった状態で、MySQL、memcached、HandlerSocketのベンチマークを比べた結果、以下のようになりました。

                           approx qps     server CPU util
MySQL via SQL                105,000      %us 60%  %sy 28%
memcached                    420,000      %us  8%  %sy 88%
MySQL via HandlerSocket      750,000      %us 45%  %sy 53%

memcachedよりもMySQL+HandlerSocketの方が高性能でした。この結果は次のように解説されています。

This shows that SQL-layer in MySQL is very costly and skipping the layer certainly improves performance dramatically. It is also interesting that MySQL via HandlerSocket was 178% faster than memcached, and memcached spent too much %system resources. Though memcached is an excellent product, there are still rooms for optimizations.

この結果は、MySQLのSQLレイヤが非常にコストの高いものであり、それをスキップすることが確実に性能向上につながることをはっきりと示しています。また興味深いことに、HandlerSocketを用いたMySQLはmemcachedよりも178%も高速でした。memcachedは非常に多くのシステムリソースを消費しています。memcachedはすぐれたプロダクトですが、まだ多くの最適化の余地が残っています。

HandlerSocketでは、通常のMySQLの機能もそのまま使えますから、既存のアプリケーションには影響を与えずに導入し、高速なアクセスを実現できるプラグインといえます。松信氏は以下のようなメリットと制限事項をあげました。

メリット:

  • Supporting lots of query patterns
  • Can handle lots of concurrent connections
  • Extremely high performance
  • No duplicate cache
  • No data inconsistency
  • Crash-safe
  • SQL can be used from mysql clients
  • No need to modify/rebuild MySQL
  • Independent from storage engines

制限事項:

  • Need to learn HandlerSocket APIs
  • No security
  • No benefit for HDD bound workloads

松信氏はエントリの締めくくりのなかで次のように書いています。

As an ex-employee at MySQL and a long-time fun for MySQL, I'd like to see MySQL becomes better and more popular, not only as an RDBMS, but also as Yet Another NoSQL lineup.

MySQLの元従業員として、そしてMySQLに対する長年のファンとして、MySQLがよりよくなり、より普及してほしいと思う。それはRDBMSとしてだけでなく、もう1つのNoSQLとして。

DeNAはこのMySQL+HandlerSocketを実戦投入しており、多くのmemcachedとMySQLのスレーブサーバを減らすことができたそうです。ちなみに松信氏いわく、DeNAは「世界でも指折りのMySQLの超ヘビーユーザとして知られています」(「Leaving Oracle, Joining DeNA」から)だそうです。

あわせて読みたい

MySQL NoSQL RDB データベース




タグクラウド

クラウド
AWS / Azure / Google Cloud
クラウドネイティブ / サーバレス
クラウドのシェア / クラウドの障害

コンテナ型仮想化

プログラミング言語
JavaScript / Java / .NET
WebAssembly / Web標準
開発ツール / テスト・品質

アジャイル開発 / スクラム / DevOps

データベース / 機械学習・AI
RDB / NoSQL

ネットワーク / セキュリティ
HTTP / QUIC

OS / Windows / Linux / 仮想化
サーバ / ストレージ / ハードウェア

ITエンジニアの給与・年収 / 働き方

殿堂入り / おもしろ / 編集後記

全てのタグを見る

Blogger in Chief

photo of jniino

Junichi Niino(jniino)
IT系の雑誌編集者、オンラインメディア発行人を経て独立。2009年にPublickeyを開始しました。
詳しいプロフィール

Publickeyの新着情報をチェックしませんか?
Twitterで : @Publickey
Facebookで : Publickeyのページ
RSSリーダーで : Feed

最新記事10本