memcachedを知り尽くす
第1回 memcachedの基本
株式会社ミクシィ 開発部 システム運用グループの長野です。普段はミクシィのアプリケーション運用を担当しております。今回から数回にわたり,最近Webアプリケーションのスケーラビリティの分野で話題になっているmemcachedについて,弊社開発部 研究開発グループの前坂とともに,使い方や内部構造,運用について解説させて頂きます。
memcachedとは
memcachedは,LiveJournalを運営していたDanga Interactive社で,Brad Fitzpatrick氏が中心となって開発されたソフトウェアです。現在ではmixiやはてな,Facebook,Vox,LiveJournalなど,さまざまなサービスでWebアプリケーションのスケーラビリティを向上させる重要な要素になっています。
多くのWebアプリケーションは,RDBMSにデータを格納し,アプリケーションサーバでそのデータを引き出してブラウザ等に表示させています。しかしデータが大量になったり,アクセスが集中すると,RDBMSの負荷があがり,データベースのレスポンスが悪化し,Webサイトの表示が遅延するなど大きな影響がでてしまいます。
そこでmemcachedが活躍します。memcachedは高性能な分散メモリキャッシュサーバです。通常,データベースへの問い合わせ結果を一時的にキャッシュすることで,データベースへのアクセス回数を減らし,動的なウェブアプリケーションの高速化やスケーラビリティの向上のために利用されています。
memcachedの特徴
memcachedは非常に高速に動作する分散キャッシュサーバですが,特徴としては以下のような点が上げられます。
- シンプルなプロトコル
- libeventによるイベントハンドリング
- 内蔵のオンメモリストレージ
- memcached同士での通信は行わない分散方式
シンプルなプロトコル
memcachedのサーバとクライアントの通信は,XMLなどの複雑なフォーマットは利用せず,シンプルな行ベースのプロトコルによって行われます。行ベースのプロトコルなのでtelnetでmemcachedにデータを保存して,保存したデータを取得することもできます。以下はその例です。
$ telnet localhost 11211 Trying 127.0.0.1... Connected to localhost.localdomain (127.0.0.1). Escape character is '^]'. set foo 0 0 3 (保存コマンド) bar (データ) STORED (結果) get foo (取得コマンド) VALUE foo 0 3 (データ) bar (データ)
プロトコルについてのドキュメントはmemcachedのソースコード内にあります。以下のURLでも参照することができます。
libeventによるイベントハンドリング
libeventとは,Linuxではepoll,BSD系のOSではkqueueなどのイベントハンドリング機能をラップして,サーバに対するコネクション数の増加に対してもO(1)のパフォーマンスを発揮する共通仕様で利用できるようにしたライブラリになります。memcachedはこのlibevetのライブラリを利用しているので、高いパフォーマンスをLinux,BSD,SolarisなどのOS上で発揮することができます。イベントハンドリングについてはここではあまり詳しく触れませんが,Dan Kegel氏のThe C10K Problemが参考になります。
- libevent
- http://www.monkey.org/~provos/libevent/
- The C10K Problem
- http://www.kegel.com/c10k.html
内蔵のオンメモリストレージ
memcachedに保存したデータは,パフォーマンスを向上させるように設計されたmemcached内蔵のメモリストレージに貯められます。データはすべてメモリ上にのみ存在するので,memcachedを再起動したり,OSを再起動するとすべてのデータが消えることになります。またメモリが指定された容量に達すると,LRU(Least Recently Used)に基づいて利用されないキャッシュから自動的に削除されていきます。memcached自体キャッシュのためのサーバとして設計されているので,データの永続化についてはあまり考慮されていません。メモリストレージについての詳しい情報はこの連載の2回目以降に前坂が書きますので、そちらを参考にして頂ければと思います。
memcached同士での通信は行わない分散方式
memcachedは「分散」キャッシュサーバですが,分散に関しての機能はサーバ側には備わっていません。memcached同士で通信を行って情報をシェアすることはありません。どのようにして分散を行うかというと,すべてクライアント側の実装に依存するようになっています。memcachedの分散についてはこの連載の中で取り扱っていく予定です。
図2 memcachedの分散方式
次はmemcachedの利用方法について簡単に紹介します
-
EntriesPerRebuild ディレクティブを変更して再構築時間短縮
こんばんわ^^ いつも参考にさせてもらってる Ogawa::Memoranda さんところで再構築に関する気になる記事がご紹介されてました。 今さらですがMTO...
Tracked : #1 Movable Type 備忘録 (2009/01/23, 22:38)


