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した時の結果は転送されてる...

Nov 14 14:11:13 fugahost rsyslogd: [origin software="rsyslogd" swVersion="4.6.4" x-pid="3338" x-info="http://www.rsyslog.com"] exiting on signal 15.
Nov 14 14:11:13 fugahost rsyslogd: [origin software="rsyslogd" swVersion="4.6.4" x-pid="4022" x-info="http://www.rsyslog.com"] (re)start
$ 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 になっていることを知って愕然。
個別に設定する必要はなかったのか・・・。
syslog ではバッファをフラッシュするのがデフォルトだったはずなので、これは覚えておいた方がよさそうだね。

rsyslog でバッファのフラッシュを抑制するには - BitWalker

マイナス記号をつけると、通常のディスク書き込み時のバッファリングが
効くので性能改善になります。ですが、クラッシュするとまだ書き込まれて
いないデータは消えるでしょうね、という話です。

Google グループ

$ActionFileEnableSyncをonにするとバッファリングしないようになってくれるらしい。
あとログファイルの前に-をつけると$ActionFileEnableSyncがoffのようになる。
...とか書いてあるんだけど自分の環境だとそれでもバッファリングしてしまうようで...
どっかで間違ってるんだと思うけど、混乱してきたし本質的ではないので置いておく(キリッ

あれ?パケットは送られてきたけどやっぱりログに書き込まれないよ?

サーバ側に

*.* /var/log/all

とか書いてみて全てのログを/var/log/allに書き込まれるようにしてみて再起動。
クライアント側で

$ logger hoge
$ sudo service rsyslog restart # ログをフラッシュして転送する

してみた。


だけどやっぱり(手紙はここで切れている)