Связь биллинга и Cisco Catalyst 2960 через SNMP. Изменение скорости портов, подсчет ...

:

Как и обещали, после приветствия, начинаем немножко раскрывать технические подробности.

Задача


Дать пользователям возможность выбирать скорость подключения и способ тарификации для каждого из их серверов. Дать администраторам возможность переключать скорость канала или вовсе тушить порт через админскую панель.

Железо


В каждой стойке стоит как минимум один свич Cisco Catalyst 2960. Конкретная модель — WS-C2960G-48TC-L with LANBASE SPF. На вход к нему идет 4x SFP, а к серверам обращены 48 гигабитных Ethernet портов. При живой нагрузке в несколько гигабит никаких проблем не возникало. На фото различные представители семейства 2960.
image

Скорость и статус порта

Со стороны пользователя все выглядит довольно просто:

В случае выбора подключения 10 мбит, нижние опции пропадают, так как трафик в этом случае бесплатный. Опция лимитирования трафика по израсходованию предоплаченного объема обусловлена заботой о пользователях, ведь по 95th policy, если вы качали на скорости гигабит 36 часов, а после этого вообще не пользовались каналом, то счет будет как раз за полный гигабит. Представляете, пока вы уезжали на выходные на рыбалку, вам устроили Хабра-эффект и тысячи пользователей непрерывно скачивают образ вашей виртуальной машины, который был выложен вами на своем сервере и может помочь многим разработчикам, a в понедельник обнаружите -$2000 на счете в хостинге. Такой понедельник будет особенно тяжелым. В нашем случае через 24 часа порт переключится на 10 мегабит, либо через 36 часов трафик будет докупаться равными порциями до достижения финансового лимита конкретного пользователя.

Со стороны бекенда всю работу за нас, на самом деле, уже сделали инженеры Cisco, а для управления их устройствами мы воспользуемся протоколом SNMP (Simple Network Management Protocol), который был создан еще в 1988 году, а закреплен в 1990 ( RFC 1157) группой хэкеров (в оригинальном значении этого слова), во главе которой был J.D. Case, за что ему отдельное спасибо.

Для работы этой функции необходимо включить поддержку SNMP на вашем свиче, а также не забыть указать communtity и разрешить для этого community выполнять операции не только на чтение, но и на запись. Функция на 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);

}

Соответственно, вызывается при сетапе сервера, достижении лимита, окончании аренды итд.

Порт можно выключать двумя способами — установкой скорости равной порта 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 часов без значения шкал (на то она и искроргафика — в виджетах места мало). Цифра показывает текущее использование канала.

Под списком серверов выводится общий график для всех серверов (к биллингу отношения не имеет, трафик биллится индивидуально для каждого сервера)

Ну и график конкретного сервера — это уже полноценное отображение в более крупном формате, с возможностью выбора промежутка времени. По этим показателям уже формируется счет за bandwidth.

Красная линия отмеряет 95%. Все, что выше, не тарифицируется. Как видим этот пользователь пережил Хабраэффект бесплатно и без единого разрыва :). Ну и кто не видел — наша панель целиком.

Для сбора статистики с портов свчитча мы используем пакет cacti. После того как cacti снял и обработал информацию, он записывает данные в rrd файл по каждому порту. В этом файле накапливается статистика за весь период работы порта. В дальнейшем мы можем извлечь эту информацию и проводить любые операции, будь то подсчет трафика за определенный период или отрисовка графика для клиента. Ниже приведена функция, для извлечения данных из этого файла для дальнейшей пост-обработки c помощью утилиты 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% считается усредненными пятиминутными отрезками, 1 мегабит равняется 1000*1000 бит в секунду, а гигабайт это 1024*1024*1024 байт. Внушительный процент обывателей сбивается при назывании этих цифр, да и не мудрено :).

В предвкушении конструктивной критики,
ServerClub Dedicated Servers.