2011-02-02

Tokyo Tyrant ttexpire.lua

function expire()
   local args = {}
   local cdate = string.format("%d", _time())
   table.insert(args, "addcond\0x\0NUMLE\0" .. cdate)
   table.insert(args, "out")
   local res = _misc("search", args)
   if not res then
      _log("expiration was failed", 2)
   end
   print("rnum=" .. _rnum() .. "  size=" .. _size())
end

Tokyo Tyrant 起動スクリプト スレーブ

#! /bin/sh
# chkconfig: 345 65 55
# description: Startup script for the server of Tokyo Tyrant For Session
# processname: tokyotyrant

#----------------------------------------------------------------
# Startup script for the server of Tokyo Tyrant
#----------------------------------------------------------------


# configuration variables
prog="ttservctl"
cmd="ttserver"
basedir="/home/ttserver/data"
port="1978"
pidfile="$basedir/ttserver.pid"
logfile="$basedir/ttserver.log"
ulogdir="$basedir/ulog"
ulimsiz="256m"
sid=2
mhost="remotehost1"
mport="1978"
rtsfile="$basedir/ttserver.rts"
dbname="$basedir/session.tct#bnum=1000000#idx=x:dec#dfunit=8"
ext="/home/ttserver/ext/ttexpire.lua"
extpc="expire 1"
maxcon="65535"
retval=0


# setting environment variables
LANG=C
LC_ALL=C
PATH="$PATH:/sbin:/usr/sbin:/usr/local/sbin:/usr/local/tokyotyrant/bin"
export LANG LC_ALL PATH


# start the server
start(){
  printf 'Starting the server of Tokyo Tyrant\n'
  mkdir -p "$basedir"
  if [ -z "$basedir" ] || [ -z "$port" ] || [ -z "$pidfile" ] || [ -z "$dbname" ] ; then
    printf 'Invalid configuration\n'
    retval=1
  elif ! [ -d "$basedir" ] ; then
    printf 'No such directory: %s\n' "$basedir"
    retval=1
  elif [ -f "$pidfile" ] ; then
    pid=`cat "$pidfile"`
    printf 'Existing process: %d\n' "$pid"
    retval=1
  else
    if [ -n "$maxcon" ] ; then
      ulimit -n "$maxcon" >/dev/null 2>&1
    fi
    cmd="$cmd -port $port -dmn -pid $pidfile"
    if [ -n "$logfile" ] ; then
      cmd="$cmd -log $logfile"
    fi
    if [ -n "$ulogdir" ] ; then
      mkdir -p "$ulogdir"
      cmd="$cmd -ulog $ulogdir"
    fi
    if [ -n "$ulimsiz" ] ; then
      cmd="$cmd -ulim $ulimsiz"
    fi
    if [ -n "$sid" ] ; then
      cmd="$cmd -sid $sid"
    fi
    if [ -n "$mhost" ] ; then
      cmd="$cmd -mhost $mhost"
    fi
    if [ -n "$mport" ] ; then
      cmd="$cmd -mport $mport"
    fi
    if [ -n "$rtsfile" ] ; then
      cmd="$cmd -rts $rtsfile"
    fi
    if [ -n "$ext" ] ; then
      cmd="$cmd -ext $ext"
    fi
    if [ -n "$extpc" ] ; then
      cmd="$cmd -extpc $extpc"
    fi
    printf "Executing: %s\n" "$cmd"
    cmd="$cmd $dbname"
    $cmd
    if [ "$?" -eq 0 ] ; then
      printf 'Done\n'
    else
      printf 'The server could not started\n'
      retval=1
    fi
  fi
}


# stop the server
stop(){
  printf 'Stopping the server of Tokyo Tyrant\n'
  if [ -f "$pidfile" ] ; then
    pid=`cat "$pidfile"`
    printf "Sending the terminal signal to the process: %s\n" "$pid"
    kill -TERM "$pid"
    c=0
    while true ; do
      sleep 0.1
      if [ -f "$pidfile" ] ; then
        c=`expr $c + 1`
        if [ "$c" -ge 100 ] ; then
          printf 'Hanging process: %d\n' "$pid"
          retval=1
          break
        fi
      else
        printf 'Done\n'
        break
      fi
    done
  else
    printf 'No process found\n'
    retval=1
  fi
}


# send HUP to the server for log rotation
hup(){
  printf 'Sending HUP signal to the server of Tokyo Tyrant\n'
  if [ -f "$pidfile" ] ; then
    pid=`cat "$pidfile"`
    printf "Sending the hangup signal to the process: %s\n" "$pid"
    kill -HUP "$pid"
    printf 'Done\n'
  else
    printf 'No process found\n'
    retval=1
  fi
}


# check permission
if [ -d "$basedir" ] && ! touch "$basedir/$$" >/dev/null 2>&1
then
  printf 'Permission denied\n'
  exit 1
fi
rm -f "$basedir/$$"


# dispatch the command
case "$1" in
start)
  start
  ;;
stop)
  stop
  ;;
restart)
  stop
  start
  ;;
hup)
  hup
  ;;
*)
  printf 'Usage: %s {start|stop|restart|hup}\n' "$prog"
  exit 1
  ;;
esac


# exit
exit "$retval"



# END OF FILE

Tokyo Tyrant 起動スクリプト マスタ

#! /bin/sh
# chkconfig: 345 65 55
# description: Startup script for the server of Tokyo Tyrant For Session
# processname: tokyotyrant

#----------------------------------------------------------------
# Startup script for the server of Tokyo Tyrant
#----------------------------------------------------------------


# configuration variables
prog="ttservctl"
cmd="ttserver"
basedir="/home/ttserver/data"
port="1978"
pidfile="$basedir/ttserver.pid"
logfile="$basedir/ttserver.log"
ulogdir="$basedir/ulog"
ulimsiz="256m"
sid=1
mhost="remotehost2"
mport="1978"
rtsfile="$basedir/ttserver.rts"
dbname="$basedir/session.tct#bnum=1000000#idx=x:dec#dfunit=8"
ext="/home/ttserver/ext/ttexpire.lua"
extpc="expire 1"
maxcon="65535"
retval=0


# setting environment variables
LANG=C
LC_ALL=C
PATH="$PATH:/sbin:/usr/sbin:/usr/local/sbin:/usr/local/tokyotyrant/bin"
export LANG LC_ALL PATH


# start the server
start(){
  printf 'Starting the server of Tokyo Tyrant\n'
  mkdir -p "$basedir"
  if [ -z "$basedir" ] || [ -z "$port" ] || [ -z "$pidfile" ] || [ -z "$dbname" ] ; then
    printf 'Invalid configuration\n'
    retval=1
  elif ! [ -d "$basedir" ] ; then
    printf 'No such directory: %s\n' "$basedir"
    retval=1
  elif [ -f "$pidfile" ] ; then
    pid=`cat "$pidfile"`
    printf 'Existing process: %d\n' "$pid"
    retval=1
  else
    if [ -n "$maxcon" ] ; then
      ulimit -n "$maxcon" >/dev/null 2>&1
    fi
    cmd="$cmd -port $port -dmn -pid $pidfile"
    if [ -n "$logfile" ] ; then
      cmd="$cmd -log $logfile"
    fi
    if [ -n "$ulogdir" ] ; then
      mkdir -p "$ulogdir"
      cmd="$cmd -ulog $ulogdir"
    fi
    if [ -n "$ulimsiz" ] ; then
      cmd="$cmd -ulim $ulimsiz"
    fi
    if [ -n "$sid" ] ; then
      cmd="$cmd -sid $sid"
    fi
    if [ -n "$mhost" ] ; then
      cmd="$cmd -mhost $mhost"
    fi
    if [ -n "$mport" ] ; then
      cmd="$cmd -mport $mport"
    fi
    if [ -n "$rtsfile" ] ; then
      cmd="$cmd -rts $rtsfile"
    fi
    if [ -n "$ext" ] ; then
      cmd="$cmd -ext $ext"
    fi
    if [ -n "$extpc" ] ; then
      cmd="$cmd -extpc $extpc"
    fi
    printf "Executing: %s\n" "$cmd"
    cmd="$cmd $dbname"
    $cmd
    if [ "$?" -eq 0 ] ; then
      printf 'Done\n'
    else
      printf 'The server could not started\n'
      retval=1
    fi
  fi
}


# stop the server
stop(){
  printf 'Stopping the server of Tokyo Tyrant\n'
  if [ -f "$pidfile" ] ; then
    pid=`cat "$pidfile"`
    printf "Sending the terminal signal to the process: %s\n" "$pid"
    kill -TERM "$pid"
    c=0
    while true ; do
      sleep 0.1
      if [ -f "$pidfile" ] ; then
        c=`expr $c + 1`
        if [ "$c" -ge 100 ] ; then
          printf 'Hanging process: %d\n' "$pid"
          retval=1
          break
        fi
      else
        printf 'Done\n'
        break
      fi
    done
  else
    printf 'No process found\n'
    retval=1
  fi
}


# send HUP to the server for log rotation
hup(){
  printf 'Sending HUP signal to the server of Tokyo Tyrant\n'
  if [ -f "$pidfile" ] ; then
    pid=`cat "$pidfile"`
    printf "Sending the hangup signal to the process: %s\n" "$pid"
    kill -HUP "$pid"
    printf 'Done\n'
  else
    printf 'No process found\n'
    retval=1
  fi
}


# check permission
if [ -d "$basedir" ] && ! touch "$basedir/$$" >/dev/null 2>&1
then
  printf 'Permission denied\n'
  exit 1
fi
rm -f "$basedir/$$"


# dispatch the command
case "$1" in
start)
  start
  ;;
stop)
  stop
  ;;
restart)
  stop
  start
  ;;
hup)
  hup
  ;;
*)
  printf 'Usage: %s {start|stop|restart|hup}\n' "$prog"
  exit 1
  ;;
esac


# exit
exit "$retval"



# END OF FILE

Tokyo Tyrant インストール

ソースコード取得。
# cd /usr/local/src
# wget http://1978th.net/tokyocabinet/tokyocabinet-1.4.9.tar.gz
# wget http://1978th.net/tokyotyrant/tokyotyrant-1.1.40.tar.gz
TokyoCabinetインストール。
# tar zxvf ./tokyocabinet-1.4.9.tar.gz
# cd tokyocabinet-1.4.9
# ./configure
# make
# make install
TokyoTyrantインストール。
# tar zxvf tokyotyrant-1.1.40.tar.gz
# cd tokyotyrant-1.1.40
# ./configure
# make
# make install
Tokyo Tyrantの起動スクリプトに以下を追加。
# vi /usr/local/tokyotyrant/sbin/ttservctl

# chkconfig: 345 65 55
# description: Startup script for the server of Tokyo Tyrant
# processname: tokyotyrant
/etc/init.dにリンクを作ってchkconfigに登録&確認。
# ln -s /usr/local/tokyotyrant/sbin/ttservctl /etc/init.d/
# chkconfig --add ttservctl
# chkconfig --list ttservctl
ttservctl       0:off   1:off   2:off   3:on    4:on    5:on    6:off

logrotateに登録。
/home/ttserver/data/ttserver.logにTokyo Tyrantのログが書き出されますが、放置しておくと肥大化します。
そのため、ログをローテーションする仕組みに任せてます。
Tokyo Tyrantの起動停止スクリプトがHUPをフォローしてくれているので、これだけでOK。
ここまでやっておけば、永続化機能のついた、OSごと再起動が掛かっても勝手に復活するようになります。
# vi /etc/logrotate.d/tokyotyrant
  
/home/ttserver/data/ttserver.log {
    monthly
    missingok
    rotate 12
    compress
    ifempty
    create
    sharedscripts
    postrotate
        /sbin/service ttservctl hup > /dev/null 2>/dev/null || true
    endscript
}
参考サイト