DaggerDB

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 01:59, 23 января 2019.
DaggerDB
Thumbnaildag.png
Выпущена: 2014
Написана на: VB.NET
Операционная система: Linux, OS X, Windows
Тип ПО: NoSQL DB
Лицензия: Commercial
Веб-сайт www.daggerdb.com

DaggerDB — это база данных с хранением данных по столбцам (столбчатые хранилища), обеспечивающая высокоскоростные вставки данных и высокопроизводительные запросы в реальном времени с помощью простых .NET запросов.

DaggerDB — это новый механизм многомерного анализа данных, созданный с целью обеспечения максимальной скорости и широких возможностей при более низком уровне сложности и трудности освоения по сравнению с обычными платформами для оперативной аналитической обработки данных (OLAP).

Она может быть интегрирована в приложение или использоваться как решение клиент/сервер, содержащее одну или несколько баз данных и кубов.

Особенности

Основу механизма DaggerDB составляет столбчатая база данных с высокой степенью параллелизма, которая поддерживает управление версиями и растровое индексирование. Все данные записываются в хранилище столбцов только путём добавления в неизменном виде, что обеспечивает минимальные проблемы с блокировкой и максимальный параллелизм на стороне запроса [Источник 1].

Механизм агрегатирования дополняет столбчатое хранилище асинхронным вычислением в режиме реального времени агрегатов базовых данных. Каждый агрегат имеет отслеживаемый номер версии и может охватывать полный набор данных определённого кортежа или только часть набора данных до определённой версии. Если частичный агрегат попадает в запрос, этот агрегат используется в качестве отправной точки для извлечения и вычисления новых записей, ещё не охваченных агрегатом из столбчатого хранилища. Это позволяет сохранить на низком уровне количество записей, извлекаемых из столбчатого хранилища, даже при быстром разрастании набора данных и обеспечить высокую и предсказуемую производительность запросов.

Важной частью механизма агрегатирования является статистика вставок и запросов, а также оптимизация. Статистика вставок отслеживает в режиме реального времени, какие кортежи принимают наибольшее количество поступающих данных, и, исходя из этого, какие агрегаты следует создать для минимизации операций извлечения запрашиваемых данных.

Статистика запросов отслеживает, какие части запросов привели к извлечению наибольшего количества записей из столбчатого хранилища, и может использовать эту информацию в качестве основы для оптимизации использования, даже создавая агрегаты с новым охватом на основе данных, которые уже были извлечены или вычислены на основе запроса. В случае многомерных наборов данных комбинированная архитектура хранилища столбцов/OLAP-агрегатов позволяет эффективно решать проблемы взрывного роста объёма данных путём приоритетного использования агрегатов в тех областях, где они приносят наибольшую пользу. При этом не требуется, чтобы агрегаты полностью охватывали все данные — запросы на извлечение неохваченных данных обслуживает столбчатое хранилище.

DaggerDB — это база данных с поддержкой требований ACID. Любая совершённая транзакция будет отражена в постоянном хранилище на диске, и эти данные сохранятся даже в случае сбоя системы или отключения питания. DaggerDB производит безбуферную запись на диск всех данных транзакции, после чего записывает контрольную точку в журнал транзакций. При запуске DaggerDB производит поиск последней корректно завершённой транзакции, начиная с последней записи в журнале транзакций. Доступ к транзакциям осуществляется в режиме чтения зафиксированных данных, то есть, данные транзакций будут видны для запросов сразу после их совершения и без каких-либо задержек, однако транзакция, которая ещё совершается в момент выполнения запроса, не будет видна для этого запроса.

Веб-Администратор сервера

Веб-Администратор сервера DaggerDB позволяет легко создавать базы данных и кубы без необходимости написания кода (рисунок 1). [Источник 2].

Рисунок 1 - Создание куба

Вы также можете просмотреть обновляемую в режиме реального времени статистику (рисунок 2) для каждого куба на сервере.

Рисунок 2 - Статистики

Веб-администратор - это тонкое приложение .NET MVC, которое размещается на веб-сервере IIS, доступ получается из веб-браузера. С помощью веб-администратора вы также можете писать запросы непосредственно к кубам и просматривать результаты в таблицах вместе со статистикой для выполняемых запросов.

Применение

DaggerDB — это база данных, которая специально предназначена для анализа данных, и в большинстве сервисов должна использоваться в дополнение к OLTP, выполняя пакетирование данных баз данных OLTP или добавление данных в базы данных OLTP в режиме реального времени. Как и в случае большинства других OLAP-решений, на DaggerDB никогда не следует возлагать функцию владения данными, поскольку нужно иметь возможность перестроить кубы DaggerDB на основе исходного источника данных в том случае, если понадобится изменить модель данных куба.

При создании модели данных куба она всегда должна быть в максимальной степени адаптирована под выполнение необходимого вам анализа, и иметь только те измерения, члены и значения, которые необходимы для анализа данных. Для эффективного применения целесообразно группировать данные и не использовать измерения с очень высокой степенью детализации членов.

Оптимальная конфигурация аппаратного обеспечения — не менее 8 Гб ОЗУ, 8-ядерный процессор и SSD-накопители

Производительность

Для представления об уровне производительности DaggerDB проведены пару тестов. Ниже приведены результаты оценки времени реагирования на запрос, т.е. времени возвращения системой DaggerDB набора результатов запроса на серверной стороне, включая создание запроса, извлечение агрегатов и данных, окончательную агрегацию данных и создание набора результатов. Представленные значения не включают в себя затраты на сериализацию и десериализацию, пересылку по сети и запуск на клиентской стороне. Все тесты производились в системе с процессором Intel i8 и SSD-накопителем, с настройками по умолчанию для кеширования, размера страниц и т.д.

Для оценки производительности используется сервер DaggerDB с кубом, содержащим 3 измерения. Этот тест начинается с пустого куба и запускается до тех пор, пока он не содержит 25 миллионов строк, при этом постоянно запрашивая куб на получение данных.

Сервер и приложения в этом тесте работают на одном компьютере. Скорость вставок - около 45.000 вставок в секунду, скорость запросов - 100 запросов в секунду (рисунок 3).

Рисунок 3 - График производительности

Скорость вставок такова, что график показывает линейную зависимость, так как количество записей в кубе увеличивается. Среднее время отклика запроса - около 1 мс на запрос в этом тесте по мере роста набора данных. Постоянно выполняемые запросы, как и в этих тестах, помогают поддерживать агрегаты в актуальном состоянии, при этом сохраняя данные, которые необходимо извлечь из столбчатых хранилищ.

Примеры

Режим In-Process

Выделение памяти

В этом примере мы создаем куб памяти с тремя измерениями, WebPageId, Year и Month. Затем мы добавляем значение - «count» типа int и «MySum», используя значение «count». Затем мы создаем транзакцию, содержащую 10 записей, сопоставленных каждому измерению и нашему значению. Наконец, мы запрашиваем куб, который даст нам сумму для текущего года.

using (var inMemoryCube = new InMemoryCube())
{
    //Create cube structure
    inMemoryCube
        .AddDimensions("WebPageId", "Year", "Month")
        .AddFactValue("count", FactValueTypes.Int)
        .AddMeasure("MySum", new Sum(), "count")
        .BuildStorageSpace();
 
    //Add some data
    var transaction = new CubeTransaction();
    for (var i = 0; i < 10; i++)
    {
        transaction.AddItem(new DataMap()
            .AddMemberMap("WebPageId", "StartPage")
            .AddMemberMap("Year", DateTime.Now.Year)
            .AddMemberMap("Month", DateTime.Now.Month)
            .AddValueMap("count", 1));
    }
    inMemoryCube.CommitTransaction(transaction);
 
    //Query
    var results = inMemoryCube.Query(x => x
                                        .Select()
                                        .Dimension("Year").Members()
                                        .ToQuery());
}

Создание базы данных

Для того, чтобы создать куб, мы в первую очередь необходимо создать базу данных, чтобы принять его. База данных представляет собой контейнер из одного или нескольких кубов, разделяющих один или несколько измерений. Размеры и их элементы хранятся в базе данных, а кубы ссылаются на некоторые или на все те поля. Здесь мы создаем базу данных с идентификатором 1, названным "PersistentDB" и помещенным в каталог c: \\ dagger». Мы добавляем 3 поля и сохраняем модель базы данных на диск

using (var database = PersistentDatabase.Create(1, "PersistentDB", "c:\\dagger"))
{
    database
        .AddDimension("WebPageId", "WebPage dimension")
        .AddDimension("Year", "Year dimension")
        .AddDimension("Month", "Month dimension")
        .PersistChanges();
}

Создание куба

При создании нового куба нам нужно добавить его в нашу базу данных, поэтому загрузим базу данных 1 из каталога c: \\ dagger Затем добавляем ссылки на поля, которые хотим использовать в нашем кубе. Затем завершаем сохранение изменений в модели базы данных.

using (var database = PersistentDatabase.Load(1, "c:\\dagger"))
{
    new PersistentCube(1, "WebTraffic", database)
        .AddDimensions("WebPageId", "Year", "Month")
        .AddFactValue("count", FactValueTypes.Int)
        .AddMeasure("MySum", new Sum(), "count")
        .BuildStorageSpace();
    database.PersistChanges();
}


Добавление данных

Чтобы добавить данные в куб, мы просто загружаем куб из базы данных и фиксируем транзакции, сопоставленные измерениям.

using (var database = PersistentDatabase.Load(1, "c:\\dagger1"))
{
    var cube = database.GetCubeById(1);
 
    //Add some data
    var transaction = new CubeTransaction();
    for (var i = 0; i < 10; i++)
    {
        transaction.AddItem(new DataMap()
            .AddMemberMap("WebPageId", "StartPage")
            .AddMemberMap("Year", DateTime.Now.Year)
            .AddMemberMap("Month", DateTime.Now.Month)
            .AddValueMap("count", 1));
    }
    cube.CommitTransaction(transaction);
}

Запрос

var result = database.GetCubeById(1).Query(x => x
                            .Select()
                            .Dimension("Year").Members()
                            .ToQuery());


Режим Server/Client

Создание базы данных и куба

Клиент использует DaggerHttpClient для связи с использованием JSON через http. База данных создается с помощью функции CreateDatabaseRequest.

var client = new DaggerHttpClient(new Uri("http://127.0.0.1:123"));
 
var database = new Database(1, "WebTraffic")
    .AddDimension("WebPageId", "WebPage dimension")
    .AddDimension("Year", "Year dimension")
    .AddDimension("Month", "Month dimension");
 
var cube = new Cube(1, "WebTraffic", StorageModes.Persistent, database)
    .AddDimensions("WebPageId", "Year", "Month")
    .AddFactValue("count", FactValueTypes.UInt)
    .AddMeasure("MySum", MeasureTypes.Sum, "count");
 
database.AddCube(cube);
 
var createDbRequest = new CreateDatabaseRequest(database);
var response = client.Send(createDbRequest);

Вставка данных

Данные добавляются в куб при помощи CommitCubeTransactionRequest с транзакцией и идентификаторами базы данных и куба.

var client = new DaggerHttpClient(new Uri("http://127.0.0.1:123"));
 
var transaction = new CubeTransaction()
    .AddItem(new DataMap()
    .AddMemberMap("WebPageId", "StartPage")
    .AddMemberMap("Year", DateTime.Now.Year)
    .AddMemberMap("Month", DateTime.Now.Month)
    .AddValueMap("count", 1));    
 
var commitTransactionRequest = new CommitCubeTransactionRequest(1 /*DatabaseId*/, 1 /*CubeId*/, transaction);
var response = client.Send(commitTransactionRequest);


Запрос

var client = new DaggerHttpClient(new Uri("http://127.0.0.1:123"));
 
var query = new Query().Select()
                            .Dimension("Year").Members()
                            .ToQuery();
 
var queryRequest = new QueryRequest(1 /*DatabaseId*/, 1 /*CubeId*/, query);
var response = client.Send<QueryResponse>(queryRequest);

Источники

  1. DaggerDB //Официальный сайт. [2014-2018]. Дата обновления: 07.08.2018. URL: http://www.daggerdb.com/ (дата обращения: 01.11.2018)
  2. Features DaggerDB // Веб-администратор. [2009-2018]. Дата обновления: 31.09.2018. URL: http://www.discoversdk.com/compare/codernitydb-vs-daggerdb (дата обращения: 01.11.2018)