RRDtool
Этот текст содержит переведенные материалы официальной документации RRDtool |
RRDtool — программа для работы с RRD (Round-robin Database, кольцевая база данных).
RRDtool | |
RRDtool позволяет создавать графики на основании данных из базы RRD
| |
Автор | Tobias Oetiker |
Написана на | C, Perl |
Последняя версия | 1.4.5 (27.12.2010) |
Лицензия | GNU GPL |
Сайт | http://oss.oetiker.ch/rrdtool/ |
Создана Тоби Отикером (Tobias Oetiker) для хранения, обработки и визуализации динамических (изменяющихся во времени) последовательностей данных, таких как сетевой трафик, температура, загрузка процессора и так далее. Все данные хранятся в кольцевой базе, размер которой остаётся неизменным.
Уменьшение объема хранимой информации производится за счет использования функций консолидации данных, что позволяет охватывать большие интервалы времени без чрезмерного увеличения объема БД за счет ступенчатого снижения разрешения хранимых данных.[1]
Обеспечение равномерности информации производится за счет интерполяции аберраций данных.
RRDtool включают в себя возможность графического отображения хранимой информации. Данный набор утилит распространяется под лицензией GNU GPL.
Список утилит
правитьПодробное описание смотрите ниже, для быстрого перехода нажмите на названии утилиты.
- rrdtool — утилита для работы с кольцевой базой данных
- rrdcached — демон для кеширования данных
- librrd — набор библиотек
- rrdbuild — инструменты для сборки программ
- rrdcgi — инструменты для создания веб-страниц с графиками на основе шаблонов
- rrdcreate — программы для создания новых баз данных
- rrddump — утилита совершающая дамп информации в формате XML
- rrdfetch — утилиты для получения информации из кольцевой базы данных
- rrdfirst — утилита которая возвращает первый набор данных, так называемый RRA (англ. round robin archive)[2]
- rrdflushcached — сброс кеша для конкретной базы
- rrdgraph — набор утилит для обеспечения графических функций
- rrdgraph_data — функции предварительной подготовки данных для rrdgraph
- rrdgraph_examples — примеры использования rrdgraph
- rrdgraph_graph — CLI (англ. Command Line Interface) интерфейс командной строки для rrdgraph
- rrdgraph_libdbi — выборка информации посредством libdbi для последующей визуализации
- rrdgraph_rpn — инструмент стековой обработки в формате обратной польской записи RPN (англ. Reverse Polish Notation)
- rrdinfo — выводит информацию о конкретной базе данных
- rrdlast — утилита которая возвращает последний набор данных, так называемый RRA (англ. round robin archive)
- rrdlastupdate — возвращает самую актуальную информацию на текущий момент
- rrdresize — изменяет размер RRA (англ. round robin archive) и создает новый файл типа .rrd
- rrdrestore — восстанавливает данные из ранее созданного дампа в формате XML
- rrdtune - утилита для настройки основных параметров RRD
- rrdupdate — внесение нового набора данных в базу
- rrdxport — экспортирует данные (в XML формат) из одной или нескольких баз
Описание программ и синтаксис команд
править- Синтаксис:
rrdtool - [workdir]| function
- workdir — рабочая директория
- function — одна из функций (параметр)
Когда вы используете команду с ключом «-», то rrdtool ожидает поступления данных из стандартного потока ввода (STDIN). В Unix подобных операционных системах (конечно речь идет о Linux:) это позволяет выполнять команду в конвейерном контексте.
Конвейер используется для объединения команд. Объединение команд с помощью конвейера — это ключевая техника программирования в командной оболочке UNIX подобных ОС. В этой модели каждая команда выполняет одну задачу и передает результат своей работы другой команде, которая также выполняет свою задачу, и так далее. Например, можно с помощью программы cat передать через конвейер содержимое файла команде grep, которая через конвейер передает все найденные строки команде rrdtool, которая сохранит данные.[3] Чтобы выполнить несколько команд в конвейерном контексте их указывают одну за другой разделяя знаком «|».
В конвейерном контексте RRDtool принимает те же аргументы, что и в одиночном режиме и ряд дополнительных команд, таких как: quit, cd, mkdir и ls. Чтобы получить детальную информацию о этих командах введите:
rrdtool help cd|mkdir|pwd|ls|quit
В случае удачного выполнения команды RRDtool выведет на экран 'OK', в случае возникновения ошибки 'ERROR:' с описанием ошибки.
Если указан параметр workdir, и идентификатор пользователя (UID) равен 0, то RRDtool выполнит команду chroot. Если же UID будет иметь значение отличное от нулевого, то RRDtool просто сменит текущий каталог на workdir.
Список параметров (функций)
править- Подробное описание смотрите ниже для программ синонимов.
функция | синоним | краткое описание |
---|---|---|
create | rrdcreate↓ | Cоздает новую базу данных RRD (Round Robin Database). |
update | rrdupdate↓ | Запись новых данных в БД RRD. |
updatev | rrdupdate↓ | Аналог update но с более подробным выводом в поток вывода. |
graph | rrdgraph↓ | Строит график на основании данных из нескольких БД. |
dump | rrddump↓ | Создает дамп базы с использованием ASCII символов. |
restore | rrdrestore↓ | Восстанавливает базу данных из XML файла. |
fetch | rrdfetch↓ | Выборка за определенный период. |
tune | rrdtune↓ | Настройка RRD. |
last | rrdlast↓ | Выводит время последнего обновление информации в базе. |
info | rrdinfo↓ | Выводит информацию о БД. |
rrdresize | rrdresize↓ | Изменяет размер для каждого из архивов RRA. Это может быть опасно! |
xport | rrdxport↓ | Экспортирует данные из одной или нескольких баз. |
flushcached | rrdflushcached↓ | Удаляет информацию из оперативной памяти для конкретной БД. |
rrdcgi | rrdcgi↓ | Самостоятельный инструмент для создания графиков «на лету». |
- Синтаксис:
rrdcached [-P permissions] [-l address] [-s group] [-w timeout] [-z delay] [-f timeout] [-p pid_file] [-t write_threads] [-j journal_dir] [-F] [-g] [-b base_dir [-B]]
rrdcached — это демон, который кэширует данные, записываемые в базу данных RRD, и после накопления определенного объема (по истечении лимита времени), записывает данные в базу. Кэширование необходимо когда RRDtool обрабатывает очень большое количество запросов на запись данных за единицу времени, чтобы уменьшить количество операций записи на жесткий диск.
Для освобождения кэша и принудительной записи данных используется команда rrdflushcached. Принудительное освобождение кэша используется когда необходимо построить график (или просто сделать выборку) гарантированно используя все данные.
librrd — это основная библиотека функций RRDTool. Большинство утилит командной строки, входящих в пакет RRDTool, являются только интерфейсами для функций библиотеки librrd
Таком образом librrd описывает API для RRDtool. Рассмотрим некоторые функции этого API.
rrd_dump_cb_r()
правитьrrd_dump_cb_r(char *filename, int opt_header, rrd_output_callback_t cb, void *user)
В отличие от функции rrd_dump_opt_r(), функция rrd_dump_cb_r() производит дамп базы данных без вывода в стандартный поток вывода (или файл). Вместо вывода информация передается пользовательской функции обратного вызова (англ. callback).
Примером использования этой функции может служить обработка дампа XML парсером перед сохранением.
Аргументы этой функции аналогичны аргументам функции rrd_dump_opt_r(), за исключением указания пользовательской функции обратного вызова rrd_output_callback_t cb и дополнительного параметра void *user, который нужен только для обеспечения корректного функционирования пользовательской функции.
В последних версиях RRDtool функция rrd_dump_opt_r() также использует механизм обратного вызова для записи информации в файл.
rrd_random()
правитьrrd_random()
Функция возвращает случайное число как оператор random(), но данная функция гарантирует неповторимость чисел для каждого из процессов.
rrd_add_ptr()
правитьrrd_add_ptr(void ***dest, size_t *dest_size, void *src)
Динамически изменяет размер массива по адресу dest. dest_size -- указатель на текущий размер архива dest. В случае удачного изменения размера с помощью realloc(), dest_size увеличивается на единицу и указатель src устанавливается на конец нового массива. Возвращает 1 при удачном завершении и 0 в случае возникновения ошибки. Пример:
type **arr = NULL; type *elem = "whatever"; size_t arr_size = 0; if (!rrd_add_ptr(&arr, &arr_size, elem)) handle_failure(); // обработчик ошибок
rrd_add_strdup()
правитьrrd_add_strdup(char ***dest, size_t *dest_size, char *src)
Функция аналогична rrd_add_ptr, только она добавляет strdup типа string.
Пример:
char **arr = NULL; size_t arr_size = NULL; char *str = "example text"; // строка if (!rrd_add_strdup(&arr, &arr_size, str)) handle_failure(); // обработчик ошибок
rrd_free_ptrs()
правитьrrd_free_ptrs(void ***src, size_t *cnt)
Очищает массив указателей созданных фукцией rrd_add_ptr или rrd_add_strdup. Указатель на сам массив тоже стирается. В результате src будет равен NULL и cnt будет равен нулю.
Пример:
/* created as above */ rrd_free_ptrs(&arr, &arr_size); /* here, arr == NULL && arr_size == 0 */
rrd_mkdir_p()
правитьrrd_mkdir_p(const char *pathname, mode_t mode)
Создает директорию с путем и именем pathname включая все родительские папки, указанные в пути (аналогично выполнению mkdir с ключем -p в командной строке). Аргумент mode указывает права, которые задаются с помощью umask. Для более подробной информации выполните man mkdir в командной строке.
Функция возвращает 0 в случае удачного выполнения всех операций и отрицательное значение в случае возникновения ошибки. Код ошибки, в случае ее возникновения, записывается в переменную errno. Кроме стандартных кодов ошибок команды mkdir функция может завершиться по следующим причинам:
- EINVAL
- pathname имеет значение NULL или является пустой строкой.
- ENOMEM
- Недостаточно памяти для выполнения операции.
Коды ошибок возвращаются с помощью утилиты stat(2).
Также как mkdir(2), функция отработает успешно если pathname уже существует и является директорией.
- Синтаксис:
#!/path/to/rrdcgi [--filter]
rrdcgi -- это парсер скриптов с ограниченным набором функций. Как вы заметили эта утилита запускается в CGI контексте с семантикой C-shell. Строка с описанным синтаксисом помещается в начало файла. Главное ее назначение находить и обрабатывать (заменять) в скриптах специальные дескрипторы <RRD::. Программа должна их интерпретировать и сформировать готовую HTML страницу.
Парсер анализирует шаблон в три этапа, на каждом этапе анализируются определенные группы дескрипторов. Это позволяет использовать вложенные дескрипторы.
Параметр --filter указывает, что rrdcgi запускается не в CGI контексте, а как фильтр.
Дескрипторы
правитьRRD::CV name
- Вставляет значение CGI переменной с именем name
RRD::CV::QUOTE name
- Вставляет значение CGI переменной с именем name, заключая его в кавычки, что делает возможным его дальнейшее использование в других RRD:: дескрипторах.
RRD::CV::PATH name
- Вставляет значение CGI переменной с именем name, заключая его в кавычки и проверяет чтобы переменная не начиналась с символов '/' и '..'. Это предотвращает вывод проблемных путей.
RRD::GETENV variable
- Получает значение переменной окружения
<RRD::GETENV REMOTE_USER>
- должно выдать имя удаленного пользователя, позволяя программисту создать некое подобие контроля доступа.
RRD::GOODFOR seconds
- Определяет количество секунд в течении которых страница остается актуальной. При использовании этого дескриптора в начало документа добавляются HTTP заголовки Last-Modified, Expire и если число секунд отрицательное Refresh.
RRD::INCLUDE filename
- Включает содержимое указанного файла в файл.
RRD::SETENV variable value
- Дескриптор служит для смещения часового пояса относительно UTC:
<RRD::SETENV TZ UTC>
- все значения времени будут показаны для часового пояса пользователя. Значение часового пояса TZ задается в формате вашей операционной системы.
RRD::SETVAR variable value
- Аналог SETENV но для локальных переменных.
RRD::GETVAR variable
- Аналог GETENV но для локальных переменных.
RRD::TIME::LAST rrd-file strftime-format
- Изменяет дату последнего изменения для определенной БД RRD.
RRD::TIME::NOW strftime-format
- Возвращает текущее время. Обратите внимание на то, что если в строке форматировани strftime-format вы будете использовать двоеточие, то его необходимо экранировать обратным слэшом (\:), это позволит в дальнейшем использовать результат как аргумент команды GRAPH.
RRD::TIME::STRFTIME START|END start-spec end-spec strftime-format
- Данные дескриптор заменяется временем, которое отформатировано по заданному шаблону. Используется для трансформирования отрезков времени для более понятного пользователю отображения.Обратите внимание на то, что если в строке форматировани strftime-format вы будете использовать двоеточие, то его необходимо экранировать обратным слэшом (\:), это позволит в дальнейшем использовать результат как аргумент команды GRAPH. Детальную информацию смотрите в официальной документации.
RRD::GRAPH rrdgraph arguments
- Этот дескриптор заменяется графиком RRD, который отображает данные заданные в arguments, которые идентичны аргументам для утилиты rrdgraph. Опция --lazy задает режим в котором график обновляется только если время его актуальности истекло (т.е. один раз в заданный интервал), это позволяет снизить нагрузку на сервер.
- Если вы не указали свой формат с помощью --imginfo, то будет использован формат по умолчанию:
<IMG SRC="%s" WIDTH="%lu" HEIGHT="%lu">
- где %s — относительный путь к PNG файлу графика.
RRD::PRINT number
- Если при использовании дескриптора RRD::GRAPH был указан аргументы PRINT, тогда результат его работы может быть обратотан дескриптором RRD::PRINT. number — это номер аргумента, причем первый аргумент имеет номер 0. Детальную информацию смотрите в официальной документации.
RRD::INTERNAL <var>
- Этот дескриптор заменяется значением предопределенной внутренней переменной (VERSION, COMPILETIME).
Примеры
править- Простая HTML страница с единственным графиком:
#!/usr/local/bin/rrdcgi
<html>
<head><title>RRDCGI Demo</title></head>
<body>
<h1>RRDCGI Example Page</h1>
<p>
<RRD::GRAPH demo.png --lazy --title="Temperatures"
DEF:cel=demo.rrd:exhaust:AVERAGE
LINE2:cel#00a000:"D. Celsius">
</p>
</body>
</html>
- График с формой выбора RRD БД в качестве источника данных:
#!/usr/local/bin/rrdcgi
<html>
<head><title>RRDCGI Demo</title></head>
<body>
<h1>RRDCGI Example Page for <RRD::CV RRD_NAME></h1>
<h2>Selection</h2>
<form><input name="RRD_NAME" type="radio" value="roomA"> Room A,
<input name="RRD_NAME" type="radio" value="roomB"> Room B.
<input type="submit"></form>
<h2>Graph</h2>
<p>
<RRD::GRAPH <RRD::CV::PATH RRD_NAME>.png --lazy
--title "Temperatures for "<RRD::CV::QUOTE RRD_NAME>
DEF:cel=<RRD::CV::PATH RRD_NAME>.rrd:exhaust:AVERAGE
LINE2:cel#00a000:"D. Celsius">
</p>
</body>
</html>
- Синтаксис:
rrdtool create filename [--start|-b start time] [--step|-s step] [--no-overwrite] [DS:ds-name:DST:dst arguments] [RRA:CF:cf arguments]
Эта утилита создает все необходимые файлы для новой кольцевой базы данных RRD. После создания у файлов будет заданный размер (который не меняется) и все поля будут заполнены данными неопределенного типа *UNKNOWN*.
filename
- Имя базы данных, которая должна быть создана. Файлы RRD должны заканчиваться расширением .rrd, но rrdcreate воспринимает корректно любые имена даже без расширения вообще.
--start|-b start time (default: now - 10s)
- Время для первой записи в UNIX формате, запись данных раньше этого времени будет не возможна.
--step|-s step (default: 300 seconds)
- Устанавливает базовый интервал между данными в RRD.
no-overwrite
Я долго думал как перевести оригинальный текст с английского, но перевести точнее чем Google Translate оказалось трудно:
Do not clobber an existing file of the same name.
Не колошматить существующий файл с тем же названием.
--no-overwrite
- Не переписывать существующие файлы, т.е. если файл базы уже существует, то отменить создание новой базы.
DS:ds-name:DST:dst arguments
- Одна база данных RRD может хранить данные из нескольких источников (англ. data sources, DS). Опция DS позволяет определить основные свойства для каждого источника данных для данной БД.
- ds-name — это имя источника данных. Оно может быть длинной от одного до 19 символов, которые входят в множество [a-zA-Z0-9_].
- DST определяет тип хранимых данных: GAUGE | COUNTER | DERIVE | ABSOLUTE | COMPUTE. Подробнее о типах читайте в разделе типы данных.
- Остальные аргументы выбираются в зависимости от выбранного типа данных. Для GAUGE, COUNTER, DERIVE и ABSOLUTE формат выглядит так:
DS:ds-name:GAUGE | COUNTER | DERIVE | ABSOLUTE:heartbeat:min:max
- Для типа COMPUTE так:
DS:ds-name:COMPUTE:rpn-expression
MIN, MAX
Если вы располагаете информацией о минимальном и/или максимальном значении для данных, то обязательно указываете эти значения явно, это позволит упростить проверку данных для RRDtool при записи в БД.
- heartbeat определяет максимальное количество секунд между двумя обновлениями, по истечении этого значения в соответствующий источник данных будет записано значение *UNKNOWN*.
- min и max определяют ожидаемый диапазон данных для источника данных (DS). Если эти параметры заданы, то любое значение за его пределами будет записано в базу данных как неизвестное — *UNKNOWN*. Допускается явное задание неопределенного значения для этих параметров. Для этого им нужно присвоить значение «U» (без кавычек). Стоит также заметить, что эти параметры определяют диапазон для уже обработанных (вычисленных, см. интерполяция данных) значений данных.
- rpn-expression определяет формулу в формате обратной польской записи RPN (англ. Reverse Polish Notation), для вычисления данных из других источников данных этой же БД. Определение такой формулы эквивалентно использованию аргумента CDEF для команды graph.
- Следующие операторы RPN не поддерживаются для типа данных COMPUTE: COUNT, PREV, TIME и LTIME. К тому же, в RPN формулах для типа данных COMPUTE можно ссылаться только на источники данных имена которых были определены ранее в контексте команды create, также как и аргумент CDEF может ссылаться только на DEF-ы и CDEF-ы определенные ранее в той же команде graph.
RRA:CF:cf arguments
- RRD предназначена для хранения данных в кольцевых (циклических) архивах (round robin archives, RRA). Архивы состоят из наборов данных для определенных источников данных (data-sources, DS), и описываются строкой параметров RRA.
- При записи данных в RRD, для них определяется соответствующий временной интервал, также к данным применимы функции консолидации данных (consolidation function, CF). Вот некоторые из этих функций:AVERAGE, MIN, MAX, LAST. Полный список вы можете найти в главе «консолидация данных».
Обратите внимание, что агрегирование данных неизбежно приводит к потере точности и искажению данных. Главная задача программиста состоит в том, чтобы выбрать статистическую функцию так, чтобы сохранить ключевые свойства данных в процессе агрегации и интерполяции. В крайнем случае интерполяцию можно отключить, подробную информацию вы можете найти в разделе интерполяция данных |
- Формат параметров RRA имеет следующий вид:
RRA:AVERAGE | MIN | MAX | LAST:xff:steps:rows
- xff (от англ. xfiles factor) определяет какая часть интервала консолидации может состоять из неопределенных значений *UNKNOWN*, если консолидированное значение может быть определено (известно). Записывается как скалярное отношение допустимого объема неопределенных данных (primary data points, PDP) к общему числу данных (PDP) для конкретного временного интервала, в виде десятичной дроби в диапазоне от 0 до 1 (включительно).
- Параметр steps определяет какое количество ключевых (primary data points, PDP), опорных точек данных необходимо использовать для вычисления консолидированных данных, которые будут записаны в архив RRA.
- Параметр rows определяет какое количество «поколений» данных остается в архиве RRA. Очевидно, что значение должно быть больше нуля.
- Функции консолидации:
RRA:HWPREDICT:rows:alpha:beta:seasonal period[:rra-num]
RRA:MHWPREDICT:rows:alpha:beta:seasonal period[:rra-num]
RRA:SEASONAL:seasonal period:gamma:rra-num[:smoothing-window=fraction]
RRA:DEVSEASONAL:seasonal period:gamma:rra-num[:smoothing-window=fraction]
RRA:DEVPREDICT:rows:rra-num
RRA:FAILURES:rows:threshold:window length:rra-num
- мы опустим здесь описание функций, т.к. они описаны в разделе «интерполяция данных».
Этот раздел еще не дописан. |
- Синтаксис:
rrdtool dump filename.rrd > filename.xml
[1]
Этот раздел еще не написан. |
Этот раздел еще не написан. |
Этот раздел еще не написан. |
Этот раздел еще не написан. |
Этот раздел еще не написан. |
Этот раздел еще не написан. |
Этот раздел еще не написан. |
Этот раздел еще не написан. |
Этот раздел еще не написан. |
Этот раздел еще не написан. |
Этот раздел еще не написан. |
Этот раздел еще не написан. |
- Синтаксис:
resize filename.rrd rra-num [GROW|SHRINK] rows
ОПИСАНИЕ
filename.rrd - файл RRD, которое вы хотите изменить.
rra-num - идентификатор RRA который вы хотите изменить. информацию по RRA вы можете посмотреть коммандой rrdtool info filename.rrd.
GROW - используется, если вы хотите увеличить архив строк в RRA. Дополнительные строки будут вставлены как самые старые строки.
SHRINK - используется, если вы хотите уменьшить архив строк в RRA. Строки, которые будут удалены, являются самыми старыми.
rows - количество строк, которые вы хотите добавить или удалить.
ПРИМЕР
rrdtool resize filename.rrd 0 GROW 10 - добавим 10 строк в RRA индекс 0
rrdtool resize filename.rrd 0 SHRINK 10 - удалим 10 строк в RRA индекс 0
ЗАМЕТКИ
после изменения RRA создается новый файл resize.rrd в текущем каталоге.
Исходный файл .rrd не изменяется.
- Синтаксис:
rrdtool restore [--range-check|-r] [--force-overwrite|-f] filename.xml filename.rrd
Этот раздел еще не написан. |
Этот раздел еще не написан. |
Этот раздел еще не написан. |
Этот раздел еще не написан. |
Установка RRDtool
правитьПроцесс установки RRDtool из репозитория дистрибутива является тривиальной. Дальше будет описано как установить RRDtool из исходных кодов (rrdbuild).
RRDtool зависит от библиотек и сервисов сторонних разработчиков. Некоторые из этих библиотек могут быть уже установлены в вашей системе на момент установки RRDtool, остальные вам придется установить.
Это руководство предполагает, что вы используете командную оболочку bash. Если вы используете csh/tcsh, то вам придется выполнить команду bash перед началом установки. Эксперты могут обойтись и без этого настроив среду с помощью setenv.
Также предпочитается, что утилиты tar и make которые вы используете представляют собой GNU tar и GNU make, т.е. они должны быть установлены как gtar и gmake в вашей системе.
Если у вас директория /tmp монтируется с опцией noexec (так происходит в RHEL), то вам прийдется указать другую директорию!
Перед началом установки необходимо установить две переменные окружения:
BUILD_DIR=/tmp/rrdbuild INSTALL_DIR=/opt/rrdtool-1.4.5
BUILD_DIR -- директория в которой будет происходить сборка, INSTALL_DIR -- путь для установки программы.
Создайте директорию для компилирования и смените текущий каталог на нее:
mkdir -p $BUILD_DIR cd $BUILD_DIR
Теперь загрузим исходный код, с помощью команды configure проверим наличие в системе всех необходимых зависимостей и запустим комптляцию:
wget http://oss.oetiker.ch/rrdtool/pub/rrdtool-1.4.5.tar.gz gunzip -c rrdtool-1.4.5.tar.gz | tar xf - cd rrdtool-1.4.5 ./configure --prefix=$INSTALL_DIR && make && make install
Если команда configure завершилась с ошибкой, то прочитайте какой библиотеки (программы) нет и установив ее выполните команды:
cd $BUILD_DIR/rrdtool-1.4.5 ./configure --prefix=$INSTALL_DIR make clean make make install
Подробности установки RRDtool в разных дистрибутивах вы можете прочитать на официальной странице документации.
Использование RRDtool
правитьСоздание базы данных
правитьПриведем пример создания простой базы данных. Для создания БД необходимо выполнить команду:[4]
rrdtool create test.rrd \
--start 920804400 \
DS:speed:COUNTER:600:U:U \
RRA:AVERAGE:0.5:1:24 \
RRA:AVERAGE:0.5:6:10
Эта команда создаст файл базы данных с именем test.rrd Данные в базе начинаются с даты 920804400 в UNIX формате, это 7 марта 1999 11:00:00 GMT[5] Наша БД хранит данные из одного источника (DS — data source) с именем «speed», который является счетчиком. Этот счетчик считывает данные с шагом в пять минут (это значение по умолчанию, нет необходимости явно указывать --step=300). Имя источника данных (DS) не может быть длиннее 19 символов.[1]
Архивы
правитьОдна база данных можеть хранить один или несколько наборов данных, которые называются архивами (RRA — round robin archive). На самом деле эти архивы больше похожи на массивы, но название не имеет большого значения. В базе данных, которую мы создали выше, два круговых RRA архива, в одном усредняются значения данных из 24 ячеек (24 раза через каждые 5 минут, всего два часа). Другой архив сохраняет усреднения для шести ячеек (пол часа) и содержит 10 таких средних значений (за последние пять часов).
Как вы догадались архивы, как правило, связаны между собой как матрешки, каждый последующий архив хранит консолидированную (См. консолидация данных ниже) информацию из предыдущего. Один архив считывает данные часто, другой реже сохраняет данные из предыдущего, последующий делает это еще реже и т.д.
Консолидация данных
правитьВы заметили, что в созданной нами базе мы использовали усреднение, зачем? Оказывается, что если мы будем записывать данные каждую секунду, а потом захотим вывести среднее значение за год, то вычисления и сам процесс выборки из БД может потребовать большого количества ресурсов. Для того чтобы избежать этого в RRDtool консолидация данных происходит при записи, а не во время считывания. Периодов консолидации может быть сколько угодно (неделя, месяц, квартал, год...). Для осуществления вычислений используются специальные функции консолидации (CF — consolidation function) это average, которую мы применили выше, minimum, maximum, total и last.
- AVERAGE — усреднение
- MIN — сохраняется минимальное значение
- MAX — сохраняется максимальное значение
- LAST — сохраняется последнее значение
Запись информации
правитьRRDtool сохраняет время в UNIX формате (количество секунд прошедших с 1-го января 1970 г. UTC).
Теперь мы можем записывать в нашу базу данные:
rrdtool update test.rrd 920804700:12345 920805000:12357 920805300:12363 rrdtool update test.rrd 920805600:12363 920805900:12363 920806200:12373 rrdtool update test.rrd 920806500:12383 920806800:12393 920807100:12399 rrdtool update test.rrd 920807400:12405 920807700:12411 920808000:12415 rrdtool update test.rrd 920808300:12420 920808600:12422 920808900:12423
Указываем метку времени и числовое значение полученного параметра поле двоеточия. Количество данных, обновляемых (записываемых) одной командной, не ограничено (вернее ограничено только параметрами операционной системы, которую вы используете).
Чтобы извлечь данные, которые мы записали, из БД можно выполнить команду:
rrdtool fetch test.rrd AVERAGE --start 920804400 --end 920809200
мы получим примерно такой вывод:
920804700: nan 920805000: 4.0000000000e-02 920805300: 2.0000000000e-02 920805600: 0.0000000000e+00 920805900: 0.0000000000e+00 920806200: 3.3333333333e-02 920806500: 3.3333333333e-02 920806800: 3.3333333333e-02 920807100: 2.0000000000e-02 920807400: 2.0000000000e-02 920807700: 2.0000000000e-02 920808000: 1.3333333333e-02 920808300: 1.6666666667e-02 920808600: 6.6666666667e-03 920808900: 3.3333333333e-03 920809200: nan
Неопределенные данные
правитьПредставьте, что пришло время очередной раз записывать данные в базу, но по каким-то причинам данные получить не удалось (ошибка сети), что тогда мы запишем. Оказывается, в такой ситуации мы имеем полное право записать в базу неопределенное значение UNKNOWN. И если в примере выше nan выводится по естественным причинам (просто данных еще нет), то с таким же успехом мы можем сообщить RRDtool, что данные получить не удалось.
Создание графиков
правитьЕсли вы успешно проделали все, что описано выше, то смело выполняйте следующую команду:
rrdtool graph speed.png \ --start 920804400 --end 920808000 \ DEF:myspeed=test.rrd:speed:AVERAGE \ LINE2:myspeed#FF0000
В результате выполнения этой команды будет создано изображение speed.png с графиком. График будет начинаться с значения в 12:00 и заканчиваться значением в 13:00. Если посмотреть параметры команды, то можно увидеть, что мы объявили переменную (DEF, англ. define — определять) с именем myspeed. Значение этой переменной формируется на основании данных из RRA архива speed из БД «test.rrd». Далее мы определили толщину линии равной двум пикселям, цвет линии красный (в шестнадцетиричном представлении в формате RGB — #FF0000).
В последних версиях RRDtool к изображению можно добавить альфа-канал, что позволяет указывать не только цвета но и степень прозрачности.
Вычисления
правитьRRDtool позволяет производить вычисления в процессе генерирования графиков. На графике который мы получили мы видим метки на горизонтальной шкале 12:10, 12:20, 12:30, 12:40 и 12:50. Иногда метки времени не помещаются на графике (например 12:00 и 13:00) поэтому они не отображаются.
Вертикальная шкала отображает значения которые мы ввели при генерировании графика.
Но если наши данные, к примеру, это скорость транспортного средства (км/ч), то при делении на 300 секунд мы получаем очень маленькое значение цены деления. Рассмотрим наши данные, разница между первыми равна 12 (12357-12345). После деления на 300 секунд получаем 0,04, RRDtool отобразит это значение как "40 m", где m означает милли- ("40/1000"). RRDtool просто не знает, что мы оперируем не числами, а физическими единицами.
Если мы отобразим наши значения в метрах, то ситуация изменится (12357000-12345000)/300 = 12000/300 = 40. Для большинства людей такие значения воспринимаются гораздо проще. мы можем исправить ситуацию перезаписав все данные в нашей базе, но есть более простой и удобный способ, мы можем масштабировать график в процессе создания изображения.
rrdtool graph speed2.png \ --start 920804400 --end 920808000 \ --vertical-label m/s \ DEF:myspeed=test.rrd:speed:AVERAGE \ CDEF:realspeed=myspeed,1000,\* \ LINE2:realspeed#FF0000
Знак умножения в приведенном примере экранируется обратным слэшом. Это делается для того чтобы командный процессор не воспринял этот символ как шаблон. Другой способ избежать этого взять всю строку в кавычки. |
После просмотра графика вы увидите, что его вид стал более читабельным. Заметьте, что мы еще добавили метку-пояснение (m/s) к вертикальной оси.
Вычисления в блоке вычисляемого определения (CDEF англ. calculated definition) записаны в форме обратной польской записи (RPN англ. Reverse Polish Notation). Словесно наша запись трактуется как «взять значение myspeed и число 1000; перемножить их между собой».
Теперь мы можем создавать графики с любыми единицами измерения, например км/ч:
rrdtool graph speed3.png \ --start 920804400 --end 920808000 \ --vertical-label km/h \ DEF:myspeed=test.rrd:speed:AVERAGE \ "CDEF:kmh=myspeed,3600,*" \ CDEF:fast=kmh,100,GT,kmh,0,IF \ CDEF:good=kmh,100,GT,0,kmh,IF \ HRULE:100#0000FF:"Maximum allowed" \ AREA:good#00FF00:"Good speed" \ AREA:fast#FF0000:"Too fast"
Здесь мы используем альтернативный способ, упомянутый выше, для экранирования служебных символов командной оболочки. Т.е. заключаем строку в кавычки. |
График преобразился. Кроме изменения единиц измерения мы добавили горизонтальную линию которая отображает максимальную допустимую скорость. Метки теперь отображаются разными цветами в зависимости от числовых значений.
Теоретически нет никаких ограничений на количество математических преобразований в процессе создания графиков (на лету). Давайте рассмотрим следующий график:
rrdtool graph speed4.png \ --start 920804400 --end 920808000 \ --vertical-label km/h \ DEF:myspeed=test.rrd:speed:AVERAGE \ CDEF:nonans=myspeed,UN,0,myspeed,IF \ CDEF:kmh=nonans,3600,* \ CDEF:fast=kmh,100,GT,100,0,IF \ CDEF:over=kmh,100,GT,kmh,100,-,0,IF \ CDEF:good=kmh,100,GT,0,kmh,IF \ HRULE:100#0000FF:"Maximum allowed" \ AREA:good#00FF00:"Good speed" \ AREA:fast#550000:"Too fast" \ STACK:over#FF0000:"Over speed"
В этом примере мы используем интересный трюк, сначала мы записываем данные по условию в буферную переменную 'nonans', затем (в шестой строке) используем ее при определении другой переменной 'CDEF:kmh=myspeed,3600,*'.
Для просмотра изображения графика можно быстренько слепить HTML (XHTML) документ:
<html><head><title>Speed</title></head><body> <img src="speed2.png" alt="Speed in meters per second"> <br /> <img src="speed3.png" alt="Speed in kilometers per hour" /> <br /> <img src="speed4.png" alt="Traveled too fast?" /> </body></html>
Назовите его index.html
Обновление данных
правитьЧасто при использовании RRDtool возникает необходимость обновлять данные в режиме реального времени. Выше мы уже использовали команду update, она принимает одни и более параметров в формате "<время>:<значение>". Если мы хотим обновить информацию по состоянию на текущей момент, то нам нет необходимости указывать время, достаточно вместо времени ввести "N" (англ. now — сейчас).
rrdtool update speed.rrd N:$speed
где $speed — переменная содержащая текущее значение.
Типы данных
правитьДо этого мы работали с счетчиками (тип COUNTER), при сохранении которых из текущего значения вычитается предыдущее. Но это не единственный тип данных который мы можем использовать в кольцевых базах данных. Если мы хотим сохранять данные о величине какого-то параметра (допустим температура), то нам больше подойдет тип GAUGE, сохраняющий данные почти без изменений, как есть (англ. as is). Есть и другие типы:[6]
- COUNTER - GAUGE - DERIVE - ABSOLUTE - COMPUTE
Счетчики (COUNTER) и шкалы (GAUGE) мы разобрали, рассмотрим еще два типа DERIVE и ABSOLUTE. Тип DERIVE — это тот же счетчик, но с возможностью хранить не только постоянно возрастающие но и убывающие значения, т.е. разница между смежными значениями может быть отрицательной. При этом важно помнить, что для этого типа не производится проверка на переполнение. Для этого типа часто используют ограничения границ, например:
MIN=0
такое условие защищает от случайного сброса счетчика.
ABSOLUTE — это тоже модификация счетчика, отличие состоит в том, что разница между значениями не вычисляется, а сохраняются сами значения счетчика и счетчик обнуляется при чтении. Этот тип удобно использовать для подсчета количества событий, произошедших с момента последнего считывания.
Если вы внимательно читали предыдущие разделы, то наверное уже догадались, что тип COMPUTE используется для записи вычисляемых значений на основании данных из других источников данных (DS) текущей БД RRD. В теории баз данных такие поля называют вычисляемыми или виртуальными. Этот источник данных не указывается при операции обновления (update), но его основные контрольные значения (англ. Primary Data Points, PDPs) вычисляются из основных контрольных значений (PDPs) других источников данных, путем применения к ним формул записанных в формате обратной польской записи RPN (англ. Reverse Polish Notation). Подробнее о таком способе задания формул читайте в подразделе «вычисления» этого раздела. Как мы уже знаем, функции консолидации тоже применимы к этому типу данных.
Вы можете посмотреть отличия этих типов на примере:
rrdtool create all.rrd --start 978300900 \ DS:a:COUNTER:600:U:U \ DS:b:GAUGE:600:U:U \ DS:c:DERIVE:600:U:U \ DS:d:ABSOLUTE:600:U:U \ RRA:AVERAGE:0.5:1:10 rrdtool update all.rrd \ 978301200:300:1:600:300 \ 978301500:600:3:1200:600 \ 978301800:900:5:1800:900 \ 978302100:1200:3:2400:1200 \ 978302400:1500:1:2400:1500 \ 978302700:1800:2:1800:1800 \ 978303000:2100:4:0:2100 \ 978303300:2400:6:600:2400 \ 978303600:2700:4:600:2700 \ 978303900:3000:2:1200:3000 rrdtool graph all1.png -s 978300600 -e 978304200 -h 400 \ DEF:linea=all.rrd:a:AVERAGE LINE3:linea#FF0000:"Line A" \ DEF:lineb=all.rrd:b:AVERAGE LINE3:lineb#00FF00:"Line B" \ DEF:linec=all.rrd:c:AVERAGE LINE3:linec#0000FF:"Line C" \ DEF:lined=all.rrd:d:AVERAGE LINE3:lined#000000:"Line D"
Результат будет примерно таким:
- Line A: u u 1 1 1 1 1 1 1 1 1 u - Line B: u 1 3 5 3 1 2 4 6 4 2 u - Line C: u u 2 2 2 0 -2 -6 2 0 2 u - Line D: u 1 2 3 4 5 6 7 8 9 10 u
где u — неизвестная величина (unknown).
Переполнение
правитьРазмер хранимых данных в счетчиках ограничен разрядностью 32 и 64 бита:
- 32 bits: 0 .. 4294967295 - 64 bits: 0 .. 18446744073709551615
Но счетчики других устройств могут иметь меньшую разрядность, после достижения максимального значения такие счетчики обнуляются (сбрасываются). Если такое произойдет при использовании типа DERIVE, то мы получим отрицательную разницу между значениями, что не отвечает действительности. Необходимо предусмотреть возникновение подобных ситуаций и корректно выявить их и обработать. В RRDtool предусмотрена защита от таких ситуация только для счетчиков типа COUNTER. При записи значения, которое меньше предыдущего, RRDtool автоматически воспринимает это как сброс счетчика и начало нового (продолжение старого) отсчета.
Но на этом проблемы не заканчиваются, если возникнет ситуация когда счетчик резко изменит свое значение на величину большую чем максимальное значение счетчика (может даже в несколько раз), RRDtool не сможет понять, что произошло, он распознает (или не распознает) такую ситуацию как сброс счетчика, а это не верно.
Интерполяция данных
правитьЕсть еще одна особенность RRDtool которую нужно учитывать. Если вы создали базу с интервалами в 300 секунд, но при записи в базу ваша программа по каким-то причинам (например вычисляя значения) не успела записать данные вовремя (например запись произошла через 303 секунды), то RRDtool все равно запишет данные для интервала в 300 секунд и изменит данные для коррекции (пропорционально времени запаздывания или отставания). Это происходит потому, что в RRDtool встроена система корректирования аберраций (англ. Aberrant Behavior Detection). Эта система состоит из трех компонентов:[7]
- Механизм (алгоритм) математического (статистического) прогнозирования значения следующей порции данных (которые будут записаны). Этот механизм построен на основе модели Хольта-Винтерса[8] (англ. Holt-Winters) и использует механизм экспоненциального сглаживания.[источник?]
- Механизм вычисления отклонения реальных данных от прогнозированной (расчетной) величины.
- Механизм принятия решений в зависимости от степени отклонения значения (или серии значений) от прогнозированной (расчетной) величины.
Как работает интерполяция аберрированных данных легко понять, рассмотрев конкретные значения:
данные в БД RRD | реальные данные |
---|---|
time+000: 0 delta="U" time+300: 300 delta=300 time+600: 600 delta=300 time+900: 900 delta=300 |
time+000: 0 delta="U" time+300: 300 delta=300 time+603: 603 delta=303 time+900: 900 delta=297 |
RRDtool хранит не только интерполированные данные, но и данные которые непосредственно вводились. Это необходимо для более точной интерполяции последующих данных.
Интерполяция данных может привести к их искажению, поэтому необходима очень осторожно и тщательно выбирать алгоритм интерполяции (сглаживания) данных, вплоть до ее отключения. |
Кроме функций консолидации данных в RRDtool можно явно использовать функции интерполяции, которые определяют тип сглаживающего (интерполирующего) алгоритма:[9]
- HWPREDICT — предсказание методом Holt-Winters
- DEVPREDICT — отклонение от предсказания, взвешенное для одного цикла
- FAILURES — слишком большое отклонение от предсказанного
- SEASONAL — предсказание по алгоритму Holt-Winters со скользящим окном в 288 отсчётов
- DEVSEASONAL.
Эти функции можно использовать как парметры при создании (rrdcreate) или настройке (rrdtune) БД RRD.
Методы получения данных
правитьНе многие люди знают способы регулярно (через равные интервалы времени) получать информацию с удаленных устройств (например из автомобиля, раз уж мы говорим о скорости). Но используя RRDtool мы можем хранить и отображать любые данные, например количество потраченной электроэнергии в вашем доме или температуру в нем. Единственный удобный способ получать данные с удаленных устройств это сетевое соединение.
SNMP
правитьПолучить данные через сеть можно используя различные протоколы и инструменты. Одни из них удобны другие слишком сложны. Давайте для начала рассмотрим протокол SNMP и пакет программ для работы по этому протоколу Net-SNMP.
snmpget
правитьПрограмма snmpget позволяет получать данные с удаленных устройств. Синтаксис этой команды следующий:
snmpget device password OID
или
snmpget -v[version] -c[password] device OID
где device — имя устройства или его IP адрес, password — пароль (так называемый "community read string"), для некоторых устройств установлен пароль по умолчанию «public». OID — идентификатор объекта, (англ. object identifier).
Когда программист впервые сталкивается с протоколом SNMP, он сталкивается с рядом трудностей. Чтобы понять как работает этот протокол нужно понять что такое MIB (Management Information Base). Это граф в виде перевернутого дерева которое описывает структуру данных, с одним из узлов в качестве корня от которого отходят ветви. Ветви заканчиваются другими узлами, от которых, в свою очередь, отходят другие ветви. Все ветви поименованы. Совокупность имен ветвей формирует путь по дереву. Ветви которые мы будем использовать носят имена iso, org, dod, internet, mgmt и mib-2. Эти имена можно записать используя их цифровые представления 1, 3, 6, 1, 2, 1.
iso.org.dod.internet.mgmt.mib-2 (1.3.6.1.2.1)
Запутались? :) Обратитесь к документации по SNMP.
Часто возникает путаница с ведущей точкой, которая используется в некоторых программах. При указании OID ведущая точка не используется. Ведущая точка используется в программах которые подставляют повторяющуюся часть пути (префикс), в таких случаях точка является индикатором полного пути.
Продолжим, как мы описали выше наш OID будет иметь вид: 1.3.6.1.2.1 Больше всего нас интересует ветвь "interfaces" номер которой 2 (1.3.6.1.2.1.2 или 1.3.6.1.2.1.interfaces).
Приведем пример который мы использовали в операционной системе Fedora, если в вашей системе он не работает, сверьтесь с документацией.
snmpget -v2c -c public myrouter system.sysDescr.0
Вы должны увидеть ответ от устройства с его описанием, но иногда описания может быть пустой строкой.
snmpget -v2c -c public myrouter interfaces.ifNumber.0
В этом примере результатом является количество интерфейсов устройства.
snmpwalk
правитьСинтаксис и назначение команды вы поймете из примера:
snmpwalk -v2c -c public myrouter interfaces.ifTable.ifEntry.ifDescr
или
snmpwalk -v2c -c public cisco 2.2.1.2
Результат:
interfaces.ifTable.ifEntry.ifDescr.1 = "BRI0: B-Channel 1" interfaces.ifTable.ifEntry.ifDescr.2 = "BRI0: B-Channel 2" interfaces.ifTable.ifEntry.ifDescr.3 = "BRI0" Hex: 42 52 49 30 interfaces.ifTable.ifEntry.ifDescr.4 = "Ethernet0" interfaces.ifTable.ifEntry.ifDescr.5 = "Loopback0"
Как видно из результата команда snmpwalk не просто возвращает значение ветки, а обходит все ветки с общим родителем. Используя результат приведенный выше, мы можем увидеть, что нам нужен интерфейс с номером 4 (если мы хотим отслеживать состояние интерфейса Ethernet0).
Теперь попробуем получить интересующие нас данные:
interfaces.ifTable.ifEntry.ifInOctets.4 = 2290729126
interfaces.ifTable.ifEntry.ifOutOctets.4 = 1256486519Теперь у нас есть два идентификатора OID, по которым мы будем получать данные. В полной записи они будут выглядеть так:
1.3.6.1.2.1.2.2.1.10 1.3.6.1.2.1.2.2.1.16
конечно для интерфейса номер 4.
Если вы не можете получить нужные вам идентификаторы, то просто поэкспериментируйте с snmpwalk.
Пример
правитьСоздадим новую кольцевую базу данных с данными двух счетчиков input (входящий трафик) и output (исходящий трафик). Данные хранятся в двух архивах RRA с усреднением. Количество ячеек обработки 1, 6, 24 или 288. Интервал записи ячеек 300 секунд. База также будет иметь возможность хранить максимальные значения.
1 поле хранит 1 период т.е. 5 минут 6 полей становятся одним средним за 30 минут 24 поля становятся одним средним за 2 часа 288 поля становятся одним средним за день
В системе MRTG мы не можем изменять размер хранимых данных, но с помощью RRDtool это можно легко сделать:
600 полей по 5 минут (2 дня и 2 часа) 700 полей по 30 минут (2 дня и 2 часа, плюс 12.5 дней) 775 полей по 2 часа (—//—//—, плюс 50 дней) 797 полей по 1 дню каждое (—//—//—, плюс 732 дней, округленно получаем 797) rrdtool create myrouter.rrd \ DS:input:COUNTER:600:U:U \ DS:output:COUNTER:600:U:U \ RRA:AVERAGE:0.5:1:600 \ RRA:AVERAGE:0.5:6:700 \ RRA:AVERAGE:0.5:24:775 \ RRA:AVERAGE:0.5:288:797 \ RRA:MAX:0.5:1:600 \ RRA:MAX:0.5:6:700 \ RRA:MAX:0.5:24:775 \ RRA:MAX:0.5:288:797
Теперь нам нужно написать программу которая будет сохранять данные в нашу базу данных. Напишем псевдокод, используя алгоритмический язык:
пока истина делаем выполнить системную команду snmpget router community 2.2.1.10.4 результат в переменную $in выполнить системную команду snmpget router community 2.2.1.16.4 результат в переменную $out выполнить системную команду rrdtool update myrouter.rrd N:$in:$out ждем 5 минут конец |
while not the end of the universe do get result of snmpget router community 2.2.1.10.4 into variable $in get result of snmpget router community 2.2.1.16.4 into variable $out rrdtool update myrouter.rrd N:$in:$out wait for 5 minutes done |
Вы можете реализовать эту программу на любом удобном для вас языке. После сбора данных, хотя бы за сутки, создайте изображение с графиком:
rrdtool graph myrouter-day.png --start -86400 \ DEF:inoctets=myrouter.rrd:input:AVERAGE \ DEF:outoctets=myrouter.rrd:output:AVERAGE \ AREA:inoctets#00FF00:"In traffic" \ LINE1:outoctets#0000FF:"Out traffic"
График будет отображать количество полученной и переданной информации в течении последних суток. Сутки — это 24 часа по 60 минут по 60 секунд: 24*60*60=86400. Начальное время текущее минус 86400 секунд. Переменные inoctets и outoctets определены как средние значения из БД myrouter.rrd. Создана зона (area) для входящего трафика и задан цвет линии для исходящего трафика.
SSH
правитьВ практике использования распределенных вычислительных систем для параллельных вычислений (в кластерах), очень часто используется беспарольный доступ к узлам сети с использованием протокола SSH. Этот способ можно использовать и для записи (получения) данных для RRDtool.
Перед тем как начать настройку SSH убедитесь, что в системе установлены пакеты openssh, это можно сделать попытавшись их установить. Если пакеты установлены, то вы увидите соответствующее сообщение, если нет то будут установлены, если устарели то обновятся:[10]
yum install openssh openssh-server openssh-clients
или в Ubuntu
apt-get install openssh openssh-server openssh-clients
Далее необходимо проверить запущен ли сервис sshd и запустить его если нет:[10]
chkconfig --list|grep sshd sshd 0:выкл 1:выкл 2:выкл 3:выкл 4:выкл 5:выкл 6:выкл chkconfig --level 2345 sshd on chkconfig --list|grep sshd sshd 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
В ОС Fedora пакет chkconfig установлен по умолчанию, в Ubuntu его придется предварительно установить.
Затем проверяем разрешена ли аутентификация с помощью ключей в конфигурационном файле /etc/ssh/sshd-config:[10]
RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys
Теперь нам необходимо сгенерировать файл идентификации пользователя и соответствующий ему файл с публичным ключом. Для этого на главном узле от имени соответствующего пользователя запускается утилита ssh-keygen:
ssh-keygen -t -rsa
программы выдаст три запроса, нужно просто нажать Enter. В результате программа создаст пару ключей в домашней папке, в подпапке .ssh, id_rsa и публичный id_rsa.pub.
Далее нам нужно скопировать публичный ключ на каждую из машин к которым нам нужен доступ, в папку соответствующего пользователя в подпапку .ssh, под именем authorized_keys. Для этого существует специальная программа:[10]
ssh-copy-id <вторая машина>
она открывает ssh соединение (запрашивая у вас пароль) и копирует файл открытого ключа в нужную папку под нужным именем на удаленной машине.
Все, можно заходить без пароля и заносить данные в базу данных RRD непосредственно через SSH. Можно заносить данные не напрямую, а через промежуточный файл, но тогда нужно позаботится о правильной синхронизации по времени.
Если осуществить доступ по протоколу SSH не получается, то проверьте права доступа (chmod) к директории .ssh и файлам в ней. Проверьте настройки фаервола, в ОС Fedora может понадобиться дополнительная настройка SELinux.[10]
RRD сервер
правитьЕсли вы хотите запустить RRDtool в качестве серверного приложения, то вы должны выделить для него порт TCP/IP. Для этого, в Unix-подобных операционных системах, нужно прописать описание сервиса в /etc/services:
rrdsrv 13900/tcp # RRD server
Вы можете использовать любой не занятый порт. Клиенты должны обращается к серверу используя выбранный порт.
После того как вы выбрали порт, можно обеспечить автоматический запуск RRD сервера при старте системы прописав в /etc/inetd.conf (или аналогичном для вашей ОС):
rrdsrv stream tcp nowait root /opt/rrd/bin/rrdtool rrdtool - /var/rrd
Не забудьте предварительно создать директорию для хранения файлов баз данных /var/rrd
и перезапустить inetd (или просто перегрузиться).
Если вы все сделали правильно, то сможете обращаться к серверу с помощью сокетов в Perl, например с помощью netcat. Быстро проверить работоспособность сервера можно, выполнив команду:
telnet localhost rrdsrv
Внимание! При доступе к RRD серверу не производится аутентификация. Не открывайте порты если вы не уверены в том, что вы делаете! |
Примечания
править- ↑ а б в http://www.bog.pp.ru/work/rrdtool.html
- ↑ http://www.nanog.org/meetings/nanog17/presentations/rrd-slides.pdf
- ↑ http://www.ibm.com/developerworks/ru/edu/au-bash/section6.html
- ↑ http://oss.oetiker.ch/rrdtool/tut/rrdtutorial.en.html
- ↑ http://www.onlineconversion.com/unix_time.htm
- ↑ http://oss.oetiker.ch/rrdtool/doc/rrdcreate.en.html
- ↑ http://oss.oetiker.ch/rrdtool/doc/rrdtool.en.html
- ↑ http://mathematics_statistics_en_ru.academic.ru/933/Holt-Winters_model
- ↑ http://www.bog.pp.ru/work/rrdtool.html
- ↑ а б в г д http://wiseinit.blogspot.com/2011/06/passwordless-ssh.html
См. также
править- System Monitoring with Xymon (мониторинг с помощью Xymon) (англ.)