GlusterFSのログをrsyslogで転送したかった
GlusterFS動かしてたらログでdisk fullになってたのでrsyslogサーバを立ててそこにログを飛ばすことにします。
fluent?なにそれおいしいの?
結果から言うと、GlusterFSでsyslogを使う方法は見つけたものの
loggerコマンドでログが転送できてないので試せてないというヘタレっぷり。
誰か何か気付いたら教えてください...
あと以下ではfugahostからhogehostにログを転送するというシチュエーションです。
rsyslogサーバの構築 (hogehost)
$ sudo apt-get install rsyslog $ sudo sysv-rc-conf rsyslog on $ sudo service rsyslog start
syslogとかsyslog-ngとか動いてたらそれも止めること。
確認のため
$ logger hoge- $ tail /var/log/messages # hoge-って書き込まれてrsyslogがちゃんと動いてることを確認
とかやってみる。
「logger -p daemon.crit hoge-」とかしたら/var/log/daemon.logとかに書き込まれるらしいので注意。
rsyslogの設定はここを参考にした。
新世代syslogデーモン徹底活用(最終回):マクロを生かしたrsyslogの活用例 (2/2) - @IT
ログの転送設定 (GlusterFS on fugahost)
GlusterFSでsyslogを使うように設定する。
でも
man glusterとか
man glusterdとか
man glusterfsとか
man glusterfsdとか
見てもsyslogに出力する方法が書いてなくて
ググるとsyslogに出力したいんだけどって言ってるスレとか
2009年にsyslogサポートつけたよって言ってるスレを見つけたものの
ドキュメントがないのでしょうがなくパッチに書いてある引数見て/etc/init.d/glusterdいじってみようとするものの
とくにログ関係のオプション引数を渡してない。
これいじってもいいんだけどなんとなく外法な気がして
/etc/glusterdと/etc/glusterfsから関係ありそうなオプションを探す。
というか/etc/glusterdもいつのまにかできてたし
glusterコマンドから生成されたっぽくてそんならglusterコマンドで設定いじるのが正統派なのかなとか思ったり・・・ どれいじればええんや!
ここまで読んで気付いた人もいるでしょうがglusterコマンドとglusterdコマンドとglusterfsコマンドとglusterfsdコマンドのやってることがわかってません。
自分の環境ではこんな感じでした。これ以上のことは自分で調べて僕に教えてください。
$ for i in gluster{,d,fs,fsd}; do file /usr/sbin/$i; done /usr/sbin/gluster: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped /usr/sbin/glusterd: symbolic link to `glusterfsd' /usr/sbin/glusterfs: symbolic link to `glusterfsd' /usr/sbin/glusterfsd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped
まぁ考えても時間の無駄なので、(ソース読むのもたるいので)
/etc/init.d/glusterdいじる方法でいってみます。
というわけでいじりました。こんな感じ。
--- /etc/init.d/glusterd.orig 2011-11-14 10:48:30.000000000 +0900 +++ /etc/init.d/glusterd 2011-11-14 10:50:24.000000000 +0900 @@ -17,7 +17,7 @@ SCRIPTNAME=/etc/init.d/$NAME DAEMON=/usr/sbin/$NAME PIDFILE=/var/run/$NAME.pid -GLUSTERD_OPTS="" +GLUSTERD_OPTS="--log SYSLOG --log-syslog-host hogehost" PID=`test -f $PIDFILE && cat $PIDFILE`
いざ再起動!
$ sudo service glusterd restart Stopping glusterd service: glusterd. Starting glusterd service: glusterd/usr/sbin/glusterd: option '--log' is ambiguous Try `glusterd --help' or `glusterd --usage' for more information. failed! /usr/sbin/glusterd: option requires an argument -- 'f' Try `glusterd --help' or `glusterd --usage' for more information.
失敗した。なんか「--logってオプションないけど似たような名前のオプションならあるけどどれ?」って言われてる気がする。
いやあるから!と思ってバージョン確認。
$ sudo glusterd --version glusterfs 3.2.4 built on Sep 30 2011 20:21:50 Repository revision: git://git.gluster.com/glusterfs.git Copyright (c) 2006-2011 Gluster Inc. <http://www.gluster.com> GlusterFS comes with ABSOLUTELY NO WARRANTY. You may redistribute copies of GlusterFS under the terms of the GNU General Public License.
2011年9月にビルドしたとか書いてあるしないのはおかしい。
あれ2009年のパッチだったし。
というわけで結局ソース読むことに。
読んだ結果--xlator-optionに"trusted.glusterfs.syslog=true"を渡してやればいいっぽいので
--- /etc/init.d/glusterd.orig 2011-11-14 10:48:30.000000000 +0900 +++ /etc/init.d/glusterd 2011-11-14 10:50:24.000000000 +0900 @@ -17,7 +17,7 @@ SCRIPTNAME=/etc/init.d/$NAME DAEMON=/usr/sbin/$NAME PIDFILE=/var/run/$NAME.pid -GLUSTERD_OPTS="" +GLUSTERD_OPTS="--xlator-option 'trusted.glusterfs.syslog=true'" PID=`test -f $PIDFILE && cat $PIDFILE`
と書き換えて再起動。
$ sudo service glusterd restart Stopping glusterd service: glusterd. Starting glusterd service: glusterd.
大丈夫そう。
ログの転送設定 (rsyslog on fugahost)
*.* @@hogehost:514 # Specify spool directory $WorkDirectory /var/spool/rsyslog # Specify how to spool $ActionQueueType Disk # Retry count for forwarding log (-1 for unlimited) $ActionResumeRetryCount 5 # Filename of queue in spool directory $ActionQueueFileName queue # Save the queue in memory on shutdown $ActionQueueSaveOnShutdown on
rsyslogの設定はここを(ry
新世代syslogデーモン徹底活用(最終回):マクロを生かしたrsyslogの活用例 (2/2) - @IT
テスト
fugahostで以下のコマンドを実行するとhogehostにログが転送されるはず。
$ logger 'hello from fugahost'
結果: なぜか転送されない
ここからドはまりするので注意。ゴゴゴゴ・・・(何
なぜか転送されないよ?
あれ、でもfugahostでrsyslogをrestartした時の結果は転送されてる...
$ logger -p daemon.crit 'hello from fugahost'
とかやってもダメ。
$ ls -A /var/spool/rsyslog/
とかやっても何も表示されなくてスプールにたまってるわけでもない。
LXC上で動かしてるのでコンテナとハイパーバイザ両方で確認したけど
iptablesでブロックしてるわけでもない。
DNSを疑って/etc/rsyslog.confのホスト名をIPに変えたけどやっぱりできない。
しょうがないのでサーバ側で tcpdump -n port 514 してみると、
UDPだとちゃんとパケットが送られてることがわかった。
# /etc/rsyslog.conf *.* @@hogehost:514
を
# /etc/rsyslog.conf *.* @hogehost:514
にするとちゃんと送られていた。
...とか壮大な勘違いをしたけど全然関係なかった。
logger 'hoge'とかやっても即座に送られないのは syslogがバッファリングするためで、
sudo service rsyslog stopとかしてrsyslogが終了した時点で送られる。
■ディスクI/Oを制御できない
シスログを一元管理するような大規模運用では、書き込みタイミングを調整するなどディスクI/Oの制御が重要になりますが、syslogdにはI/Oに掛かる負荷を抑える手段がありません。
...(略)...
シスログを受け取る側が停止している間、出力側でバッファリングし、受け取る側が復旧した後でまとめてシスログを転送するといったことができません。
syslogdの問題点
ところが、その後オリジナルサイトのドキュメントの Global Directives に $ActionFileEnableSync というのがあって、デフォルトで Off になっていることを知って愕然。
rsyslog でバッファのフラッシュを抑制するには - BitWalker
個別に設定する必要はなかったのか・・・。
syslog ではバッファをフラッシュするのがデフォルトだったはずなので、これは覚えておいた方がよさそうだね。
マイナス記号をつけると、通常のディスク書き込み時のバッファリングが
Google グループ
効くので性能改善になります。ですが、クラッシュするとまだ書き込まれて
いないデータは消えるでしょうね、という話です。
$ActionFileEnableSyncをonにするとバッファリングしないようになってくれるらしい。
あとログファイルの前に-をつけると$ActionFileEnableSyncがoffのようになる。
...とか書いてあるんだけど自分の環境だとそれでもバッファリングしてしまうようで...
どっかで間違ってるんだと思うけど、混乱してきたし本質的ではないので置いておく(キリッ
あれ?パケットは送られてきたけどやっぱりログに書き込まれないよ?
サーバ側に
*.* /var/log/all
とか書いてみて全てのログを/var/log/allに書き込まれるようにしてみて再起動。
クライアント側で
$ logger hoge $ sudo service rsyslog restart # ログをフラッシュして転送する
してみた。
だけどやっぱり(手紙はここで切れている)