Фэндом


ЗадачаПравить

Необходимо контролировать работу каналов связи на удаленных точках (филиалах) и вести централизованную статистику по следующим параметрам:

  • Время отклика и потери до произвольных хостов (например до шлюзов провайдеров)
  • Объемы прокачанного трафика и нагрузки на каналы

Метод сбора и агрегирования статистикиПравить

Статистику будем получать, подключаясь к удаленным хостам на базе OS Linux Ubuntu через SSH протокол. Затем на удаленном хосте запускаем пинг-флуд на несколько десятков пакетов, а затем парсим результат (среднее значение отклика и процент потерь пакетов). Кроме этого снимаем значения счетчиков принятого и переданного трафика на контролируемых интерфейсах.

Всю собранную информацию сохраняем в базе mysql на сервере статистики. Таким образом на стороне клиента достаточно иметь установленный SSH сервер.

Получение данныхПравить

Установка компонентовПравить

Установим компоненты

apt-get install mysql-server mysql-client sshpass

Создадим каталог и подготовим базу данных

mkdir /etc/mystathost
nano /etc/mystathost/createdb.sql

Напишем запрос на создание базы

USE mystathost;
CREATE TABLE
 pinggw (
  datetime DATETIME,
  hostip VARCHAR(20),
  hosteth VARCHAR(10),
  hostgwip VARCHAR(20),
  pinglost TINYINT,
  pingavg FLOAT(3),
  trafrx BIGINT,
  traftx BIGINT);
# Тут назначим права и разрешим удаленное подключение к базе
# Пользователь mystathost
# Пароль mYs1Pa_swD
grant usage on *.* to mystathost@localhost identified by 'mYs1Pa_swD';
grant all privileges on mystathost.* to mystathost@localhost;
exit

Создадим новую базу mystathost

mysqladmin create mystathost -p

Выполним запрос на создание структуры и прав.

mysql -p < /etc/mystathost/createdb.sql

Структура базы готова.

Заполнение базыПравить

Создадим список доступа к удаленным серверам и контролируемых на них каналов. Каждый канал записывается одной строкой с разделением значений знаком ; (точка с запятой) в следующей последовательности

  • Адрес сервера для подключения по SSH;пользователь SSH;пароль SSH;Имя контролируемого интерфейса;Адрес, который будем пинговать
nano /etc/mystathost/ping-hosts
100.100.100.100;root;123456;eth1;100.100.100.1
100.100.100.100;root;123456;eth0;192.168.0.100

Для каждого канала отдельная строка, даже если сервер один и тот-же. Например можно проверять как внешние так и внутренние каналы филиала.

nano /etc/mystathost/pinggw
#!/bin/bash
########### Параметры ############# 
dbuser=mystathost
dbpass=mYs1Pa_swD
dbname=mystathost
dbtable=pinggw
pwdhosts=/etc/mystathost/ping-hosts
###################################
 
exec 10<$pwdhosts
while read line <&10 ; do
 IFS=";"
 set -- $line
 hostip=$1
 hostus=$2
 hostpw=$3
 hosteth=$4
 hostgwip=$5
 
if [ "${line}" != "" ] 
then
  pingrez=`sshpass -p $hostpw ssh -o StrictHostKeyChecking=no $hostus@$hostip \
           ping -I $hosteth -f $hostgwip -c 100 -s 32|grep -o -P "\d+(?=% packet loss)|\d+\.\d+(?=/\d+.\d+/\d+.\d+ ms,)"|tr "\n" "|"`
  pinglost=`echo $pingrez|awk -F "|" '{print $1}'`
  pingavg=`echo $pingrez|awk -F "|" '{print $2}'`
 
  trafif=`sshpass -p $hostpw ssh -o StrictHostKeyChecking=no $hostus@$hostip cat /sys/class/net/$hosteth/statistics/rx_bytes /sys/class/net/$hosteth/statistics/tx_bytes|tr "\n" "|"`
  trafrx=`echo $trafif|awk -F "|" '{print $1}'`  
  traftx=`echo $trafif|awk -F "|" '{print $2}'`
  datetime=`date +"%Y/%m/%d %T"`
 
mysql -u$dbuser -p$dbpass -D $dbname -e "INSERT INTO $dbtable (datetime,hostip,hosteth,hostgwip,pinglost,pingavg,trafrx,traftx) \
      values ('$datetime','$hostip','$hosteth','$hostgwip','$pinglost','$pingavg','$trafrx','$traftx');"
 
fi
 
done

Делаем скрипт исполняемым

chmod +x /etc/mystathost/pinggw

И запускаем

/etc/mystathost/pinggw

Если все в порядке и данные успешно записаны в базу то выполнив запрос мы увидим последние 10 записей.

Зайдем в консоль MySQL сервера под нашим пользователем и паролем

mysql -umystathost -pmYs1Pa_swD

и выполним:

USE mystathost;
SELECT * FROM pinggw 
ORDER BY datetime DESC
LIMIT 10;

Если данные появились, можно прописать скрипт на автоматическое выполнение с помощью cron-а. Назначим выполнение раз в минуту:

echo "* * * * * root /etc/mystathost/pinggw" >> /etc/crontab

Если данные есть

Анализ данныхПравить

Примеры запросов для извлечения данных

Сводная таблица усредненных потерь по каналамПравить

USE mystathost;
SELECT 
 hostip,
 hosteth,
 hostgwip,
 round(avg(pinglost),1) AS lost 
FROM pinggw  
 GROUP BY hostgwip 
 ORDER BY avg(pinglost) DESC;

Статистика стабильности канала за периодПравить

SET @hostip:='10.0.34.1';               # Адрес удаленного сервера
SET @hostgwip:='95.143.8.33';           # Адрес контролируемого хоста на сервере
SET @firstdata:='2012/06/02 00:00:00';  # Дата и время начала периода
SET @lastdata:='2012/06/02 23:59:59';   # Дата и время окончания периода
USE mystathost;
SET @rx:=0;
SET @trx:=0;
SET @dateprev:=now();
SELECT 
 datetime,
 hostip,
 hosteth,
 hostgwip,
 pinglost,
 pingavg,
 round(rxt/secint/1024*8,2) AS RxKbps,
 round(trxt/secint/1024*8,2) AS TxKbps
FROM 
 (SELECT 
   UNIX_TIMESTAMP(datetime)-@dateprev AS secint,
   @dateprev:=UNIX_TIMESTAMP(datetime) AS ut,
   trafrx-@rx AS rxt,
   traftx-@trx AS trxt,
   @rx:=trafrx,
   @trx:=traftx,
   datetime,
   hostip,
   hosteth,
   hostgwip,
   pinglost,
   pingavg 
 FROM pinggw 
  WHERE hostgwip = @hostgwip
    AND hostip=@hostip
    AND datetime >= @firstdata
    AND datetime <= @lastdata
  ORDER BY datetime) 
 AS math1;

Суммарный входящий трафик интерфейса за период в МбайтахПравить

SET @hostip:='10.2.64.1';
SET @hosteth:='eth1';
SET @firstdata:='2012/06/01 18:00:00';
SET @lastdata:='2012/06/05 23:59:59';
USE mystathost;
SET @hvo:=0;
SET @blrx:=RAND();
SET @rx:=0;
SELECT SUM(TRx) AS Rx_Mb 
FROM 
 (SELECT 
  MIN(datetime),
  MAX(datetime),
  MIN(tfrx),
  MAX(tfrx),
  Round((MAX(tfrx)-MIN(tfrx)+MAX(hvst))/1024/1024,2) AS TRx,
  MAX(hvst) 
  FROM 
  (SELECT 
   hostip,
   datetime,
   IF(trafrx-@rx<0,@blrx:=RAND(),0)AS prv,
   IF(trafrx-@rx<0,@hvo:=trafrx,0)AS hvst,
   @rx:=trafrx AS tfrx, 
   @blrx AS blrx 
   FROM pinggw 
   WHERE hostip=@hostip
     AND hosteth=@hosteth
     AND datetime >= @firstdata
     AND datetime <= @lastdata
   ORDER BY datetime) 
  AS tbl1 
   GROUP BY blrx) 
 AS tbl2;

Обнаружено использование расширения AdBlock.


Викия — это свободный ресурс, который существует и развивается за счёт рекламы. Для блокирующих рекламу пользователей мы предоставляем модифицированную версию сайта.

Викия не будет доступна для последующих модификаций. Если вы желаете продолжать работать со страницей, то, пожалуйста, отключите расширение для блокировки рекламы.

Также на Фэндоме

Случайная вики