memcachedを複数起動する場合のinit.dの書き方

July 5, 2012,
tags: centos memcached


このエントリーをはてなブックマークに追加

CentOS系でmemcachedを1つのサーバの中で複数起動したい場合ってありますよね。
とくに開発サーバの場合は…もうね…

んで、/etc/init.d/memcachedをコピーして/etc/init.d/memcached2でもつくって設定入れ替えればいいとおもいました。
でもなぜかコピペしてもうまくいかなかった…

もう諦めてたところで、弊社の優秀なエンジニアが/etc/init.d/memcached2でmemcachedのインスタンスが起動しない理由を突き止めてくれました!
原因は/etc/sysconfig/memcachedをmemcached2で読んでしまっていただけなんですが・・・

もうね、気づけよと…動くようにしてもらって嬉しかったけど、自分のコード読む力にがっかりしてしまいました。

でもよーく考えたら今後、また別でmemcached立ち上げたいときにcpしてmemcached3とかmemcached4とか増やして行くのはイケないよね?
ってことで、シェルスクリプトになれる意味合いも込めて簡単にmemcachedを複数起動できるように起動スクリプトを修正しました。

/etc/init.d/memcached

#! /bin/sh
#
# chkconfig: - 55 45
# description:  The memcached daemon is a network memory cache service.
# processname: memcached
# config: /etc/sysconfig/memcached
# pidfile: /var/run/memcached/memcached.pid

# Standard LSB functions
#. /lib/lsb/init-functions

# Source function library.
. /etc/init.d/functions

PORT=11211
USER=memcached
MAXCONN=1024
CACHESIZE=64
OPTIONS=""

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}

## 追記個所 ##
if [ $# -eq 2 ] ; then
    if [ `echo $2|grep -c '[2-9][0-9]*'` -eq 1 ] ; then

        if [ -f /etc/sysconfig/memcached${2} ];then
            . /etc/sysconfig/memcached${2}
        else
            PORT=`expr $PORT + $2`
        fi  

        pidfile=${PIDFILE-/var/run/memcached/memcached${2}.pid}
        lockfile=${LOCKFILE-/var/lock/subsys/memcached}${2}
    fi  
fi


start () {
    echo -n $"Starting $prog: port $PORT"
    # 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
}


# See how we were called.
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  
</pre>

「## 追記個所 ##」とコメントがついている部分を見れば分かると思いますが、一応使い方はこんな感じです。

<pre># 1つめ起動
/etc/init.d/memcached start

# 2つめ起動...
/etc/initd.d/memcached start 2

# 3台目起動...
/etc/initd.d/memcached start 3

実際に動いているか見てみる

[polidog@www]~% ps aux | grep memcached
103      27513  0.0  0.0  69004   768 ?        Ssl  04:15   0:00 memcached -d -p 11211 -u memcached -m 64 -c 1024 -P /var/run/memcached/memcached.pid
103      27661  0.0  0.0  69004   768 ?        Ssl  04:20   0:00 memcached -d -p 11214 -u memcached -m 64 -c 1024 -P /var/run/memcached/memcached3.pid
103      27690  0.0  0.0 199772   788 ?        Ssl  04:20   0:00 memcached -d -p 11222 -u memcached -m 64 -c 1024 -P /var/run/memcached/memcached2.pid
polidog  28611  0.0  0.0  65412   824 pts/0    S+   04:41   0:00 grep memcached

てな具合に2番目の引数に数値を渡してあげればいいだけです。
デフォルトだと/etc/sysconfig/memcachedに記載されているポート番号に第二引数の数値を足したものがポート番号になります。
ただ、明らかに違うポートとかメモリ量を変更したい場合は、「/etc/sysconfig/memcached2」とか第二引数の番号にあわせたファイルを作っていただいて、そこに設定書けば細かく調整できます!

comments powered by Disqus