複数台のWebサーバ(Apache)が動作している環境で、
アクセスログを簡単に集約できないか調べていた。
アクセスログを、netcat(ncコマンド)を利用して、UDPパケットとしてブロードキャストに投げ、
それをログ収集サーバが受け取ることができないか調べていたが、CentOS付属のnetcatでは出来なかった。
※詳しくは調べていないが、UDPで待ちうけるように設定した場合、一回通信が開始されると、その待受けポートがなくなってしまう模様。
代わりのものを調べていたら、socatというnetcatの高機能版のようなツールがあった。
TCP/UDPだけではなく、IP,SCTP,PTY,EXEC等多数のプロトコルを扱える。
EPELにsocatパッケージとして登録されている。
[code]
# yum install –enablerepo=epel socat
[/code]
●利用方法
サーバ側は以下のようにして待受けポートを指定。
[code]
# socat UDP-LISTEN:6666 STDOUT
[/code]
クライアント側は以下のようにして宛先サーバと宛先ポートを指定する。
[code]
# socat STDIN UDP-SENDTO:localhost:6666
[/code]
すると、クライアント・サーバ間で任意の通信のやり取りが出来る。
ここで、宛先サーバとしてブロードキャストアドレスを指定してあげれば、マルチキャストのように利用できる。
※ブロードキャストアドレスを指定するには broadcastオプションが必要。
※クライアントからサーバ方向への片方向通信に制限するには、サーバ側、クライアント側のどちらかに-uオプションをつける。
※複数回の接続を受け付けるにはforkオプションが必要。
サーバ側
[code]
# socat -u UDP-LISTEN:6666,fork STDOUT
[/code]
クライアント側
[code]
# socat -u STDIN UDP-SENDTO:{ブロードキャストアドレス}:6666,broadcast
[/code]
socatはシリアル回線からの入出力も可能なため、netconsoleの代わりが出来る。
netconsoleではbondingデバイスで利用できない制限があるが、socatにはその制限がない。
通信負荷がかかるので、なるべくならL3スイッチなどでブロードキャストドメインを小さくしたほうがいいかと思う。