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 # ログをフラッシュして転送する
してみた。
だけどやっぱり(手紙はここで切れている)
設定ファイルrsyslog.confが正しいかテストする
$ sudo rsyslog -c4 -N 1 rsyslogd: version 4.6.4, config validation run (level 1), master config /etc/rsyslog.conf rsyslogd: End of config validation run. Bye.
GlusterFSインストールしてるのにnfs-kernel-serverでNFS公開してた
ずっと「GlusterFSはNFSの機能を持っているからNFSとしてもマウントできる」とか書かれてるのを見るけど
結局マウントできなくて惰性でnfs-kernel-server使ってました。そんな生き方。
glusterfsとしてマウントしたディレクトリをさらにnfs-kernel-serverで公開する、って感じだったのが
brickを直接NFSで公開するようになったのでかなり速くなっているはず。
まぁ情弱なのは常々分かってはいたけど非常に無駄な感じだった訳ですね。
さらにglusterfsとしてマウントすればもっと速いらしいですが
クライアントにglusterfsインストールするのもなぁとよくわからない抵抗を示し、
まぁでもNFS機能はデフォルトで有効なのでNFS、GlusterFSどっちでもマウントできるので
速度が必要になった所でだけ使えばいいんじゃね?とか屁理屈を言ったりしています。
ぶっちゃけ管理の手間増えないしインストールすればいいと思います。
と思って今試したらなんか「Mount failed. Please check the log file for more details.」とか言われて失敗しました。やっぱNFSでいいや。ちくしょう。
最近卑屈になることが増えましたがストレスは特になく寝てばかりいます。そんな最近。
パッケージを消す際に注意することとして、nfs-commonはglusterfsが依存してるので消せません。
けどnfs-commonのサービスは起動してなくても問題ない。
なので
$ sudo apt-get remove nfs-kernel-server $ sudo sysv-rc-conf nfs-common off
すればいい感じ。
USBメモリにインストールしたDebianなのでサイズがちょっと気になるのです。
あと、nfs-kernel-serverとかglusterfsとか入れてると両方がバッティングして
どっちのディレクトリがexportされてるのかよくわからない状態になるので
次のようにすればGlusterFSのディレクトリがexportされた状態になるはずです。
$ sudo service nfs-kernel-server stop $ sudo service nfs-common stop $ sudo service glusterfs restart
ネタ元はGlusterFSのドキュメント。
ネタ元ではどのディストリビューションの例かわかりませんが...
On Linux, kernel NFS servers can be stopped by using either of the following commands depending on the distribution in use:
Gluster 3.1: NFS Frequently Asked Questions - GlusterDocumentation
$ /etc/init.d/nfs-kernel-server stop
$ /etc/init.d/nfs stop
Next, restart Gluster NFS server.
GlusterFSのNFS機能は「sudo glusterfs volume set
あと、クライアント側の/etc/fstabを変更する必要がある。
以前は
hogehost:/<nfs-export-dir> /data nfs defaults,_netdev 0 0
だったのが
hogehost:/<volume> /data nfs defaults,_netdev,mountproto=tcp 0 0
のように変更する必要がある。
mountproto=tcpをつける意味はここらへん参照。
こう/etc/fstabをいじることが多いと一元管理したくなる。
たしかLDAPで一元管理できた気がするんだけどなー。
LDAPはさらにめんどくさい気がして(ry
/etc/fstabの一元管理とかミスったら最悪ブートしなさそうで怖い...
lxc-toolsでOSブート時にLXCを起動
理由: /etc/init.d/lxc-autostart 作るのがめんどくさい
libvirtd?なにそれおいしいの?
libvirtd使ってLinuxコンテナ自動起動しようと思ったけどめんどくさかったので/etc/rc.localから無理矢理起動するようにした話 - Humanity
rc.localでいろいろやりすぎるとアレだけど、これくらいならいいじゃない!
rc.local、cronと同じく環境変数は用意されてなかったりするので注意。
といいつつ特にハマってないので実例はないけど。
とかいう記事を書きましたが、実は書いた直後にlxc-toolsというLXCの便利ツール集なリポジトリを見つけ、
そこに「init」なるファイルがありREADMEに「initは/etc/init.d/lxcにコピーして使えるinit.dスクリプトだよ」とか書いてあるじゃないですか!
さらに中身を見てみるとふと「autostart」なる文字列が目に飛び込み、「これはぜひ試さない訳にはいかない、明日絶対やる」と言って寝たのが5日前、という訳です。
なので約束通りブログ書きます。あ?ごめんなさい。
スクリプトが/var/lib/lxc/以下にコンテナが置いてある前提なので
もしかしたらDebian-specificかもしれない、ということでこの記事にはDebianタグをつけてあります。
いや他のディストリビューションでどこに置いてあったか忘れましたがたしか違ったような気もしたので。忘れましたが。
ダウンロード
まずダウンロードします。
gitないよって人は普通にwgetでtarballとかzip持ってきても構いません。*1
gitがあるなら
$ git clone https://github.com/phbaer/lxc-tools.git
gitがないなら
$ wget https://github.com/phbaer/lxc-tools/tarball/master $ tar xzf master
とか、もっとクールにやるならcurlとかzcatとかをパイプでつなげて1行で解凍するんでしょう。
ここで私は時間を10分無駄にしました。素直にブラウザに表示されるダウンロードボタンを押しましょう。
インストール
$ cd lxc-tools $ sudo cp init /etc/init.d/lxc $ sudo sysv-rc-conf lxc on
僕はここで/etc/rc.localに先日(5日前)書いた設定をアンコメントしておきました。
/var/lib/lxc//autostartに「1」を書き込む
内容が「1」であるautostartというファイルをコンテナのディレクトリに作ります。
/etc/init.d/lxcはこれを見てブート時にコンテナを起動するか決めます。
$ echo 1 | sudo tee /var/lib/lxc/hoge/autostart $ echo 1 | sudo tee /var/lib/lxc/fuga/autostart
あるあるな事象として「sudo echo 1 >/var/lib/lxc/hoge/autostart」とかやるとリダイレクトの権限はsudoで変えられないのでpermission deniedとなります。気を付けましょう。
sudo reboot
再起動したらsudo lxc-lsして設定したコンテナがちゃんと起動されてるか確認します。
確認したらコメントアウトした/etc/rc.localのコードは消してしまいましょう。>僕
*1:なんかGitHubにあるからgitじゃないとダウンロードできないって考えてる人多い気がする、SourceForgeだと普通にダウンロードするのに