Информация

Этот текст содержит переведенные материалы официальной документации 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_graphCLI (англ. 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 и пакет программ для работы по этому протоколу Net-SNMP.

Программа 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 -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).

Теперь попробуем получить интересующие нас данные:

[user@host /home/user]$ snmpget -v2c -c public cisco 2.2.1.10.4 2.2.1.16.4

   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. Этот способ можно использовать и для записи (получения) данных для 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

Примечания

править

См. также

править