MoxiでElastiCacheのノードをまとめてみたの記事でMoxiでElastiCacheのノードをまとめるところまでできたので、
ElastiCacheのクラスタ情報を取得してみた(Auto Discovery)の記事でAuto Discoveryと組み合わせて、
Moxi起動時にクラスタ内のすべてのノードが対象になるような起動スクリプトを作ってみました。

実際のスクリプトは少し長いので最後に掲載します。
まずは挙動の確認です。

・Moxiを起動して登録してあるElastiCacheノードを確認

# service moxi-elasticache start
Starting moxi server [ OK ]
# echo stats proxy config | nc localhost 11211
STAT 11211:default:config test.xxxxxx.0001.apne1.cache.amazonaws.com:11211,test.xxxxxx.0002.apne1.cache.amazonaws.com:11211,test.xxxxxx.0003.apne1.cache.amazonaws.com:11211
END

上記のように、いくつか登録されています。

・ElastiCacheのノードを追加してMoxiをリスタートして登録ノードの確認

# service moxi-elasticache restart
Stopping moxi server [ OK ]
Starting moxi server [ OK ]
# echo stats proxy config | nc localhost 11211
STAT 11211:default:config test.xxxxxx.0001.apne1.cache.amazonaws.com:11211,test.xxxxxx.0002.apne1.cache.amazonaws.com:11211,test.xxxxxx.0003.apne1.cache.amazonaws.com:11211,test.xxxxxx.0004.apne1.cache.amazonaws.com:11211
END

増えていることが確認できます。

・ElastiCacheのノードを削除してMoxiをリスタートして登録ノードの確認

# service moxi-elasticache restart
Stopping moxi server [ OK ]
Starting moxi server [ OK ]
# echo stats proxy config | nc localhost 11211
STAT 11211:default:config test.xxxxxx.0001.apne1.cache.amazonaws.com:11211
END

減っていることが確認できます。

下記が実際のスクリプトになります。

# cat /etc/sysconfig/moxi-elasticache
MOXI_PORT=11211
ELASTICACHE_CONFIG_NODE=test.xxxxxx.cfg.apne1.cache.amazonaws.com
ELASTICACHE_CONFIG_PORT=11211
# cat /etc/init.d/moxi-elasticache 
#!/bin/sh

# Source Function Library
. /etc/init.d/functions

# System Variable
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DAEMON=/opt/moxi/bin/moxi
PIDFILE=/var/run/moxi-server.pid

# User Variavle
MOXI_PORT=11211
ELASTICACHE_CONFIG_NODE=localhost
ELASTICACHE_CONFIG_PORT=11211

# Source Config
if [ -f /etc/sysconfig/${0##*/} ] ; then
. /etc/sysconfig/${0##*/}
fi

MOXI_CLUSTER_CFG=$MOXI_PORT=

test -f $DAEMON || exit 0

discover() {
LINE=`echo config get cluster | nc $ELASTICACHE_CONFIG_NODE $ELASTICACHE_CONFIG_PORT | head -3 | tail -1`
COUNT=`echo $LINE | tr -dc ' ' | wc -c`
COUNT=`expr $COUNT + 1`
for INDEX in `seq 1 $COUNT`; do
NODE=`echo $LINE | cut -d ' ' -f $INDEX`
HOST=`echo $NODE | cut -d '|' -f 1`
PORT=`echo $NODE | cut -d '|' -f 3`
if [ $INDEX -ne 1 ]; then
MOXI_CLUSTER_CFG=$MOXI_CLUSTER_CFG,
fi
MOXI_CLUSTER_CFG=$MOXI_CLUSTER_CFG$HOST:$PORT
done
}

start() {
touch $PIDFILE
chown moxi $PIDFILE
cd /var/run
ulimit -n 10240
ulimit -c unlimited
discover
daemon "/bin/su -c "$DAEMON -d -P $PIDFILE -z $MOXI_CLUSTER_CFG" moxi"
errcode=$?
return $errcode
}

stop() {
killproc -p $PIDFILE $DAEMON
errcode=$?
rm -f $PIDFILE
return $errcode
}

running() {
pidofproc -p $PIDFILE $DAEMON >/dev/null
errcode=$?
return $errcode
}

case $1 in
start)
if running ; then
warning && echo "moxi server is already started"
exit 0
fi
echo -n $"Starting moxi server"
start
echo
;;
stop)
echo -n $"Stopping moxi server"
stop
echo
;;
restart)
echo -n $"Stopping moxi server"
stop
echo
echo -n $"Starting moxi server"
start
echo
;;
status)
if running ; then
echo "moxi server is running"
exit 0
else
echo "moxi server is not running"
exit 3
fi
;;
*)
echo "Usage: /etc/init.d/moxi-server {start|stop|restart|status}" >&2
exit 3
esac

複数クラスタにも対応したいと考えています。

こちらの記事はなかの人(suz-lab)監修のもと掲載しています。
元記事は、こちら