挑戦する
ユーザーが各サーバーの接続速度と課金方法を選択できるようにします。 管理者は、管理パネルからチャネル速度を切り替えたり、ポートを削除することもできます。
鉄
各ラックには少なくとも1つのCisco Catalyst 2960スイッチがあり、特定のモデルはLANBASE SPFを備えたWS-C2960G-48TC-Lです。 その入り口には4x SFPがあり、48ギガビットイーサネットポートがサーバーに面しています。 数ギガビットのライブ負荷で、問題は発生しませんでした。 写真では、2960ファミリーのさまざまな代表者。
ポート速度とステータス
ユーザー側から見ると、すべてが非常にシンプルに見えます 。
10 Mbps接続を選択すると、この場合のトラフィックは無料なので、下のオプションは表示されなくなります。 プリペイドボリュームの使用時にトラフィックを制限するオプションは、ユーザーケアによるものです。95番目のポリシーによると、ギガビットを36時間ダウンロードし、その後チャネルをまったく使用しなかった場合、請求書は完全なギガビットのみになります。 週末の釣り旅行に出かけたときに、Habra効果があり、数千人のユーザーがサーバーに投稿した仮想マシンのイメージを絶えずダウンロードしており、多くの開発者を支援できることを想像してください。月曜日には、ホスティングアカウントで2,000ドルが見つかります。 そのような月曜日は特に難しいでしょう。 この場合、24時間後にポートは10メガビットに切り替わり、36時間後には特定のユーザーの財務制限に達するまでトラフィックが均等に購入されます。
バックエンド側から、シスコのエンジニアが実際にすべての作業を行っており、1988年に作成され1990年に統合されたSimple Network Management Protocol(SNMP)( RFC 1157 )を使用してデバイスを管理します。ハッカー(この言葉の本来の意味)は、JDケースが率いていました。彼に感謝します。
この機能を動作させるには、スイッチでSNMPサポートを有効にする必要があります。また、コミュニティを指定して、読み取り操作だけでなく書き込み操作も実行できるようにする必要があります。 PHPの関数は次のようになります。
function set_switch_port_speed ($host, $community, $port_no, $speed, $model='2960'){
// use SNMP to set speed. $speed can be 10, 100, 1000 or 0 to shutDown port.
if(!in_array($speed, array(10, 100, 1000))){
//echo 'Wrong port speed! '.$speed."\n";
return false;
}
$oid = '';
if(stristr($model, '2960')){ // magic smtp strings, path to
$oid = '1.3.6.1.4.1.9.5.1.4.1.1.9.1.'.$port_no;
}else{
$oid = '1.3.6.1.4.1.9.9.87.1.4.1.1.33.0.'.$port_no; // c2900PortAdminSpeed
}
$speed *= 1000000;
echo "setting new speed...\n";
return snmpset($host, $community, $oid, 'i', $speed);
}
したがって、サーバーのセットアップ、制限に到達、リースの終了などで呼び出されます。
ポートは2つの方法でオフにできます-速度をポート0に設定する方法、または別の機能を使用する方法:
function set_switch_port_status($host, $community, $port_no, $status, $model=''){
// use SNMP to set status. $status can be 0 or 1
$status = (int) $status;
if(!in_array($status, array(0, 1))){
echo 'Wrong port status! '.$status."\n";
return false;
}
// decode status, 1 means UP 2 means down
if($status == 0){
$status = 2;
}
$oid = '';
// for 2960 set oid = 'IF-MIB::ifAdminStatus.101'.$port_no;
if(stristr($model, '2960')){
if($port_no < 10){
$port_no = '0'.$port_no;
}
$oid = 'IF-MIB::ifAdminStatus.101'.$port_no;
}else{
$oid = 'IF-MIB::ifAdminStatus.'.($port_no + 1); // first interface on 2900xl is VLAN1
}
return snmpset($host, $community, $oid, 'i', $status);
}
トラフィックカウント
ユーザーに見えるもの:
サーバーのウィジェットにはスパークグラフィックがあり、スケール値なしで過去48時間のトラフィックの傾向を示します(そのため、スパークスパークでもあります-ウィジェットに十分なスペースがありません)。 この図は、現在のチャネル使用状況を示しています。
サーバーのリストの下にすべてのサーバーの一般的なスケジュールが表示されます(請求とは関係ありません。トラフィックはサーバーごとに個別に請求されます)
さて、特定のサーバーのグラフは、期間を選択する機能を備えた、より大きな形式で既に本格的な表示になっています。 これらの指標については、帯域幅のアカウントがすでに形成されています。
赤い線は95%です。 上記はすべて請求されません。 ご覧のとおり、このユーザーはHabraeffectを無料で休憩なしで体験しました:)。 まあ、誰も見なかった-私たちのパネルは完全に。
スイッチポートから統計を収集するには、 cactiパッケージを使用します。 cactiは情報を削除して処理した後、各ポートのrrdファイルにデータを書き込みます。 このファイルは、ポートの全期間の統計を収集します。 将来、この情報を抽出して、特定の期間のトラフィックカウントやクライアントのグラフの描画など、あらゆる操作を実行できます。 以下は、rrdtoolユーティリティを使用してさらに後処理するために、このファイルからデータを抽出する関数です。
function getRRDData($rrd_file, $start, $end = ''){
$str_end = '';
if($end)
$str_end = ' -e '.$end;
$res = exec('/usr/local/bin/rrdtool fetch '.$rrd_file.' AVERAGE -s '.$start.$str_end, $output);
if(!$res || (count($output) < 1)){
return array(); // smth is wrong
}
// we need only 3 ... N-1 elements
$rrd_data = array();
for($i = 2; $i < (count($output) ); $i++){
// replace NAN with 0
if(stristr($output[$i], 'nan'))
$output[$i] = str_ireplace('nan', '0', $output[$i]);
$values = explode(' ', str_replace(':', '', $output[$i]));
// check timestamp
if($end && ($values[0] > $end))
break;
$rrd_data[] = $output[$i];
}
return $rrd_data;
}
コードから完全にシートを取得しないために、ここではトラフィックをカウントして描画するための大規模な関数を提供しません。 トラフィックを計算するとき、期間の開始と終了が決定され、データ抽出関数が呼び出され(上記のコード)、このデータが計算され、最後に95パーセントの数字またはギガバイトが発行されます。 95%は平均5分セグメントと見なされ、1メガバイトは1000 * 1000ビット/秒に相当し、ギガバイトは1024 * 1024 * 1024バイトです。 これらの数字に名前を付けると、普通の人のかなりの割合が混乱しますが、驚くことではありません:)。
建設的な批判を見越して、
ServerClub専用サーバー 。