DHCPサーバーのスケジューリング

職場では、しばしば疑問が生じます-DHCPサーバーはうまく機能しますか? 私はインターネットプロバイダーで働いており、DHCPはクライアントネットワークを提供しています。 歴史的に、次の作業スキームが開発されました。2台のDHCPサーバーがあり、構成は請求サーバーで生成され、rsyncを使用してサーバーにアップロードされます。 Centosを作業システムとして使用し、ISC DHCPをサーバーとして使用します。 フェールオーバーは構成または構成されていません-必要はありません。 サーバーが同一の構成で動作していれば十分です。 サブスクライバーのポピーアドレスへのバインドが使用されます。機器が変更された場合、サブスクライバーは個人アカウントにログインして新しいポピーを指定することができます。 構成は5分ごとに1回生成されます。新しい構成のmd5合計が変更されると、サービスが再起動します。 このスキームは数年間機能しており、問題はありません。



構成が構文的に正しく生成されないという問題が定期的に発生し、再起動後にサービスがクラッシュしました。 再起動スクリプトに構文チェックを追加し(dhcpd -t)、クラッシュが停止しました。 まあ、請求側からは小切手でハングアップしています-住所、ケシなどの存在のために



リクエストがネットワークから送信されたが、答えがネットワークに届かない状況に数回直面しました。 アグリゲーターは非難され、彼らは治療されました。 この間ずっと、単純なグラフィカル分析が欠けていました-DHCPサーバーがどのように機能するか。 問題を解体した経験からわかるように(ログの通常の表示とサーバーが送受信するメッセージの数の評価)、すでにネットワーク上の問題の存在を大まかに推定できます。 まあ、原則として、スケジュールを指示で夜間オペレーターに表示することができます-インジケーターに急激な変化がある場合は、管理者に電話してください。



したがって、私たちは自分自身のためにタスクを策定します。 標準に従って、DHCPには次のメッセージタイプが存在します。



DHCPDISCOVER-アドレスのクライアント要求

DHCPOFFER-アドレスを取得するためのサーバー提供

DHCPREQUEST-アドレスのクライアント要求(DHCPOFFERのサーバーによって提案された)

DHCPACK-アドレスの発行のサーバー確認

DHCPDECLINE-クライアントは提案されたアドレスの受信を拒否します

DHCPNAK-サーバーは要求されたアドレスの発行を拒否します

DHCPRELEASE-アドレスのリリースに関するクライアントへの通知

DHCPINFORM-追加パラメーターのクライアント要求

各タイプのメッセージのグラフを作成します。



サーバーログファイルを情報源として使用できます。 別のソースは見つかりませんでした。特別なこともできません。dhcpがこの情報をどこかに蓄積できると仮定すると、そもそもそのような統計を抽出する手段があり、2番目に、絶え間ないプロセスの再起動がその有用性をゼロに減らします。



私たちのネットワークでは、dhcpサーバーは独立した仮想マシンであり、グラフィックスを構築するマシン(mrtgと呼ばれる)も独立した仮想マシンです。 つまり マシン間で情報を転送する方法が必要です。



その結果、まさにそのようなスキームを実装しました。 dhcpサーバーで、構成に追加します。



log-facility local6









syslog(これらの仮想マシンはまだCentOS 5で動作します。1年前のマシンの稼働時間は長くなります。1年前に私たちの街で1か月間ライトがオフにならなかった場合はさらに多くなります)。



 *.info;mail.none;authpriv.none;cron.none;local6.none /var/log/messages local6.* /var/log/dhcpd.log local6.* /var/log/dhcpd-stat.log
      
      





つまり 禁止local6は、共通ファイル/ var / log / messagesに出力され、同時に2つのファイルに出力されます。



次のステップは、mrtgにパスワードなしでキーでdhcpにアクセスするように教えることです。 さて、mrtgには次のようなスクリプトがあります。



統計更新スクリプト
 #!/bin/bash for HOST in dhcp1 dhcp2 do TARGET=/srv/www/noc.lds.net.ua/dhcp/$HOST mkdir -p $TARGET cd $TARGET scp $HOST:/var/log/dhcpd-stat.log ./ ssh $HOST "echo -n > /var/log/dhcpd-stat.log" if [ ! -f dhcpqueries.rrd ] then /usr/bin/rrdtool create dhcpqueries.rrd \ DS:request:GAUGE:600:0:10000000 \ DS:ack:GAUGE:600:0:10000000 \ DS:decline:GAUGE:600:0:10000000 \ DS:discover:GAUGE:600:0:10000000 \ DS:release:GAUGE:600:0:10000000 \ DS:nak:GAUGE:600:0:10000000 \ DS:info:GAUGE:600:0:10000000 \ DS:offer:GAUGE:600:0:10000000 \ RRA:AVERAGE:0.5:1:800 \ RRA:AVERAGE:0.5:6:800 \ RRA:AVERAGE:0.5:24:800 \ RRA:AVERAGE:0.5:288:800 \ RRA:MAX:0.5:1:800 \ RRA:MAX:0.5:6:800 \ RRA:MAX:0.5:24:800 \ RRA:MAX:0.5:288:800 fi out=$(awk ' BEGIN {request=0;ack=0;decline=0;discover=0;release=0;nak=0;info=0;offer=0} { if($6 == "DHCPREQUEST") {request = request + 1} if($6 == "DHCPACK") {ack = ack + 1} if($6 == "DHCPDECLINE") {decline = decline + 1} if($6 == "DHCPDISCOVER") {discover = discover + 1} if($6 == "DHCPRELEASE") {release = release + 1} if($6 == "DHCPNAK") {nak = nak + 1} if($6 == "DHCPINFORM") {info = info + 1} if($6 == "DHCPOFFER") {offer = offer + 1} } END {print request ":" ack ":" decline ":" discover ":" release ":" nak ":" info ":" offer} ' dhcpd-stat.log) /usr/bin/rrdtool update dhcpqueries.rrd --template \ request:ack:decline:discover:release:nak:info:offer \ N:$out /usr/bin/rrdtool graph dhcprequest.png \ -v "Requests/Minute" \ --rigid \ -l 0 \ --start -86400 \ DEF:a=dhcpqueries.rrd:request:AVERAGE \ DEF:b=dhcpqueries.rrd:ack:AVERAGE \ DEF:c=dhcpqueries.rrd:decline:AVERAGE \ DEF:d=dhcpqueries.rrd:discover:AVERAGE \ DEF:e=dhcpqueries.rrd:release:AVERAGE \ DEF:f=dhcpqueries.rrd:nak:AVERAGE \ DEF:g=dhcpqueries.rrd:info:AVERAGE \ DEF:h=dhcpqueries.rrd:offer:AVERAGE \ CDEF:cdefa=a,5,/ \ CDEF:cdefb=b,5,/ \ CDEF:cdefc=c,5,/ \ CDEF:cdefd=d,5,/ \ CDEF:cdefe=e,5,/ \ CDEF:cdeff=f,5,/ \ CDEF:cdefg=g,5,/ \ CDEF:cdefh=h,5,/ \ LINE1:cdefa#9C7BBD:DHCPREQUEST \ GPRINT:cdefa:LAST:" Cur\:%8.1lf" \ GPRINT:cdefa:AVERAGE:"Ave\:%8.1lf" \ GPRINT:cdefa:MAX:"Max\:%8.1lf\n" \ LINE1:cdefb#3152A5:DHCPACK \ GPRINT:cdefb:LAST:" Cur\:%8.1lf" \ GPRINT:cdefb:AVERAGE:"Ave\:%8.1lf" \ GPRINT:cdefb:MAX:"Max\:%8.1lf\n" \ LINE1:cdefc#750F7D:DHCPDECLINE \ GPRINT:cdefc:LAST:" Cur\:%8.1lf" \ GPRINT:cdefc:AVERAGE:"Ave\:%8.1lf" \ GPRINT:cdefc:MAX:"Max\:%8.1lf\n" \ LINE1:cdefd#157419:DHCPDISCOVER \ GPRINT:cdefd:LAST:" Cur\:%8.1lf" \ GPRINT:cdefd:AVERAGE:"Ave\:%8.1lf" \ GPRINT:cdefd:MAX:"Max\:%8.1lf\n" \ LINE1:cdefe#6DC8FE:DHCPRELEASE \ GPRINT:cdefe:LAST:" Cur\:%8.1lf" \ GPRINT:cdefe:AVERAGE:"Ave\:%8.1lf" \ GPRINT:cdefe:MAX:"Max\:%8.1lf\n" \ LINE1:cdeff#FFAB00:DHCPNAK \ GPRINT:cdeff:LAST:" Cur\:%8.1lf" \ GPRINT:cdeff:AVERAGE:"Ave\:%8.1lf" \ GPRINT:cdeff:MAX:"Max\:%8.1lf\n" \ LINE1:cdefg#FF0000:DHCPINFORM \ GPRINT:cdefg:LAST:" Cur\:%8.1lf" \ GPRINT:cdefg:AVERAGE:"Ave\:%8.1lf" \ GPRINT:cdefg:MAX:"Max\:%8.1lf\n" \ LINE1:cdefh#00FF00:DHCPOFFER \ GPRINT:cdefh:LAST:" Cur\:%8.1lf" \ GPRINT:cdefh:AVERAGE:"Ave\:%8.1lf" \ GPRINT:cdefh:MAX:"Max\:%8.1lf\n" \ /usr/bin/rrdtool graph dhcprequest-weekly.png \ -v "Requests/Minute" \ --rigid \ -l 0 \ --start -604800 \ DEF:a=dhcpqueries.rrd:request:AVERAGE \ DEF:b=dhcpqueries.rrd:ack:AVERAGE \ DEF:c=dhcpqueries.rrd:decline:AVERAGE \ DEF:d=dhcpqueries.rrd:discover:AVERAGE \ DEF:e=dhcpqueries.rrd:release:AVERAGE \ DEF:f=dhcpqueries.rrd:nak:AVERAGE \ DEF:g=dhcpqueries.rrd:info:AVERAGE \ DEF:h=dhcpqueries.rrd:offer:AVERAGE \ CDEF:cdefa=a,5,/ \ CDEF:cdefb=b,5,/ \ CDEF:cdefc=c,5,/ \ CDEF:cdefd=d,5,/ \ CDEF:cdefe=e,5,/ \ CDEF:cdeff=f,5,/ \ CDEF:cdefg=g,5,/ \ CDEF:cdefh=h,5,/ \ LINE1:cdefa#9C7BBD:DHCPREQUEST \ GPRINT:cdefa:LAST:" Cur\:%8.1lf" \ GPRINT:cdefa:AVERAGE:"Ave\:%8.1lf" \ GPRINT:cdefa:MAX:"Max\:%8.1lf\n" \ LINE1:cdefb#3152A5:DHCPACK \ GPRINT:cdefb:LAST:" Cur\:%8.1lf" \ GPRINT:cdefb:AVERAGE:"Ave\:%8.1lf" \ GPRINT:cdefb:MAX:"Max\:%8.1lf\n" \ LINE1:cdefc#750F7D:DHCPDECLINE \ GPRINT:cdefc:LAST:" Cur\:%8.1lf" \ GPRINT:cdefc:AVERAGE:"Ave\:%8.1lf" \ GPRINT:cdefc:MAX:"Max\:%8.1lf\n" \ LINE1:cdefd#157419:DHCPDISCOVER \ GPRINT:cdefd:LAST:" Cur\:%8.1lf" \ GPRINT:cdefd:AVERAGE:"Ave\:%8.1lf" \ GPRINT:cdefd:MAX:"Max\:%8.1lf\n" \ LINE1:cdefe#6DC8FE:DHCPRELEASE \ GPRINT:cdefe:LAST:" Cur\:%8.1lf" \ GPRINT:cdefe:AVERAGE:"Ave\:%8.1lf" \ GPRINT:cdefe:MAX:"Max\:%8.1lf\n" \ LINE1:cdeff#FFAB00:DHCPNAK \ GPRINT:cdeff:LAST:" Cur\:%8.1lf" \ GPRINT:cdeff:AVERAGE:"Ave\:%8.1lf" \ GPRINT:cdeff:MAX:"Max\:%8.1lf\n" \ LINE1:cdefg#FF0000:DHCPINFORM \ GPRINT:cdefg:LAST:" Cur\:%8.1lf" \ GPRINT:cdefg:AVERAGE:"Ave\:%8.1lf" \ GPRINT:cdefg:MAX:"Max\:%8.1lf\n" \ LINE1:cdefh#00FF00:DHCPOFFER \ GPRINT:cdefh:LAST:" Cur\:%8.1lf" \ GPRINT:cdefh:AVERAGE:"Ave\:%8.1lf" \ GPRINT:cdefh:MAX:"Max\:%8.1lf\n" \ /usr/bin/rrdtool graph dhcprequest-monthly.png \ -v "Requests/Minute" \ --rigid \ -l 0 \ --start -2592000 \ DEF:a=dhcpqueries.rrd:request:AVERAGE \ DEF:b=dhcpqueries.rrd:ack:AVERAGE \ DEF:c=dhcpqueries.rrd:decline:AVERAGE \ DEF:d=dhcpqueries.rrd:discover:AVERAGE \ DEF:e=dhcpqueries.rrd:release:AVERAGE \ DEF:f=dhcpqueries.rrd:nak:AVERAGE \ DEF:g=dhcpqueries.rrd:info:AVERAGE \ DEF:h=dhcpqueries.rrd:offer:AVERAGE \ CDEF:cdefa=a,5,/ \ CDEF:cdefb=b,5,/ \ CDEF:cdefc=c,5,/ \ CDEF:cdefd=d,5,/ \ CDEF:cdefe=e,5,/ \ CDEF:cdeff=f,5,/ \ CDEF:cdefg=g,5,/ \ CDEF:cdefh=h,5,/ \ LINE1:cdefa#9C7BBD:DHCPREQUEST \ GPRINT:cdefa:LAST:" Cur\:%8.1lf" \ GPRINT:cdefa:AVERAGE:"Ave\:%8.1lf" \ GPRINT:cdefa:MAX:"Max\:%8.1lf\n" \ LINE1:cdefb#3152A5:DHCPACK \ GPRINT:cdefb:LAST:" Cur\:%8.1lf" \ GPRINT:cdefb:AVERAGE:"Ave\:%8.1lf" \ GPRINT:cdefb:MAX:"Max\:%8.1lf\n" \ LINE1:cdefc#750F7D:DHCPDECLINE \ GPRINT:cdefc:LAST:" Cur\:%8.1lf" \ GPRINT:cdefc:AVERAGE:"Ave\:%8.1lf" \ GPRINT:cdefc:MAX:"Max\:%8.1lf\n" \ LINE1:cdefd#157419:DHCPDISCOVER \ GPRINT:cdefd:LAST:" Cur\:%8.1lf" \ GPRINT:cdefd:AVERAGE:"Ave\:%8.1lf" \ GPRINT:cdefd:MAX:"Max\:%8.1lf\n" \ LINE1:cdefe#6DC8FE:DHCPRELEASE \ GPRINT:cdefe:LAST:" Cur\:%8.1lf" \ GPRINT:cdefe:AVERAGE:"Ave\:%8.1lf" \ GPRINT:cdefe:MAX:"Max\:%8.1lf\n" \ LINE1:cdeff#FFAB00:DHCPNAK \ GPRINT:cdeff:LAST:" Cur\:%8.1lf" \ GPRINT:cdeff:AVERAGE:"Ave\:%8.1lf" \ GPRINT:cdeff:MAX:"Max\:%8.1lf\n" \ LINE1:cdefg#FF0000:DHCPINFORM \ GPRINT:cdefg:LAST:" Cur\:%8.1lf" \ GPRINT:cdefg:AVERAGE:"Ave\:%8.1lf" \ GPRINT:cdefg:MAX:"Max\:%8.1lf\n" \ LINE1:cdefh#00FF00:DHCPOFFER \ GPRINT:cdefh:LAST:" Cur\:%8.1lf" \ GPRINT:cdefh:AVERAGE:"Ave\:%8.1lf" \ GPRINT:cdefh:MAX:"Max\:%8.1lf\n" \ /usr/bin/rrdtool graph dhcprequest-yearly.png \ -v "Requests/Minute" \ --rigid \ -l 0 \ --start -31536000 \ DEF:a=dhcpqueries.rrd:request:AVERAGE \ DEF:b=dhcpqueries.rrd:ack:AVERAGE \ DEF:c=dhcpqueries.rrd:decline:AVERAGE \ DEF:d=dhcpqueries.rrd:discover:AVERAGE \ DEF:e=dhcpqueries.rrd:release:AVERAGE \ DEF:f=dhcpqueries.rrd:nak:AVERAGE \ DEF:g=dhcpqueries.rrd:info:AVERAGE \ DEF:h=dhcpqueries.rrd:offer:AVERAGE \ CDEF:cdefa=a,5,/ \ CDEF:cdefb=b,5,/ \ CDEF:cdefc=c,5,/ \ CDEF:cdefd=d,5,/ \ CDEF:cdefe=e,5,/ \ CDEF:cdeff=f,5,/ \ CDEF:cdefg=g,5,/ \ CDEF:cdefh=h,5,/ \ LINE1:cdefa#9C7BBD:DHCPREQUEST \ GPRINT:cdefa:LAST:" Cur\:%8.1lf" \ GPRINT:cdefa:AVERAGE:"Ave\:%8.1lf" \ GPRINT:cdefa:MAX:"Max\:%8.1lf\n" \ LINE1:cdefb#3152A5:DHCPACK \ GPRINT:cdefb:LAST:" Cur\:%8.1lf" \ GPRINT:cdefb:AVERAGE:"Ave\:%8.1lf" \ GPRINT:cdefb:MAX:"Max\:%8.1lf\n" \ LINE1:cdefc#750F7D:DHCPDECLINE \ GPRINT:cdefc:LAST:" Cur\:%8.1lf" \ GPRINT:cdefc:AVERAGE:"Ave\:%8.1lf" \ GPRINT:cdefc:MAX:"Max\:%8.1lf\n" \ LINE1:cdefd#157419:DHCPDISCOVER \ GPRINT:cdefd:LAST:" Cur\:%8.1lf" \ GPRINT:cdefd:AVERAGE:"Ave\:%8.1lf" \ GPRINT:cdefd:MAX:"Max\:%8.1lf\n" \ LINE1:cdefe#6DC8FE:DHCPRELEASE \ GPRINT:cdefe:LAST:" Cur\:%8.1lf" \ GPRINT:cdefe:AVERAGE:"Ave\:%8.1lf" \ GPRINT:cdefe:MAX:"Max\:%8.1lf\n" \ LINE1:cdeff#FFAB00:DHCPNAK \ GPRINT:cdeff:LAST:" Cur\:%8.1lf" \ GPRINT:cdeff:AVERAGE:"Ave\:%8.1lf" \ GPRINT:cdeff:MAX:"Max\:%8.1lf\n" \ LINE1:cdefg#FF0000:DHCPINFORM \ GPRINT:cdefg:LAST:" Cur\:%8.1lf" \ GPRINT:cdefg:AVERAGE:"Ave\:%8.1lf" \ GPRINT:cdefg:MAX:"Max\:%8.1lf\n" \ LINE1:cdefh#00FF00:DHCPOFFER \ GPRINT:cdefh:LAST:" Cur\:%8.1lf" \ GPRINT:cdefh:AVERAGE:"Ave\:%8.1lf" \ GPRINT:cdefh:MAX:"Max\:%8.1lf\n" \ if [ ! -f index.shtml ] then cat > ./index.shtml << END <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML> <HEAD> <TITLE>$HOST</TITLE> <META HTTP-EQUIV="Refresh" CONTENT="300"> <META HTTP-EQUIV="Cache-Control" content="no-cache"> <META HTTP-EQUIV="Pragma" CONTENT="no-cache"> <META HTTP-EQUIV="Expires" CONTENT="Mon, 04 Feb 2008 16:28:46 GMT"> <style type="text/css"> </style> </HEAD> <BODY bgcolor="#ffffff" text="#000000" link="#000000" vlink="#000000" alink="#000000"> <!--#include virtual="/menu.shtml" --> <CENTER><H1><B>$HOST</B></H1></CENTER> <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 align="center"> <tbody> <tr><td align="center"><b><h2>Query types</h2></b></td></tr> <tr> <td align="center"> <b>daily</B><br> <IMG BORDER=0 SRC="dhcprequest.png"><br> </td> </tr> <tr> <td align="center"> <b>weekly</B><br> <IMG BORDER=0 SRC="dhcprequest-weekly.png"><br> </td> </tr> <tr> <td align="center"> <b>monthly</B><br> <IMG BORDER=0 SRC="dhcprequest-monthly.png"><br> </td> </tr> <tr> <td align="center"> <b>yearly</B><br> <IMG BORDER=0 SRC="dhcprequest-yearly.png"><br> </td> </tr> </tbody> </table> </BODY> </HTML> END fi done
      
      







このスクリプトの仕組みを説明します。



dhcpサーバーごとに、Webサーバーに個別のディレクトリが作成されます。 次に、サーバーから現在のdhcpd-stat.logをscpし、次のコマンドでクリアします。 次回、過去のログファイルを取得するため。 スクリプトは5分ごとにクラウンから呼び出されるため、統計情報は5分間の作業でログを処理します。 コピーコマンドとクリーンアップコマンドの間に経過する間に、失われたデータがログに記録されることは間違いありません。 しかし、天気のいくつかの行はそうではないと思います。



同時に、dhcpログが2つのファイルに表示される理由-質問に答えます。 最初のログは通常のログで、標準のlogrotateでローテーションされます。常に対応しているわけではなく、人を対象としています-読む必要がある場合。 2番目はスクリプト用で、5分ごとにクリアされます。

スクリプトでは、原則として、すべてが明確になっている必要があります.rrdデータベースを初期化し、存在しない場合は、awkを使用して各タイプのメッセージの数を計算し、rrdデータベースに入れてから、標準の4イメージ(日次チャート、週次チャート、月次チャート)を作成します年間スケジュール。 さて、index.shtmlがなければ作成します。



スクリプトが機能し始め、チャートが描かれます。 今すぐに見ることができます-dhcpは機能するかどうか...



チャートは次のようになります。










All Articles