読者です 読者をやめる 読者になる 読者になる

tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

td-agent(fluentd)を本番サービスで小さく使ってみたメモ①-dev、ステージング、本番でconfig分けたい

はじめに

td-agentを使ってみてから結構経ちました。
だんだん記憶から消えていきそうな自分の脳みそのために本番サービスに入れてみた時にやったことをメモっておくメモです

ってことで、まずはその①です
td-agentの導入とかはこちら
fluentd(td-agent)使ってサーバ間でjsonログを転送してみる&詳細ログも出してみるテスト

補足

そんなにテクニカルでも有用でもないカモですがこちらにメモまとめをメモっておきました →td-agent(fluentd)を本番サ―ビスで小さく使ってみたメモ-まとめ

想定

よくあるこんな構成だった場合の話です
webサーバ、ログサーバともにdev(開発)、stg(ステージング)、prd(本番)の環境があり
devでtd-agentの挙動を試してconfigをstg、prdにデプロイする

f:id:tweeeety:20140507222152p:plain

サーバ 説明 td-agent
web.dev webの開発環境 送信用td-agent
web.stg webのステージング環境 送信用td-agent
web.prd×n webの本番環境×n台 各webに送信用td-agent
log.dev logサーバの開発環境 受信td-agent
log.stg logサーバのステージング環境 受信用td-agent
log.prd logサーバの本番環境 受信用td-agent
こんな運用要件

configの運用についてこんな感じの要件を想定しました

  1. devで確認後、そのファイルをstgやprd用に書き換えてデプロイはNG
  2. web.dev、web.stg、web.prdそれぞれにdev、stg、prdのconfigが置いてありdeployツールなんかで「*(アスタリスク)指定」でデプロイできる
  3. web.devは本番昇格したり、web.prdが開発降格することもある
  4. webがlog、logがwebにはならない

やったこと

ってことで「こんな用件を想定」より

  • web系、log系それぞれにdev、stg、prdのconfigファイルを作る
  • td-agentの起動スクリプトを書き換えて環境(host)によってconfigを読み分けする

って感じで進めてみました

/etc/init.d/td-agentを書き換え

実際に書き換えた起動スクリプトがこんな感じです
スクリプトについての補足はソースのあとに補足します

#!/bin/bash
#
# /etc/rc.d/init.d/td-agent
#
# chkconfig: - 80 20
# description: td-agent
# processname: td-agent
# pidfile: /var/run/td-agent/td-agent.pid
#
### BEGIN INIT INFO
# Provides:          td-agent
# Default-Stop:      0 1 6
# Required-Start:    $local_fs
# Required-Stop:     $local_fs
# Short-Description: td-agent's init script
# Description:       td-agent is a data collector
### END INIT INFO

####################modify#
ulimit -n 65536

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

name="td-agent"
prog="td-agent"

td_agent=/usr/lib/fluent/ruby/bin/ruby
if [ -f "/usr/lib64/fluent/ruby/bin/ruby" ]; then
    td_agent=/usr/lib64/fluent/ruby/bin/ruby
fi

if [ -f /etc/sysconfig/$prog ]; then
    . /etc/sysconfig/$prog
fi

####################add#
hostname=`hostname -s`
if [[ $hostname =~ ^sv(log)??1$ ]]; then
    mode=dev
elif [[ $hostname =~ ^sv(log)??2$ ]]; then
    mode=stg
else
    mode=prd
fi
#echo $hostname
#echo $mode
#exit
CONFFILE=/etc/td-agent/${prog}-${mode}.conf
#add####################

PIDFILE=${PIDFILE-/var/run/td-agent/$prog.pid}
DAEMON_ARGS=${DAEMON_ARGS---user td-agent}
####################modify#
#TD_AGENT_ARGS="${TD_AGENT_ARGS-/usr/sbin/td-agent --group td-agent --log /var/log/td-agent/td-agent.log}"
TD_AGENT_ARGS="${TD_AGENT_ARGS-/usr/sbin/td-agent --group td-agent --log /var/log/td-agent/td-agent.log -vv}"

if [ -n "${PIDFILE}" ]; then
    mkdir -p $(dirname ${PIDFILE})
    chown -R td-agent:td-agent $(dirname ${PIDFILE})
    TD_AGENT_ARGS="${TD_AGENT_ARGS} --daemon ${PIDFILE}"
fi

# 2012/04/17 Kazuki Ohta <k@treasure-data.com>
# use jemalloc to avoid fragmentation
if [ -f "/usr/lib/fluent/jemalloc/lib/libjemalloc.so" ]; then
        export LD_PRELOAD=/usr/lib/fluent/jemalloc/lib/libjemalloc.so
fi
if [ -f "/usr/lib64/fluent/jemalloc/lib/libjemalloc.so" ]; then
        export LD_PRELOAD=/usr/lib64/fluent/jemalloc/lib/libjemalloc.so
fi

RETVAL=0

start() {
    ####################modify#
    #echo -n "Starting $name: "
    echo -n "Starting $name $mode: "
    daemon --pidfile=$PIDFILE $DAEMON_ARGS $td_agent "$TD_AGENT_ARGS"
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
    return $RETVAL
}

stop() {
    echo -n "Shutting down $name: "
    if [ -e "${PIDFILE}" ]; then
        killproc -p ${PIDFILE} || killproc $prog
    else
        killproc $prog
    fi
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && rm -f $PIDFILE && rm -f /var/lock/subsys/$prog
    return $RETVAL
}

restart() {
    configtest || return $?
    stop
    start
}

reload() {
    configtest || return $?
    ####################modify#
    #echo -n "Reloading $name: "
    echo -n "Shutting down $name $mode: "
    killproc $td_agent -HUP
    RETVAL=$?
    echo
}

configtest() {
    ####################modify#
    #/usr/sbin/td-agent --user td-agent --group td-agent --dry-run -q
    /usr/sbin/td-agent --user td-agent --group td-agent --dry-run -q -c $CONFFILE
}

case "$1" in
    start)
    start
    ;;
    stop)
    stop
    ;;
    restart)
    restart
    ;;
    reload)
    reload
    ;;
    condrestart)
    [ -f /var/lock/subsys/$prog ] && restart || :
    ;;
    configtest)
        configtest
        ;;
    status)
    status -p $PIDFILE 'td-agent'
    ;;
    *)
    echo "Usage: $prog {start|stop|reload|restart|condrestart|status|configtest}"
    exit 1
    ;;
esac
exit $?
  • 補足1

    ##############modify

    ##############add

    のコメントを追記した箇所が該当箇所です

  • 補足2

    host名については勝手につけた名前ですがこんなルールになってます
    ・ webサーバの場合はsv1~svNという連番
    ・ logサーバの場合はsvlog1~svlogNという連番
    ・ sv1、svlog1はdev
    ・ sv2、svlog2はstg
    ・ sv3~svN、svlog2~svlogNはprd

フォルダ構成&起動確認
※host名確認
# hostname -s
sv1

※configを環境に応じて作る
# tree /etc/td-agent
/etc/td-agent
|-- td-agent-dev.conf
|-- td-agent-prd.conf
`-- td-agent-stg.conf

※起動してみる
# sudo /etc/init.d/td-agent start
Starting td-agent dev:                                     [  OK  ]

※ログサーバも確認
# sudo ssh svlog1

# hostname -s
svlog1

※configを環境に応じて作る
# tree /etc/td-agent
/etc/td-agent
|-- td-agent-dev.conf
|-- td-agent-prd.conf
`-- td-agent-stg.conf

※起動してみる
# sudo /etc/init.d/td-agent start
Starting td-agent dev:                                     [  OK  ]

って感じで、
webサーバ、logサーバともにhost名に応じてconfigを読み分けられるようになりました。
起動時も「dev」とか出るようになって安心!