2010年8月18日水曜日

ローカルネットワーク内のサーバ状況を外部のサーバでMRTG監視する

どうも、俺@連投です。

監視サーバから直接接続できないローカルサーバの状況をMRTGで監視したい場合、ありますよね。
その場合の対処方法についてメモです。

イメージ的には
【監視サーバ】→→インターネット→→【システムWEBサーバ(192.168.0.1)】→→ローカル→→【システムDBサーバ(192.168.0.2)】
のような感じの場合です。
今回は例としてローカル内のDBサーバのロードアベレージを取得するとします。

まずDBサーバから定期的にLoadavg情報をWEBサーバへ転送するようにします。
【DBサーバ】192.168.0.2
# vim catch_loadavg.sh
-----------------------
awk '{ print $1"\n"$2 }' /proc/loadavg > db_loadavg # loadavg情報取得
rsync /path/to/db_loadavg 192.168.0.1::module_name/path/to/savedir # rsyncでWEBサーバへ転送
これをcronにて5分毎に実行させます。

# crontab -e
*/5 * * * * /path/to/catch_loadavg.sh
これでDB側は準備完了です。
おそらくdb_loadavgというファイルには
0.24
0.18
のように、1行目は1分平均、2行目が5分平均のロードアベレージデータがあるはずです。

次はWEBサーバ側です。
まずrsyncの設定を
# vim /etc/xinetd.d/rsync
-------------------------------
# default: off
# description: The rsync server is a good addition to an ftp server, as it \
# allows crc checksumming etc.

service rsync
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}


# vim /etc/rsyncd.conf
--------------------------
hosts allow = 192.168.0.0/24
use chroot = false
read only = false
[module_name]
uid = root
gid = root
path = /
comment = some comment
こんな感じでしょう。xinetdを再起動します。
# service xinetd restart
これで、DBサーバからロードアベレージデータファイルをrsyncにて受け取れるようになりました。

次にsnmpdの設定です。
まずはDBサーバのロードアベレージを表示するプログラムを作成します。1分平均のものと5分平均のもの2つ用意します。
# vim /etc/snmp/db_loadavg_1avg.sh // pathは適当です
-------------------------------
#!/bin/sh

cd /etc/snmp
cat /path/to/db_loadavg | awk 'NR==1 { print $1*100 }'

# vim /etc/snmp/db_loadavg_5avg.sh
-------------------------------
#!/bin/sh

cd /etc/snmp
cat /path/to/db_loadavg | awk 'NR==2 { print $1*100 }'
これで2つ出来ました。

次はsnmpd.confの設定です。
# vim snmpd.conf
---------------------------
# 以下を追加
exec db_loadavg_1avg /etc/snmp/db_loadavg_1avg.sh
exec db_loadavg_5avg /etc/snmp/db_loadavg_5avg.sh
でsnmpdを再起動します。
# service snmpd restart
これでとりあえずWEB側の設定も完了です。


では監視サーバからデータが取得できるかどうか確認です。
監視サーバ側から
# snmpwalk -v 1 -c community_name webserver_host .1.3.6.1.4.1.2021.8.1.100.1
# snmpwalk -v 1 -c community_name webserver_host .1.3.6.1.4.1.2021.8.1.100.2
これでデータが取得できればOKです。

監視サーバのMRTGの設定ファイルに
# vim /usr/local/mrtg-2/conf/foo.cfg
-----------------------------------------------
Target[webserver_host_db_load]: .1.3.6.1.4.1.2021.8.1.101.1&.1.3.6.1.4.1.2021.8.1.101.2:community_name@webserver_host:
MaxBytes[webserver_host_db_load]: 10000
Options[webserver_host_db_load]: gauge, absolute
YLegend[webserver_host_db_load]: DB/LoadAvg
ShortLegend[webserver_host_db_load]: %
Legend1[webserver_host_db_load]: 1min CPU load avg
Legend2[webserver_host_db_load]: 5min CPU load avg
LegendI[webserver_host_db_load]: 1min CPU load avg
LegendO[webserver_host_db_load]: 5min CPU load avg
KMG[webserver_host_db_load]: %
Title[webserver_host_db_load]: DB/Load Average
と、まぁこんな感じで、、

あとはグラフが出てくれるのを気長に待つべし。

以上でぇぇぇす。

自作デーモンプログラムを走らせる

どうも、俺@始業です。
今日はむかーしドコかのブログにメモったものを書き移します。

Linuxサーバにて自作プログラムをデーモンとして動かす方法についてです。
今回は例として外部サーバから80000ポートにTCP接続があればそのサーバのロードアベレージを返すデーモンプログラムを作成します。

まずはロードアベレージを返すプログラムを作成。
# vim call_loadavg.sh
#!/bin/sh
cat /proc/loadavg | awk '{ print $1 }'

# chmod +x call_loadavg.sh
出来ました。

これをデーモンに登録します。
# vim /etc/services
# 一番最終行にでも
call_loadavg 80000/tcp # my_daemon

// 新規作成
# vim /etc/xinetd.d/call_loadavg
service call_loadavg
{
 disable = no
 socket_type = stream
 wait = no
 user = root
 protocol = tcp
 server = /bin/sh
 server_args = /path/to/call_loadavg.sh
 log_on_failure += USERID
 port = 80000
# IP制限した場合は
only_from = x.x.x.x

}

この項目は
disable no...使用 yes...使用しない
socket_type stream...ストリーム型 dgram...データグラム型 raw...IPへ直接制御が必要な場合
wait yes...シングルスレッドで動作 no...マルチスレッドで動作
user 実行ユーザ名
protocol プロトコル
server 実行プログラム名
server_args 実行プログラムに渡される引数
log_on_failure サーバ起動、終了時に出力するログの種類(複数組み合わせ可)
 PID...プロセスID HOST...リモートホストアドレス USERID...リモートユーザのユーザID EXIT...サーバが終了したことを出力 DURATION...サービスセッションの時間
port プログラムが動作するポート番号
などです。詳しくはhttp://www.linux.or.jp/JM/html/xinetd/man5/xinetd.conf.5.htmlにて。

次にxinetdを再起動
# service xinetd restart
以上でぇぇえす。

2010年8月4日水曜日

postgresqlのクエリログ(スロウログ)を取得

どうも、俺@仕事中です。

以前にもpostgresqlのslow-log::オデの日記と題してpostgresqlでSlowログを取得する方法を書いたのですが、
この方法はsyslogを利用する方法だったので連携が難しいというか面倒というか、syslogの設定も変更する必要があったので、今回はpostgresqlだけでログを取得する方法についてメモします。

PostgreSQLのバージョンは8.4.xです。(8.3~であれば共通なはず)

# vim postgresql.conf
# 以下を追加

log_destination = 'stderr'
logging_collector = 'on'
# ログの出力先ディレクトリ(postgresユーザで書込み権限あるように)
log_directory = '/usr/local/pgsql/data'
# 出力ファイル名 (
log_filename = 'postgresql_%Y%m%d%H%M_log'
# ログが100KBになったらローテートする
log_rotation_size = 100
# ログを1日おきにローテート
#log_rotation_age = 86400
# 1000ミリ秒以上のクエリを出力(0の場合はすべてのクエリ)
log_min_duration_statement = 1000
です。

あとは
postgres $ pg_ctl restart
と再起動します。

以上どえぇぇぇす。

2010年8月2日月曜日

OpenFlashChartで折れ線グラフを描く

どうも、俺@週明け仕事中です。

今日はphpの便利なFlashグラフ作成ライブラリOpen Flash Chartを使って折れ線グラフを描く方法をメモします。

.swfファイルの配置などは割愛します。
上記URLから一式ファイルを落として、open-flash-chart.swfをサーバへ置き、クライアント側からはjavascriptで
<script src="swfobject.js" type="text/javascript"></script>
swfobject.embledSWF("open-flash-chart.swf");
のように呼び出すだけです。

では、折れ線グラフ(2本の折れ線)を作るためにサーバ側では
<?php
$chart = new OFC_Chart();

// 1本目
$line = new OFC_Charts_Line();
$line->set_values(array(1,2,3));
$line->set_width(2);
$line->set_colour("#000000");
$chart->add_element($line);

// tool_tipを使う場合
$dot = new OFC_Charts_Line_Dot();
$dot->set_dot_size(3);
$dot->set_halo_size(1);
$dot->set_colour("#000000");
$dot->set_tooltip("ここはツールチップ #val##x_label#");
$line->set_default_dot_style($dot);

/Charts/OFC_Charts_Line.phpに以下のメソッド追加
function set_tooltip($tip) {
$this->tip = $tip;
}
function set_default_dot_style($style) {
$this->{"dot-style"} = $style;
}


// 2本目
$line = new OFC_Charts_Line();
$line->set_values(array(4,5,6));
$line->set_width(2);
$line->set_colour("#000000");
$chart->add_element($line);

// tool_tipを使う場合
$dot = new OFC_Charts_Line_Dot();
$dot->set_dot_size(3);
$dot->set_halo_size(1);
$dot->set_colour("#000000");
$dot->set_tooltip("ここはツールチップ #val##x_label#");
$line->set_default_dot_style($dot);


// Y軸
$y = new OFC_Elements_Axis_Y();
$y->set_range(0,100,10);// Y軸の幅
$y->set_colour("#000000")
$y->set_grid_colour("#cccccc");
$chart->set_y_axis($y);

// X軸
$x_label = new OFC_Elements_Axis_X_Label_Set();
$x_label->set_labels(array("その1", "その2"));
$x_label->set_steps(1);
$x_label->set_colour("#000000");

$x = new OFC_Elements_Axis_X();
$x->set_labels($x_label);
$x->set_colour("#000000");
$x->set_grid_colour("#cccccc");
$x->set_range(0,null,null);

$chart->set_x_axis($x);

print $chart->toPrettyString();
exit;
こんな感じです。

詳細は公式を見てね。