VoltDB

VoltDB
fraimed
Разработчики: VoltDB Inc.
Написана на: Java,C++
Операционная система: Linux, Mac OS X
Платформа: Java
Тип ПО: СУБД
Лицензия: GNU Affero General Public License v3, VoltDB Proprietary License
Веб-сайт Официальный сайт

VoltDB - реляционная newSQL in-memory СУБД, ориентированная на обработку транзакций в реальном времени (OLTP) и использующая архитектуру независимых узлов (shared-nothing architecture). За счёт хранения всех данных в памяти, VoltDB обеспечивает очень высокую скорость работы с данными. Поддерживает модель ACID. Разработана группой исследователей баз данных, в том числе Майклом Стоунбрейкером, Сэмом Мэдденом и Дэниелом Абади.

Описание

VoltDB - высокоскоростная бизнес-СУБД, использующая подходы newSQL, in-memory (данные полностью хранятся в памяти, что увеличивает скорость работы с ними) и shared-nothing architecture (все узлы работают независимо, что даёт возможность неограниченного масштабирования). Она поддерживает выполнение запросов на языке SQL и гарантирует транзакционную целостность данных за счёт поддержки модели (ACID). Для работы с данными используются хранимые процедуры на языке Java. Копии процедур прикрепляются к каждому из разделов. Если запрос затрагивает несколько разделов, то процедура вызывается в каждом из разделов, после чего полученные результаты агрегируются. СУБД распространяется в двух версиях: коммерческая и общественная, исходные тексты которой доступны по лицензии GPL.

VoltDB обладает следующими основными возможностями:

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

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

Каждая база данных VoltDB оптимизирована для конкретного приложения путем разбиения таблиц базы данных и хранимых процедур, которые обращаются к этим таблицам через несколько «сайтов» или разделов на одной или нескольких хостах для создания распределенной базы данных. Запросы благодаря разделению данных могут выполняться параллельно. В то же время, поскольку каждый сайт работает независимо, каждая транзакция может выполняться до завершения, без временных расходов на блокировку отдельных записей. Для работы с данными используются хранимые процедуры. Каждая процедура ведёт себя как атомарная операция, что позволяет сохранять целостность данных. Анализируя логику работы хранимых процедур, VoltDB разделяет их на части и распределяет по серверам, так что каждая "часть" содержит отдельный "срез" данных и процедур для работы с ними. Такая организация позволяет организовать параллельную обработку независимых частей данных.[Источник 1].

Сериализованная (однопоточная) обработка

Во время выполнения вызовы хранимых процедур передаются в соответствующий раздел. Когда процедуры «однораздельные» (что означает, что они работают с данными в одном разделе), процесс сервера выполняет саму процедуру, освобождая остальную часть кластера для параллельной обработки других запросов.

Используя сериализованную обработку, VoltDB обеспечивает последовательность транзакций без накладных расходов на блокировку, и журналы транзакций, тогда как разделение позволяет базе данных обрабатывать несколько запросов одновременно. Как правило, чем больше процессоров (и, следовательно, больше разделов) в кластере, тем больше транзакций VoltDB выполняется в секунду, обеспечивая простой, почти линейный способ масштабирования производительности. Когда процедура требует данные из нескольких разделов, один узел выступает в роли координатора и раздаёт задачи для других узлов, собирает результаты и завершает задачу. Эта координация делает многораздельные транзакции немного медленнее, чем односегментные транзакции. Однако транзакционная целостность сохраняется, а архитектура множества параллельных разделов обеспечивает максимальную пропускную способность. Важно отметить, что архитектура VoltDB оптимизирована для полной пропускной способности. Каждая транзакция выполняется непрерывно в своем потоке, минимизирующем индивидуальную задержку на транзакцию (время, с которого транзакция начинает исполняться до завершения её обработки). Это также устраняет накладные расходы, необходимые для блокировки, фиксации, и других административных задач, уменьшая количество запросов в очереди, ожидающих выполнения. В результате, для подходящей схемы разбиения, количество транзакций, которые могут быть выполнены в секунду (то есть пропускная способность) выше, чем в традиционных базах данных.

Репликация

Чтобы дополнительно оптимизировать производительность, VoltDB позволяет реплицировать некоторые таблицы базы данных на все разделы кластера. Для небольших таблиц, которые в основном доступны только для чтения, это позволяет хранимым процедурам создавать объединения между данной таблицей и другой, более крупной таблицей, оставаясь однораздельной транзакцией. Например, база данных розничной торговли, в которой используются коды продуктов в качестве первичного ключа, может иметь одну таблицу, которая просто сопоставляет код продукта с категорией продукта и полным именем, но поскольку эта таблица относительно небольшая и не изменяется часто (в отличие от инвентаря и заказов), она может быть реплицирована во все разделы. Сюда хранимые процедуры могут извлекать и возвращать удобную информацию о продукте при поиске по его коду, не влияя на эффективность заказа и обновлений запасов и поиска.

Область применения

VoltDB ориентирована на отдельный сегмент бизнес-расчётов. Основная задача VoltDB - быстрая работа с данными, которая требуется приложениям, которые должны быстро обрабатывать большие потоки данных. Это могут быть, например, финансовые приложения, СМИ, Интернет Вещей, или другие развивающиеся области. VoltDB выполняет основные требования таких приложений: масштабируемость, высокая доступность и пропускная способность.

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

В настоящее время VoltDB используется в приложениях, требующих высокой производительности, таких как финансовые торги, потоковая запись, онлайн-игры, обнаружение мошенничества, сенсорные системы распределения и тд. [Источник 2]

Работа с VoltDB

Установка

VoltDB поставляется в коммерческой и общественной версиях. Коммерческая версия предоставляется в виде бинарного дистрибутива, общественная же - в виде исходного кода.

Установка из дистрибутива

VoltDB распространяется в виде архива tar. Для его использования необходимо извлечь этот архив в какую-нибудь директорию.

$ tar -zxvf voltdb-ent-6.0.tar.gz -C $HOME/

Рекомендуется использовать домашнюю директорию пользователя, так как в этом случае пользователь получает максимальный доступ к приложению.

Если же необходимо установить VoltDB в некоторое стандартное системное расположение, это можно сделать следующими командами (установка в каталог opt/voltdb):

$ sudo tar -zxvf voltdb-ent-6.0.tar.gz -C /opt
$ cd /opt
$ sudo mv voltdb-ent-6.0 voltdb

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

Сборка из исходников

Файлы исходного кода VoltDB доступны в репозитории на GitHub. После скачивания всех файлов необходимо собрать из них дистрибутив. Для этого рекомендуется использовать программу Ant версии 1.7 или новее.

$ ant dist

В результате будет собран tar архив, аналогичный архиву из предыдущего раздела. Для установки необходимо распаковать его в рабочий каталог.

Обновление

Рекомендуемые шаги по обновлению СУБД до новой версии:

  1. Переключить СУБД в режим администрирования (voltadmin pause).
  2. Создать снимок базы данных (voltadmin save --blocking).
  3. Отключить базу данных (voltadmin shutdown).
  4. Обновить VoltDB.
  5. Создать новую базу данных и запустить её в режиме администрирования.
  6. Восстановить снимок, сделанный на втором шаге (voltadmin restore).
  7. Выйти из режима администрирования (voltadmin resume).

Создание БД

Для начала работы необходимо создать базу данных и её таблицы. Для того, чтобы создать базу данных, используется команда create:

$ voltdb create

При удачном создании БД появляется сообщение:

Server completed initialization.

Работа с таблицами

VoltDB воспринимает запросы на языке SQL. Для начала передачи SQL-запросов, необходимо запустить утилиту sqlcmd:

$ sqlcmd

После этого открывается контекст с пронумерованными строками, в котором можно вводить SQL-запросы. Для окончания работы необходимо ввести команду exit. Результаты выполнения запросов отображаются тут же:

3> select town, state from towns ORDER BY town;
TOWN         STATE 
------------ ------
Bay View     OH    
Billerica    MA    
Buffalo      NY    

(3 row(s) affected)

Утилита sqlcmd имеет директиву FILE, которая позволяет не вводить запросы вручную, а считать их из файла.

1> FILE towns.sql;

Загрузка данных

Заполнение таблиц вручную - не единственный способ внесения данных в БД. При создании таблицы, VoltDB автоматически создаёт для неё хранимую процедуру внесения данных. Команда csvloader позволяет прочитать файл (например, CSV - данные, отделённые запятыми), и записать каждую запись в качестве отдельной строки, используя запрос INSERT. Пример:

$ csvloader --separator "|" --file towns.txt towns

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

Хранимые процедуры

Хранимые процедуры - простой и удобный инструмент для повторного использования одних и тех же запросов с различными параметрами.

Создание простых хранимых процедур

Простые процедуры создаются в контексте утилиты sqlcmd при помощи команды CREATE PROCEDURE AS. Эти процедуры представляют из себя SQL-запрос с возможностью подстановки данных в момент вызова. При создании процедуры ей задаётся уникальное имя, а на месте подставляемых данных ставятся вопросительные знаки. Пример:

$sqlcmd
1>CREATE PROCEDURE leastpopulated AS 
2>SELECT TOP 1 county, abbreviation, population
3>   FROM people, states WHERE people.state_num=?
4>   AND people.state_num=states.state_num
5>   ORDER BY population ASC;

Создание сложных хранимых процедур

Кроме простых процедур на языке SQL, VoltDB также поддерживает создание хранимых процедур на языке Java, что позволяет задавать более сложные запросы и обработку данных. Более подробно об этом написано в официальной документации[Источник 3].

Разделение (партицирование)

Разделение данных в VoltDB происходит при помощи разделительных столбцов. При создании таблицы один из столбцов помечается, как разделительный, и при добавлении очередной строки, на основании значения в поле, соответствующем разделительному столбцу, VoltDB принимает решение, в какую "часть" добавить эту строку. Строки, значение разделительного поля у которых совпадает, попадают в одну "часть". Для того, чтобы задать столбец, как разделительный, необходимо использовать директиву PARTITION TABLE ... ON COLUMN. Пример:

$ sqlcmd
PARTITION TABLE towns ON COLUMN state_num;

Заметим, что таблицы, для которых не используется партицирование, по умолчанию являются реплицированными (сохраняются сразу на все сервера). Это удобно, и сильно ускоряет работу, если данных в таблице немного и запись в неё происходит редко. В противном случае, рекомендуется делать таблицу партицированной.

Достоинства

  • Высокая скорость за счёт хранения всей БД в памяти. Если же БД слишком велика, применяется разбиение её по разделам (партицирование). Перенос данных на диск осуществляется при помощи механизма снапшотов (snapshot). Снапшот отражает срез данных, актуальных на момент его создания.
  • Простая масштабируемость за счёт независимости узлов. Добавление новых серверов в кластер позволяет линейно увеличивать производительность.
  • Неограниченные возможности производительности и масштабирования. За счёт той же независимости узлов, отсутствует верхняя граница масштабирования: в любой момент к уже существующей архитектуре можно добавить ещё один сервер.
  • Автоматическая репликация данных внутри кластера, что обеспечивает высокую доступность и исключает необходимость ведения журнала.
  • Отсутствует необходимость в долгих операциях, таких как блокировки и фиксации, за счёт автономной работы всех разделов.

Примечания

  1. Официальный сайт //VoltDB [2018-2018] Дата обновления:13.02.2018. URL:https://voltdb.com/VoltDB (дата обращения 05.02.2018).
  2. Руководство пользователя//VoltDB. [2018-2018] Дата обновления:13.02.2018. URL:https://docs.voltdb.com/VoltDB (дата обращения 05.02.2018)
  3. Создание хранимых процедур //Руководство пользователя VoltDB [2018-2018] Дата обновления: 13.02.2018. URL:https://docs.voltdb.com/tutorial/Part5.php (дата обращения 13.02.2018)

Ссылки