ФЭНДОМ


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

Выполнять подсчет доступности удаленных хостов (процент доступности)за произвольный период времени.

Принцип работыПравить

  1. Скрипт на bash будет выполнятся с некоторым интервалом производить пингование нужных хостов и сохранять результаты проверки в базу данных на mysql
  2. Путем запроса к базе данных мы получаем значение доступности канала за произвольный период

Средства и методыПравить

Операционная система

  • ubuntu server 10.04 LTS

Сервер баз данных mysql5

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

apt-get update
apt-get install mysql-server mysql-client

При установке сервера запоминаем пароль который установили

Создание базыПравить

Создаем пустую базу

mysqladmin create pingmysql -p

Заходим в консоль сервера mysql

mysql -p

Выполняем запрос, который создаст таблицу stat в нашей базе с нужными полями, а затем создаст пользователя pingmysql с паролем pngsqlpass под которым мы будем работать с нашей базой в дальнейшем

USE pingmysql;
CREATE TABLE stat (
stdate           datetime NOT NULL default '0000-00-00 00:00:00',
ipaddr           varchar(40),
transmitted      SMALLINT,
received         SMALLINT,
loss             SMALLINT,
time             SMALLINT
);
grant usage on *.* to pingmysql@localhost identified by 'pngsqlpass';
grant all privileges on pingmysql.* to pingmysql@localhost;
exit

Создаем скриптПравить

Создадим скрипт, который будет опрашивать указанный в качестве аргумента хост и записывать результат в базу.

nano /etc/pingmysql

Скопируем и вставим:

mysqlusr=pingmysql
mysqlpass=pngsqlpass
check_period="2s" # Частота опроса
packet_count=10
ipaddr=$1

while [ 1 ]
do

rn=$RANDOM
ping $ipaddr -f -c $packet_count | grep 'packets transmitted' | sed -r 's/packets transmitted|received|packet loss|%|time |ms|\s+//g' >tmpping-$rn
stdate=`date +"%Y-%m-%d %T"`
transmitted=`awk -F ',' '{print $1}' tmpping-$rn`
received=`awk -F ',' '{print $2}' tmpping-$rn`
loss=`awk -F ',' '{print $3}' tmpping-$rn`
time=`awk -F ',' '{print $4}' tmpping-$rn`

echo "use pingmysql;INSERT INTO stat (stdate,ipaddr,transmitted,received,loss,time) \
values ('$stdate','$ipaddr','$transmitted','$received','$loss','$time');"  >tmppingsql-$rn

mysql -u$mysqlusr -p$mysqlpass < tmppingsql-$rn
rm tmpping-$rn tmppingsql-$rn

sleep ${check_period}
done

Делаем скрипт загрузочным

chmod +x /etc/pingmysql

Запускаем так (имя_скрипта контролируемый адрес и знак &)

/etc/pingmysql 10.0.32.1 &
  • Одна запись в базу имеет размер 32 байта. Таким образом за месяц при интервале опроса раз в 2 секунды и одном контролируемом адресе получаем размер:
32*60/2*60*24*31/1024/1024=40,9 Мбайт/месяц

Статистика из базыПравить

Для выполнения запросов заходим в консоль mysql

mysql -p

Запрос на подсчет доступности хостов

use pingmysql;select ipaddr as host,avg(time) as avg_response,sum(received)/sum(transmitted)*100 as availability from stat group by ipaddr;