Hatena::ブログ(Diary)

ヌキのやる気のないエンジニアブログ このページをアンテナに追加 RSSフィード Twitter

ヌキはLinuxサーバをメインに生活しています。 
技術力はただのにわかレベルなので期待しないでください。




2011-12-11

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

環境

  • CentOS 5.7 x86_64
  • memcached 1.4.5 (yum install)

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

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/editnuki/20111211/1323599116