2013年2月20日水曜日

Moxi起動時に"Auto Discovery"でElastiCacheのクラスタ内のノードを自動的に登録してみた

スズキです。

下記でMoxiでElastiCacheのノードをまとめるところまでできたので、
MoxiでElastiCacheのノードをまとめてみた
下記の"Auto Discovery"と組み合わせて、
ElastiCacheのクラスタ情報を取得してみた(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

複数クラスタにも対応したい...
--------
http://www.suz-lab.com

0 コメント: