memcached+PostgreSQLで実現する ハイパフォーマンスWebアプリケーション構築memcachedの使い方(1)(1/4 ページ)

大規模Webサイトでの利用事例が公開されたこともあり、キャッシュサーバを使ったデータベースシステムが注目を集めつつあります。中でもmemcachedは多くのサービスで運用実績がある注目株です。MySQLでの事例が多く取り上げられていますが、本稿では安定性抜群のPostgreSQLと組み合わせた場合の実装方法を紹介していきます。

» 2008年07月30日 00時00分 公開
[鈴木啓修InterDB]

memcachedとは

本稿の前提環境

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はTwitterFacebookなど全世界からアクセスが集中するWebサイトにおいて、大量のトラフィックをさばく高速レスポンスの要として利用されています。Facebookでは800台を超えるmemcached用のサーバが稼働しているようです。

 これら以外にも、公表されているだけでSlashdotLiveJournalWikipediaなどがユーザーとして名を連ねています(公式ユーザーリスト: 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の主要な起動オプション

コラム1:PHPからmemcachedを使う

 ここではPHPからmemcachedを使う方法を説明します。

はじめにpeclコマンドでmemcacheライブラリをインストールします。

[root]# pecl install memcache 

 次にphp.iniファイルに以下の1行を追加します。

extension=memcache.so 

 これでPHPからmemcachedを使う準備ができました。

 以下にはPHPのサンプルプログラムを示します。

  • 3〜4行目

 初期設定で、memcachedの稼働するサーバのIPアドレスと接続ポートを指定します。

  • 7行目

 データの保存です。引数の意味は第1引数がキー、第2引数がデータ、第3引数がフラグ、第4引数がexpire時間(保存時間)です。時間は秒単位で指定します。

 この例ではキー'fukushima'、データ'福島'を3600秒(=1時間)保存します。PHPを含むほとんどの言語のAPIはフラグを無視するので、適当な値を入力してください。

  • 10行目

 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: ?> 
       1|2|3|4 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。