Man вики
Нет описания правки
 
(не показано 25 промежуточных версий этого же участника)
Строка 8: Строка 8:
   
 
Всю собранную информацию сохраняем в базе mysql на сервере статистики. Таким образом на стороне клиента достаточно иметь установленный SSH сервер.
 
Всю собранную информацию сохраняем в базе mysql на сервере статистики. Таким образом на стороне клиента достаточно иметь установленный SSH сервер.
  +
=Получение данных=
 
==Установка компонентов==
 
==Установка компонентов==
 
Установим компоненты
 
Установим компоненты
Строка 13: Строка 14:
 
Создадим каталог и подготовим базу данных
 
Создадим каталог и подготовим базу данных
 
mkdir /etc/mystathost
 
mkdir /etc/mystathost
nano /etc/mystathost/createdb.sql
+
nano /etc/mystathost/createdb.sql
  +
Напишем запрос на создание базы
 
 
USE mystathost;
 
USE mystathost;
 
CREATE TABLE
 
CREATE TABLE
Строка 26: Строка 27:
 
trafrx BIGINT,
 
trafrx BIGINT,
 
traftx 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
mysqladmin create mystathost -p
 
  +
100.100.100.100;root;123456;eth0;192.168.0.100
  +
Для каждого канала отдельная строка, даже если сервер один и тот-же. Например можно проверять как внешние так и внутренние каналы филиала.
  +
nano /etc/mystathost/pinggw
  +
<source lang="bash">
  +
#!/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
  +
</source>
  +
Делаем скрипт исполняемым
  +
chmod +x /etc/mystathost/pinggw
  +
И запускаем
  +
/etc/mystathost/pinggw
  +
Если все в порядке и данные успешно записаны в базу то выполнив запрос мы увидим последние 10 записей.
  +
  +
Зайдем в консоль MySQL сервера под нашим пользователем и паролем
  +
mysql -u'''mystathost''' -p'''mYs1Pa_swD'''
  +
и выполним:
  +
  +
<source lang="sql">
  +
USE mystathost;
  +
select * from pinggw
  +
order by datetime desc
  +
limit 10;
  +
</source>
  +
Если данные появились, можно прописать скрипт на автоматическое выполнение с помощью cron-а. Назначим выполнение раз в минуту:
  +
echo "* * * * * root /etc/mystathost/pinggw" >> /etc/crontab
  +
Если данные есть
  +
  +
=Анализ данных=
  +
Примеры запросов для извлечения данных
  +
==Сводная таблица усредненных потерь по каналам==
  +
<source lang="sql">
  +
USE mystathost;
  +
SELECT
  +
hostip,
  +
hosteth,
  +
hostgwip,
  +
round(avg(pinglost),1) as lost
  +
FROM pinggw
  +
group by hostgwip
  +
order by avg(pinglost) desc;
  +
</source>
  +
  +
==Статистика стабильности канала за период==
  +
<source lang="sql">
  +
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;
  +
</source>
   
  +
==Суммарный входящий трафик интерфейса за период в Мбайтах==
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="95.143.8.33" order by datetime) as math1;
 
  +
<source lang="sql">
  +
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;
  +
</source>

Текущая версия от 04:58, 4 июня 2012

Задача[]

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

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

Метод сбора и агрегирования статистики[]

Статистику будем получать, подключаясь к удаленным хостам на базе 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;