大規模Webサイトでの利用事例が公開されたこともあり、キャッシュサーバを使ったデータベースシステムが注目を集めつつあります。中でもmemcachedは多くのサービスで運用実績がある注目株です。MySQLでの事例が多く取り上げられていますが、本稿では安定性抜群のPostgreSQLと組み合わせた場合の実装方法を紹介していきます。
memcached 1.2.5
データベース:PostgreSQL 8.3.1
OS:CentOS 5(Linux kernel 2.6 )
シェル:bash
CPU:Intel Core2Quad 9660 2.4GHz
RAM:PC2-6400 8GBytes
memcachedは、Danga Interactiveによって開発されたオープンソースのメモリキャッシュサーバです。
メモリ上にデータを保存するのでmemcachedを終了するとデータが失われますが、(OracleやMySQLといった)RDBMSと比較するとけた違いの高速レスポンス性能を有し、数千万件という大量のデータを扱ってもほとんど性能が劣化しないという特徴があります。
機能は限界まで切り詰められ、基本的にはキーとデータの組(以下、itemと呼びます)の保存と検索と削除しかできません。
にもかかわらず、memcachedはTwitterやFacebookなど全世界からアクセスが集中するWebサイトにおいて、大量のトラフィックをさばく高速レスポンスの要として利用されています。Facebookでは800台を超えるmemcached用のサーバが稼働しているようです。
これら以外にも、公表されているだけでSlashdot、LiveJournal、Wikipediaなどがユーザーとして名を連ねています(公式ユーザーリスト: http://www.danga.com/memcached/users.bml)。
大規模なWebサイトに限らず、昨今のWebシステムは一時的に大量のアクセスが集中することが多く、その度にRDBMSがボトルネックになります。こうした事態への対処法の1つとして、データの一部をmemcached上に保存してRDBMSの負荷を抑えるスタイルが増えつつあります。
例えばセッション管理は、基本的にはセッションIDを保存すればよいので、memcachedに最適な仕事です。また、SNSを例に取ると、毎回表示される自身や友人のプロフィールなどは、その都度データベースにアクセスするのでなく、memcached上に保存すればデータベースの負荷が大幅に下がるでしょう。
このように、memcachedは今後のWebシステム設計を大きく変える可能性を秘めています。
memcachedのクライアント用ライブラリは多数開発されています。 C言語による3種類のライブラリ(libmemcache、apr_memcache、libmemcached)をはじめ、Perl/PHP/Ruby/Python/Javaなど、主要な言語のためのAPIが存在します。また、オープンソースのRDBMSであるPostgreSQLとMySQLからmemcachedを操作するライブラリも開発されています。
言語/RDBMS | クライアントライブラリ |
---|---|
C | libmemcache apr_memcache libmemcached |
Perl | Cache::Memcached Cache::Memcached::Fast |
PHP | PECL memcache |
Ruby | Ruby MemCache Client |
Python | python memcached |
Java | memcached client for java |
PostgreSQL | pgmemcache |
MySQL | Memcached Functions for MySQL |
表1 クライアントライブラリ一覧 |
memcachedはlibeventというイベント処理用ライブラリを利用するので、memcachedのインストールに先立ち、libeventをインストールしてください。本稿では以下のとおり、本稿公開時点での最新安定版であるlibevent 1.4.5を導入します。
libevent-1.4.5-stable.tar.gzの入手先
http://www.monkey.org/~provos/libevent/
適当なディレクトリでアーカイブを展開し、configureコマンドとmakeコマンドを実行します。
[root]# tar xvfz libevent-1.4.5-stable.tar.gz [root]# cd libevent-1.4.5-stable [root]# ./configure --prefix=/usr [root]# make && make install
次にmemcached 1.2.5をダウンロードします。
memcached-1.2.5.tar.gzの入手先
http://www.danga.com/memcached/download.bml
libeventと同様、適当なディレクトリでアーカイブを展開し、configureコマンドとmakeコマンドを実行します。
[root]# tar xvfz memcached-1.2.5.tar.gz [root]# cd memcached-1.2.5 [root]# ./configure --enable-threads [root]# make && make install
実行はroot以外のユーザーで行います。
[root]# su postgres [postgres]# /usr/local/bin/memcached -p 11211 -m 1000 -d
主な起動オプションは下記のとおりです。
オプション | 説明 |
---|---|
-p [num] | TCPポート番号を指定。デフォルトは11211 |
-d | デーモンとして起動 |
-m [num] | 確保する最大メモリをMバイト単位で指定。デフォルトは64Mbytes |
-t [num] | 起動するスレッドの数を指定する。デフォルトは4。詳細はji参照 |
表2 memcachedの主要な起動オプション |
ここではPHPからmemcachedを使う方法を説明します。
はじめにpeclコマンドでmemcacheライブラリをインストールします。
[root]# pecl install memcache
次にphp.iniファイルに以下の1行を追加します。
extension=memcache.so
これでPHPからmemcachedを使う準備ができました。
以下にはPHPのサンプルプログラムを示します。
初期設定で、memcachedの稼働するサーバのIPアドレスと接続ポートを指定します。
データの保存です。引数の意味は第1引数がキー、第2引数がデータ、第3引数がフラグ、第4引数がexpire時間(保存時間)です。時間は秒単位で指定します。
この例ではキー'fukushima'、データ'福島'を3600秒(=1時間)保存します。PHPを含むほとんどの言語のAPIはフラグを無視するので、適当な値を入力してください。
10行目はデータの検索です。キー'fukushima'を持つデータを返します。
01: <?php 02: /* memcachedとの接続 */ 03: $memcache = new Memcache; 04: $memcache->addServer("127.0.0.1", 11211); 05: 06: /* データの保存 */ 07: $memcache->add('fukushima', '福島', 0, 3600); 08: 09: /* データの検索 */ 10: $data = $memcache->get('fukushima'); 11: print "key('fukushima') => " . $data . "\n"; 12: 13: /* 切断 */ 14: $memcache->close(); 15: ?>
Copyright © ITmedia, Inc. All Rights Reserved.