memcachedを複数プロセスで起動する

環境

memcachedを複数起動する用途


実際業務でこの様なことをしたことがないので憶測になってしまいますが、memcachedを複数起動することでサービス毎のキャッシュをポート別に分けれるというのが良いのではないかと思います。
A〜Cまで別ドメインでサービス展開していてBのサイトのキャッシュ分が設定していたメモリから溢れてしまい設定変更をしたい場合でも他のサービスに影響がでないなどメリットはあります。
噂で聞いただけなので本当なのかはわかりませんが、複数サービスを一つのmemcachedで動かしていたら他のサービスのキャッシュを拾ってきてしまったなどがあるそうで、
ポート別にmemcachedを起動して利用すればその様なことも起こらなくなります。
ただ、デメリットとしては複数memcachedを起動することによりメモリの使用率が必然的に増えてしまいます。
またアプリケーションの設定もサービス毎に変更しなければならないので一手間かかります。

memcachedの起動スクリプトを見てみる

下記が起動スクリプトの一部です。

if [ -f /etc/sysconfig/memcached ];then
. /etc/sysconfig/memcached
fi

# Check that networking is up.
. /etc/sysconfig/network

if [ "$NETWORKING" = "no" ]
then
exit 0
fi

RETVAL=0
prog="memcached"
pidfile=${PIDFILE-/var/run/memcached/memcached.pid}
lockfile=${LOCKFILE-/var/lock/subsys/memcached}

水色の部分が異なれば複数起動できます。
今回は11211、11212、11213のポートで起動するmemcachedを作成します。
複数起動するために準備します

複数プロセスで起動する準備をする

# cp -p /var/run/memcached/memcached.pid /var/run/memcached/memcached_11212.pid
# cp -p /var/run/memcached/memcached.pid /var/run/memcached/memcached_11213.pid
# cp -p /etc/sysconfig/memcached /etc/sysconfig/memcached_11212
# cp -p /etc/sysconfig/memcached /etc/sysconfig/memcached_11213
# cp -p /etc/rc.d/init.d/memcached /etc/rc.d/init.d/memcached_11212
# cp -p /etc/rc.d/init.d/memcached /etc/rc.d/init.d/memcached_11213

/var/run/memcached/memcached.pidは変更する必要なし


pidは起動時のプロセスIDが入るだけなので変更する必要はありません。プロセス毎にpidが必要なので用意は必要です。複数プロセスを一つのpidファイルにまとめることはできないので。
ここで編集が必要なファイルは/etc/sysconfig/memcached_11212と/etc/sysconfig/memcached_11213になります。
この2つはポートを書き換えるだけなので簡単です。

/etc/sysconfig/memcached_11212のサンプル


下記に/etc/sysconfig/memcached_11212のサンプルを示します。
11213はPORTのところを変更するだけです。

PORT="11212"
USER="root"
MAXCONN="1024"
CACHESIZE="256"
OPTIONS="-vv 1>> /var/log/memcached_11212.log 2>> /var/log/memcached_11212.log"

PORTはデフォルトのポートとは異なるポートを指定します。今回は11212です
USERはrootにしてrootユーザで起動するようにします(ここはmemcachedでも大丈夫です)。
MACCONNは最大のコネクション数です。1024はデフォルト値です。yumで入るバージョンだと大量コネクションが発生するとmemcachedが再起動するとかしないとかmixiの大規模障害の時に話がありましたね。
1.4.6ではバグが修正されているそうです
CACHESIZEは一つのプロセスで保有できる最大のキャッシュサイズを指定します。32bitOSでは3GBまでしか指定できません。指定しても利用できないが正しい言い方ですかね。
メモリの確保についてはmemcachedのメモリ確保についてがわかりやすそうです
OPTIONSではmemcachedのログを取るようにしています。

ポート別の起動スクリプトを作成します


元々あった起動スクリプトにそれ様に作成したファイルを入れてあげるだけです

 # vim /etc/rc.d/init.d/memcached_11212

#! /bin/sh
. /etc/init.d/functions

if [ -f /etc/sysconfig/memcached_11212 ];then
. /etc/sysconfig/memcached_11212
fi

. /etc/sysconfig/network

if [ "$NETWORKING" = "no" ]
then
exit 0
fi

RETVAL=0
prog="memcached"
pidfile=${PIDFILE-/var/run/memcached/memcached_11212.pid}
lockfile=${LOCKFILE-/var/lock/subsys/memcached}

start () {
echo -n $"Starting $prog: "
# Ensure that /var/run/memcached has proper permissions
if [ "`stat -c %U /var/run/memcached`" != "$USER" ]; then
chown $USER /var/run/memcached
fi

daemon --pidfile ${pidfile} memcached -d -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} /usr/bin/memcached
RETVAL=$?
echo
if [ $RETVAL -eq 0 ] ; then
rm -f ${lockfile} ${pidfile}
fi
}

restart () {
stop
start
}

case "$1" in
start)
start
;;
stop)
stop
;;
status)
status -p ${pidfile} memcached
RETVAL=$?
;;
restart|reload|force-reload)
restart
;;
condrestart|try-restart)
[ -f ${lockfile} ] && restart || :
;;
*)
echo $"Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart|try-restart}"
RETVAL=2
;;
esac

exit $RETVAL

これで手順完了です

後は通常通り起動する


普通に起動スクリプトから起動します

# /etc/rc.d/init.d/memcached start
# /etc/rc.d/init.d/memcached_11212 start
# /etc/rc.d/init.d/memcached_11213 start

起動するとそれぞれのプロセスが起動していると思いますpsで起動しているか確認してみます

# ps auxfwww
root 2244 0.0 0.0 69016 856 ? Ssl 18:12 0:00 memcached -d -p 11211 -u root -m 256 -c 1024 -P /var/run/memcached/memcached.pid -vv
root 2199 0.0 0.0 69016 848 ? Ssl 18:12 0:00 memcached -d -p 11212 -u root -m 256 -c 1024 -P /var/run/memcached/memcached_11212.pid -vv
root 2226 0.0 0.0 69016 844 ? Ssl 18:12 0:00 memcached -d -p 11213 -u root -m 256 -c 1024 -P /var/run/memcached/memcached_11213.pid -vv