logo
banner

Repcached



目次

repcachedについて

repcachedとは、memcachedにデータのレプリケーション機能を追加実装したものです。


memcachedは、以下のようなところによく使われると思います。

  • 一時的なデータの保存場所として
  • キャッシュを保存する場所として
    • RDBMSのデータのキャッシュ
    • 生成したページデータのキャッシュ

いずれの場合も消えていいデータなので、万が一memcachedがダウンしても問題はないはずです。

しかし、影響が全くないわけではありません。

例えば、MySQLのデータをmemcachedでキャッシュしている場合、memcachedがダウンしている間は直接MySQLにアクセスがいくことになりDBサーバの負荷が上がります。また、memcachedを再起動してキャッシュが失われた場合は、再びキャッシュが溜まるまではDBサーバに負荷がかかることになってしまいます。

このように、消えてもいいデータといえども、場合によっては気軽にmemcachedを再起動できないわけです。キャッシュしているデータ量が多い場合や、キャッシュの利用頻度が高い場合は、その影響はより大きくなるでしょう。

また、ミッションクリティカルなシステムでは、memcachedの機能や性能はとても魅力的なのに、冗長構成を組めないという理由で利用を断念せざるを得ない事だってありえます。

そこでわたしたちは、memcachedにレプリケーション機能を追加実装することにしました。 それがrepcachedです。

リリースノート

  • 2008-04-11 repcached-2.0 (for memcached-1.2.5)
    • マルチマスタレプリケーションをサポートしました。
    • cas unique IDもレプリケーションできるようにしました。
    • -mで指定したサイズのメモリを使い切った際に、サーバ間のデータの整合性が崩れる問題を修正しました。
    • レプリケーションの開始時に、サーバ間接続が失敗することがある不具合を修正しました。
  • 2008-03-11 repcached-1.2 (for memcached-1.2.4)
    • フラグが常に0でレプリケーションされる問題を修正しました。
    • flush_allのレプリケーション時にマスタでメモリリークが発生する可能性があったのを修正しました。
  • 2008-02-15 repcached-1.1 (for memcached-1.2.4)
    • memcached-1.2.4の新しいプロトコル (append, prepend, cas) に対応。
      • ただし、いまのところcas unique IDのレプリケーションには対応していないので、getsとcasの間にフェイルオーバが発生すると、casが失敗する可能性があります。
    • レプリケーション用のテストケースを同梱しました。prove t.repでテストを実行できます。
  • 2007-11-13 repcached-1.0 (for memcached-1.2.2)
    • 最初のリリース

ダウンロード

repcachedは、パッチとパッチ適用済のmemcachedのアーカイブの2つの形式で配布しています。

使い方

インストール

repcachedパッチ適用済のソースコードをダウンロードするか、 http://www.danga.com/memcached/ からmemcachedのアーカイブをダウンロードしてrepcachedパッチを適用します。

repcachedパッチ適用済のソースコードやrepcachedパッチは#ダウンロードに書いてあるURLから入手できます。

$ MCDVER=1.2.5
$ RCDVER=2.0

$ wget http://downloads.sourceforge.net/repcached/memcached-${MCDVER}-repcached-${RCDVER}.tar.gz
$ tar zxf memcached-${MCDVER}-repcached-${RCDVER}.tar.gz
$ cd memcached-${MCDVER}-repcached-${RCDVER}
もしくは
$ wget http://www.danga.com/memcached/dist/memcached-${MCDVER}.tar.gz
$ tar zxf memcached-${MCDVER}.tar.gz
$ cd memcached-${MCDVER}
$ wget http://downloads.sourceforge.net/repcached/repcached-${RCDVER}-${MCDVER}.patch.gz
$ gzip -cd ../repcached-${RCDVER}-${MCDVER}.patch.gz | patch -p1

ソースを展開したらコンパイルします。memcachedとほぼ同じ手順でコンパイルできますが1つだけ異なる点があります。

レプリケーションを有効にするには、configureで--enable-replicationを指定してください。ただし、--enable-replication と --enable-threads は併用できない点に注意してください。(つまり、レプリケーションを有効にしたい場合は、スレッド対応は無効にしなければなりません)

$ ./configure --enable-replication
$ make
# make install

起動

インストールができたら起動してみましょう。

repcachedでは2つのオプションが追加されています。

-x <ip_addr> 
レプリケーション相手のホスト名かIPアドレスを指定します。
-X <port>  
レプリケーション用のポート番号を指定します。デフォルトは11212です。

では、2つのホスト、fooとbarでレプリケーションしてみましょう。

まずは、fooでmemcachedを起動します。

foo$ memcached -v
replication: listen

このmemcachedは、ポート11211で通常のクライアントからのリクエストを待ち受け、ポート11212でレプリケーション用の接続を待ち受けます。

続いてbarでもmemcachedを起動しましょう。このとき、-xオプションでfooを指定します。

bar$ memcached -v -x foo
replication: connect (peer=10.10.2.28:11212)
replication: marugoto copying
replication: start

うまく接続できた場合、fooには「replication: accept」と出力されるはずです。

レプリケーションの確認

それでは、ちゃんとレプリケーションできているか確認してみましょう。 まずはfooに対してsetコマンドを発行し、'hello'というキーに'world'という値を設定します。

$ socat READLINE tcp:foo:11211,crlf
set hello 0 0 5
world
STORED
get hello
VALUE hello 0 5
world
END
quit

きちんと設定できました。それでは次に、barでgetしてみます。

$ socat READLINE tcp:bar:11211,crlf
get hello
VALUE hello 0 5
world
END
quit

このように、fooに対してsetしたデータが、barでもgetできました。 同様に、barに対してsetしたデータをfooでgetすることができます。

切断と再接続時の挙動

さて、この状態でfooを落としてみます。すると、barでは

replication: close
replication: listen

と表示され、-Xオプションで指定したレプリケーションポート(デフォルトは11212)で接続されるのを待ちます。

続いて、fooでさきほど落としたmemcachedを再び起動してみます。このときに、-xオプションでbarを指定します。

foo$ memcached -v -x bar
replication: connect (peer=10.10.2.27:11212)
replication: marugoto copying
replication: start

このとき、fooには、barが持っているデータが全てコピーされますので、fooとbarで保持しているデータが食い違ってしまうといったことは起こりません。また、fooはコピーが完了するまでクライアントからの接続を受け付けないので、空のデータをgetしてしまう心配もありません。

機能的なところをもう少し詳しく

レプリケーションのタイプ

  • 非同期レプリケーション
  • サーバ2台のマルチマスタ構成


対応しているコマンド

repcachedは以下のmemcachedプロトコルのコマンドに対応しています。更新系のコマンドはexptime引数つきも含めて全て対応しています。casIDもレプリケーションします。

  • set
  • add
  • replace
  • delete
  • flush_all
  • incr
  • decr
  • append
  • prepend
  • cas

作者

  • YASUI Masanobu
  • HIROSE Masaaki

連絡先

  • info-repcached <at> klab.org
Copyright (C) 2007 KLab Inc. All Rights Reserved.