Строка 93: | Строка 93: | ||
И запускаем |
И запускаем |
||
/etc/mystathost/pinggw |
/etc/mystathost/pinggw |
||
− | Если все в порядке и данные успешно записаны в базу то выполнив запрос мы увидим последние |
+ | Если все в порядке и данные успешно записаны в базу то выполнив запрос мы увидим последние 10 записей. |
+ | |||
− | mysql -p |
||
+ | Зайдем в консоль MySQL сервера под нашим пользователем и паролем |
||
+ | mysql -u'''mystathost''' -p'''mYs1Pa_swD''' |
||
<source lang="sql"> |
<source lang="sql"> |
Версия от 08:51, 3 июня 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');"
# echo "`date`;$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
limit 10;
Анализ данных
Статистика стабильности канала за период
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.0.34.1';
SET @hosteth:='eth1';
SET @firstdata:='2012/06/03 18:00:00';
SET @lastdata:='2012/06/03 23:59:59';
use mystathost;
set @hvo:=0;
set @blrx:=RAND();
set @rx:=0;
select sum(TRx)
from
(select
min(datetime),
max(datetime),
min(tfrx),
max(tfrx),
max(tfrx)-min(tfrx)+max(hvst) 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;