repcached はキャッシュサーバに用いられる Memcached 二台が相互にレプリケーションを行えるように KLab が機能拡張したものです。ただ、だいぶ前に開発が止まってしまっているようです。そもそもキャッシュサーバには大切なデータは格納しない運用が通常であり、レプリケーションする意味は MySQL などのデータベースサーバほど高くはないため需要がなかったのでしょうか。とはいえ最近流行の Redis にはレプリケーション機能があり、需要がないことはないと思われます。何か他の要因があるのでしょうか。いずれにせよ自分のアプリケーションでそのまま使用することは若干ためらわれますが、それなりに有名ですので簡単に設定方法をまとめてみます。
公式サイトからリンクをたどっていき最新版をダウンロードします。2015-2-03 現在の最新版は、2011-12-13 に更新された形跡のある memcached-1.2.8-repcached-2.2.1.tar.gz です。
既にインストールされている場合には本手順は不要です。
$ sudo yum install libtool libevent-devel
$ tar zxvf memcached-1.2.8-repcached-2.2.1.tar.gz
$ cd memcached-1.2.8-repcached-2.2.1
$ ./configure --enable-replication --prefix=/usr/local/memcached-1.2.8-repcached-2.2
$ make
$ sudo make install
$ sudo ln -s /usr/local/memcached-1.2.8-repcached-2.2 /usr/local/repcached
$ export PATH=/usr/local/repcached/bin:$PATH
$ export MANPATH=/usr/local/repcached/share/man:$MANPATH
あるいは例えば以下のファイルに上記の export 設定を記述しておくとログイン時に自動で読み込まれます。
$ sudo vi /etc/profile.d/memcached.sh
$ source /etc/profile.d/memcached.sh
以上の設定が正常に完了していることは例えば以下のコマンドで確認できます。
$ which memcached
$ man memcached
192.168.33.101 および 192.168.33.102 それぞれで repcached を起動します。自分自身にコピーしてくるレプリケーション対象は "-x" オプションで指定します。二台両方で "-x" オプションを付与することで双方向のマルチマスターレプリケーションが実現できます。
192.168.33.101
$ memcached -x 192.168.33.102 -v
192.168.33.102
$ memcached -x 192.168.33.101 -v
別ターミナルを起動して二台のマシンで telnet を実行します。
192.168.33.101
$ telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
set hello 0 0 8 ← 8 バイトを hello をキーとして set する命令
12341234 ← 8 バイトの内容を指定してエンター
STORED
get hello ← 確かに set されたことを get して確認
VALUE hello 0 8
12341234
END
quit ← 終了
Connection closed by foreign host.
192.168.33.102
$ telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
get hello ← レプリケーションされたため set せずとも get できる
VALUE hello 0 8
12341234
END
quit ← 終了
Connection closed by foreign host.
以上で 192.168.33.101 → 192.168.33.102 のレプリケーションができていることが確認できました。192.168.33.101 ← 192.168.33.102 のレプリケーションも同様の手順で確認できます。
chkconfig コマンドによって repcached をデーモン化する例を示します。
以下のファイルを作成します。
/etc/init.d/repcached
#!/bin/sh
#
# memcached - high-performance memory object caching system
#
# chkconfig: 345 55 45
# description: memcached is a flexible memory object caching daemon.
# processname: memcached
# config: /etc/sysconfig/repcached
# pidfile: /var/run/memcached/repcached.pid
#
# Source function library.
. /etc/rc.d/init.d/functions
PORT=11211
USER=memcached
MAXCONN=1024
CACHESIZE=640
OPTIONS=""
REPHOST=127.0.0.1
if [ -f /etc/sysconfig/repcached ]; then
. /etc/sysconfig/repcached
fi
PROG="repcached(memcached)"
EXEC=/usr/local/repcached/bin/memcached
PIDFILE=/var/run/memcached/repcached.pid
LOCKFILE=/var/lock/subsys/repcached
RETVAL=0
start () {
echo -n $"Starting $PROG: "
# insure that /var/run/memcached has proper permissions
chown $USER /var/run/memcached
daemon $EXEC -d -x $REPHOST -p $PORT -u $USER -m $CACHESIZE -c $MAXCONN -P $PIDFILE $OPTIONS
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch $LOCKFILE
}
stop () {
echo -n $"Stopping $PROG: "
killproc -p $PIDFILE $EXEC
RETVAL=$?
echo
if [ $RETVAL -eq 0 ]; then
rm -f $LOCKFILE $PIDFILE
fi
}
restart () {
stop
start
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status -p $PIDFILE $PROG
;;
restart|reload)
restart
;;
condrestart)
[ -f $LOCKFILE ] && restart || :
;;
*)
echo $"Usage: $0 {start|stop|status|restart|reload|condrestart}"
RETVAL=2
esac
exit $RETVAL
設置したファイルの権限を適切に設定します。
$ sudo chmod 755 /etc/init.d/repcached
PID ファイルを格納するディレクトリも作成して権限を設定します。
$ sudo mkdir /var/run/memcached
設定ファイルを用意します。
$ sudo vi /etc/sysconfig/repcached
192.168.33.101
PORT=11211
USER=memcached
MAXCONN=1024
CACHESIZE=640
OPTIONS=""
REPHOST=192.168.33.102
192.168.33.102
PORT=11211
USER=memcached
MAXCONN=1024
CACHESIZE=640
OPTIONS=""
REPHOST=192.168.33.101
repcached をデーモン実行するユーザを作成します。ログインできないようにホームディレクトリは作成せず (-s /sbin/nologin) パスワードも設定しません (-M):
$ sudo useradd -M -s /sbin/nologin memcached
$ sudo chkconfig --add repcached
$ sudo chkconfig repcached on
正常に動作していることを確認してみましょう。
$ sudo chkconfig --list | grep repcached
$ sudo service repcached status
$ sudo service repcached restart
$ sudo service repcached stop
$ sudo service repcached start