Библиотека сайта rus-linux.net
Проект Graphite
Глава 7 из книги "Архитектура приложений с открытым исходным кодом", том 1.
Оригинал: Graphite,
глава из книги "The Architecture of Open Source Applications" том 1.
Автор: Chris Davis
Дата публикации: 2012 г.
Перевод: Н.Ромоданов
Дата перевода: июль 2013 г.
Creative Commons. Перевод был сделан в соответствие с лицензией Creative Commons. С русским вариантом лицензии можно ознакомиться здесь.
Graphite [1] выполняет две довольно простые задачи: хранение данных, изменяемых со временем, и отображение их в в виде графиков. В течение многих лет для выполнение подобных задач было написано большое количество программ. Уникальность проекта Graphite состоит в том, что он предоставляет эти функции в виде сервиса, который прост в использовании и хорошо масштабируем. Протокол ввода данных в Graphite настолько прост, что вы можете научиться делать это самостоятельно за несколько минут (не то, чего вам бы, на самом деле, хотелось, но это достойная лакмусовая бумажка для проверки его простоты). Отображение графиков и поиск точек, соответствующих определенным данным, столь же прост, как заполнение адреса URL. Это позволяет вполне естественно интегрировать проект Graphite с другим программным обеспечением и предоставляет пользователям возможность собирать мощные приложения на базе Graphite. Одним из наиболее распространенных применений пакета Graphite является создание веб-панелей управления, используемых для мониторинга и анализа данных. Пакет Graphite появился в среде крупномасштабной электронной коммерции, что отразилось в его архитектуре. Его ключевыми особенностями являются масштабируемость и доступ к данным в режиме реального времени.
К числу компонентов, которые позволяют проекту Graphite реализовывать эти цели, относятся специализированная библиотека баз данных со своим собственным форматом хранения данных, механизм кеширования для оптимизации операций ввода/вывода и простой, но эффективный метод кластеризации серверов Graphite. Вместо того, чтобы просто описывать, как Graphite работает в настоящее время, я объясню, как первоначально (достаточно наивно) был реализован Graphite, с какими проблемами я столкнулся и какие были использованы пути их решения.
7.1. Библиотека базы данных: хранение данных временных рядов
Graphite был написан на языке Python и состоит из трёх основных компонентов: библиотеки баз данных whisper
, демона серверной стороны carbon
, и клиентского веб-приложения, визуализирующего графики и предоставляющее базовый пользовательский интерфейс. Несмотря на то, что библиотека whisper
была разработана специально для системы Graphite, она может использоваться независимо от этой системы. По своей конструкции она очень похожа на кольцевую базу данных, используемую в RRDtool, и хранит только числовые данные временных рядов. Обычно мы считаем, что базы данных являются серверными процессами, с которыми клиентские приложения общаются через сокеты. Однако, whisper
точно также, как и RRDtool является библиотекой баз данных, используемой приложениями для обработки и поиска данных, хранящихся в файлах, отформатированных специальным образом. Самыми главными операциями библиотеки whisper
являются операция create
, создающая новый файл whisper
, операция update
, записывающая новые данные в файл, и операция {fetch
, используемая для выборки данных.
Рис.7.1: Базовая структура файла whisper
Как показано на рис.7.1, файлы whisper
состоят из секции заголовка, в котором находятся различные метаданные, и одной или более архивных секций, следующих далее. Каждый архив является последовательностью подряд идущих значений точек данных, представляющих собой пары (timestamp, value)
(отметка о времени, значение). Когда выполняется операция обновления update
или выборки fetch
, whisper
по отметке о времени и конфигурации архива определяет смещение в файле, в который должна быть сделана запись или из которого должно быть выполнено чтение.
Далее: Серверная часть: Простой сервис хранения данных