はじめに
td-agentを使ってみてから結構経ちました。
だんだん記憶から消えていきそうな自分の脳みそのために本番サービスに入れてみた時にやったことをメモっておくメモです
ってことで、まずはその①です
td-agentの導入とかはこちら
→fluentd(td-agent)使ってサーバ間でjsonログを転送してみる&詳細ログも出してみるテスト
補足
そんなにテクニカルでも有用でもないカモですがこちらにメモまとめをメモっておきました →td-agent(fluentd)を本番サ―ビスで小さく使ってみたメモ-まとめ
想定
よくあるこんな構成だった場合の話です
webサーバ、ログサーバともにdev(開発)、stg(ステージング)、prd(本番)の環境があり
devでtd-agentの挙動を試してconfigをstg、prdにデプロイする
サーバ | 説明 | 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の運用についてこんな感じの要件を想定しました
やったこと
ってことで「こんな用件を想定」より
って感じで進めてみました
/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」とか出るようになって安心!