2013年1月23日水曜日

複数プロセスの起動

memcachedの複数プロセスでの起動を行いたいと思います。

■複数プロセスにするメリット・デメリットについて
メリット
・各サービスごとに領域を分けて使えて、管理が行える。(キャッシュのリセットなど)
・キャッシュ領域の上限に達した場合に、領域確保のため自動で消される場合に、別サービスのキャッシュを消してしまう可能性がなくなる?

デメリット
・メモリの使用率が増えてしまう。
・サービス単位でmemcachedサーバーが必要になる。

弊社では、セッション用、有効期限が短期間、有効期限が長期間用、永続性が必要なもの、
という風にキャッシュの領域を分けて利用しています。

それでは設定を行っていきたいと思います(`・ω・´)シャキーン

■手順1)複数プロセス用に設定ファイルを複製する
#デフォルトの設定ファイルをバックアップとしてとっておく
cp -p /etc/sysconfig/memcached /etc/sysconfig/memcached.backup

#各プロセス用の設定ファイルを保存するディレクトリを作成する
mkdir /etc/sysconfig/memcached

#デフォルトの設定ファイルをコピーする。(ファイル名は利用するポート番号にしてあります)
cp -p /etc/sysconfig/memcached.backup /etc/sysconfig/memcached/11212
cp -p /etc/sysconfig/memcached.backup /etc/sysconfig/memcached/11213
11212の設定ファイルを編集する
vi /etc/sysconfig/memcached/11212
#ポート番号
PORT="11212"
#実行ユーザー
USER="memcached"
#最大同時接続数(デフォルト1024)
MAXCONN="1024"
#利用するメモリサイズ(単位はMB)32bitでは3GBまでしか有効にならない。
CACHESIZE="64"
#オプション
#
OPTIONS="-d -vv 1>> /var/log/memcached/11212.log 2>> /var/log/memcached/11212.log"
11213の設定ファイルを編集する
vi /etc/sysconfig/memcached/11213
#ポート番号
PORT="11213"
#実行ユーザー
USER="memcached"
#最大同時接続数(デフォルト1024)
MAXCONN="1024"
#利用するメモリサイズ(単位はMB)32bitでは3GBまでしか有効にならない。
CACHESIZE="64"
#オプション
#
OPTIONS="-d -vv 1>> /var/log/memcached/11213.log 2>> /var/log/memcached/11213.log"
ログファイル用のディレクトリ作成
#
mkdir /var/log/memcached

#権限を付与
chmod 777 /var/log/memcached/
■手順2)起動スクリプトを作成する

デフォルトの起動スクリプトを変更して、
起動や停止時のコマンドを実行する際に、
ポート番号を指定することで、指定されたポート番号で起動しているmemcachedのみを
対象に実行するようにしました( ̄ー ̄)ニヤリ
#デフォルトの起動スクリプトをコピーする
cp -p /etc/init.d/memcached /etc/init.d/memcached-multi
/etc/init.d/memcached-multiを作成する
#新規作成
vi /etc/init.d/memcached-multi
#! /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=""

#コマンド引数の第2引数の値(ポート番号)が数値かチェック
arg1=${2}
expect_empty=`echo -n ${arg1} | sed 's/[0-9]//g'`
if [ "x" = "x${arg1}" ] || [ "x" != "x${expect_empty}" ]
then
        echo "ポート番号には数値のみ指定が行えます。(デフォルト:11211)"
        exit 0
else
        PORT=$2
fi

#ポート番号ごとに振り分けた設定ファイルが置かれているディレクトリのパスを指定
PATH_CONFIG_BASE=/etc/sysconfig/memcached/
#利用される設定ファイルのパス
FILE_CONFIG=${PATH_CONFIG_BASE}${PORT}

#設定ファイルのチェック
if [ -f ${FILE_CONFIG} ];then
        . ${FILE_CONFIG}
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_${PORT}.pid}
lockfile=${LOCKFILE-/var/lock/subsys/memcached_${PORT}}

#echo $FILE_CONFIG
#echo $pidfile
#echo $lockfile

start () {
        echo -n $"Starting $prog: "
        # Ensure that $pidfile directory has proper permissions and exists
        piddir=`dirname $pidfile`
        if [ ! -d $piddir ]; then
                mkdir $piddir
        fi
        if [ "`stat -c %U $piddir`" != "$USER" ]; then
                chown $USER $piddir
        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
■手順3)起動してみる。
11212ポート番号でプロセスを起動して、確認する
#起動
/etc/init.d/memcached-multi start 11212
memcached を起動中:                                        [  OK  ]

#pidの確認
ls -alt /var/run/memcached/
合計 16
drwxr-xr-x  2 memcached memcached 4096  1月 23 13:04 2013 .
-rw-r--r--  1 memcached memcached    6  1月 23 13:04 2013 memcached_11212.pid

#lockfileの確認
ls -alt /var/lock/subsys/memcached*
-rw-r--r-- 1 root root 0  1月 23 13:04 2013 /var/lock/subsys/memcached_11212
11213ポート番号でプロセスを起動して、確認する
#起動
/etc/init.d/memcached-multi start 11213
memcached を起動中:                                        [  OK  ]

#
ls -alt /var/run/memcached/
合計 20
drwxr-xr-x  2 memcached memcached 4096  1月 23 13:07 2013 .
-rw-r--r--  1 memcached memcached    6  1月 23 13:07 2013 memcached_11213.pid
-rw-r--r--  1 memcached memcached    6  1月 23 13:04 2013 memcached_11212.pid
drwxr-xr-x 17 root      root      4096  1月 22 13:32 2013 ..
#
ls -alt /var/lock/subsys/memcached*
-rw-r--r-- 1 root root 0  1月 23 13:07 2013 /var/lock/subsys/memcached_11213
-rw-r--r-- 1 root root 0  1月 23 13:04 2013 /var/lock/subsys/memcached_11212
■手順4)接続を試してみる。
#11212ポート番号の接続確認を行う
telnet localhost 11212
Trying ::1...
Connected to localhost.
Escape character is '^]'.
quit
Connection closed by foreign host.

#11213ポート番号の接続確認を行う
telnet localhost 11213
Trying ::1...
Connected to localhost.
Escape character is '^]'.
quit
Connection closed by foreign host.
■手順5)外部からの接続確認を行う。
前回の記事の手順で設定を行っている場合には、
iptablesで接続元のIPアドレス制限と、11211のポート番号しか開放していないので、
今回設定した11212,11213ポート番号の開放も行うこと。
#プロトコルがtcpで、ポート番号が11211、送信元の接続開始パケット(新規接続)を許可
-A INPUT -p tcp -m state --state NEW -m tcp --dport 11211 -s memcachedに接続するサーバーIPアドレス -j ACCEPT
↓変更
#プロトコルがtcpで、ポート番号が11211から11219までの連番、送信元の接続開始パケット(新規接続)を許可
-A INPUT -p tcp -m state --state NEW -m tcp --dport 11211:11219 -s memcachedに接続するサーバーIPアドレス -j ACCEPT
接続の確認を行う。
$ telnet memcachedサーバーのIPアドレス 11212
Trying ***.***.***.**...
Connected to ***.***.***.**.
Escape character is '^]'.
quit
Connection closed by foreign host.

$ telnet memcachedサーバーのIPアドレス 11213
Trying ***.***.***.**...
Connected to ***.***.***.**.
Escape character is '^]'.
quit
Connection closed by foreign host.
■手順6)自動起動設定用のシェルスクリプト作成

いつも通りに、chkconfigを使って自動起動設定を行いたいところですが、
今回作成した/etc/init.d/memcached-multiでは実行時にポート番号を指定しないといけないので、
別のやりかたで登録する必要があります。
(memcached-multiの中に使用するポート番号の一覧などを持たせてしまい、
ループなどで複数起動できるようにしてしまえば
chkconfig memcached-mulit onだけでいける気がしますが・・・:(;゙゚'ω゚'):)

chkconfigを使わずにLinuxは起動時に独自のプログラムを実行させたい場合には、
「etc/rc.d/rc.local」ファイルに起動コマンドに実行したいコマンドを記述すれば(・∀・)イイ!!

そのまえに、複数プロセスを起動するだけのシェルスクリプトを作っておきます。
#新規作成
vi /root/memcached-multi.sh
#############################
#
# memcachedの複数プロセス起動用シェル
# (OS起動時にも実行される)
#
#############################
#!/bin/sh

#11212ポート番号でプロセスを起動する
/etc/init.d/memcached-multi $1 11212

#11213ポート番号でプロセスを起動する
/etc/init.d/memcached-multi $1 11213
ファイルに実行権限を与えて、正しく動くか確認する。
#実行権限を与える
chmod +x /root/memcached-multi.sh

#複数プロセスの停止の確認
/root/memcached-multi.sh stop
memcached を停止中:                                        [  OK  ]
memcached を停止中:                                        [  OK  ]

#プロセスの確認
# ps axu|grep memcached
root     28322  0.0  0.0 107456   936 pts/0    S+   14:49   0:00 grep memcached

#複数プロセスの開始の確認
# /root/memcached-multi.sh start
memcached を起動中:                                        [  OK  ]
memcached を起動中:                                        [  OK  ]

#プロセスの確認
# ps axu|grep memcached
497      28334  0.0  0.0 339964  1236 ?        Ssl  14:50   0:00 memcached -d -p 11212 -u memcached -m 64 -c 1024 -P /var/run/memcached/memcached_11212.pid -d -vv
497      28351  0.0  0.0 339964  1244 ?        Ssl  14:50   0:00 memcached -d -p 11213 -u memcached -m 64 -c 1024 -P /var/run/memcached/memcached_11213.pid -d -vv
root     28359  0.0  0.0 107456   940 pts/0    S+   14:50   0:00 grep memcached
■手順7)OS動時に手順6で作成したシェルスクリプトが実行されるようにする。
/etc/rc.d/rc.localを編集または新規作成
vi /etc/rc.d/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local

#memcached-multi自動起動用スクリプトの実行
/root/memcached-multi.sh start
以上(`・ω・´)ゞビシッ!!

後は、OSの再起動を行ってみて自動で起動しているか確認してみる(ΦωΦ)フフフ…

参考URL

0 件のコメント:

コメントを投稿