1 Основы VoltDB: концепции и архитектура

Ключевые элементы архитектуры:
  • каталог приложений (application catalog);
  • фрагментация (partitioning);
  • кластеры и устойчивость (clusters and durability).
Разделение таблиц (table partitioning) - схема организации данных, при которой данные таблицы хранятся в нескольких разделах данных в соответствии со значениями в одном или нескольких столбцах разделения таблицы. Данные из заданной таблицы разделяются на несколько объектов хранения, которые могут быть в разных табличных пространствах, в соответствии со спецификациями, заданными в условии PARTITION BY оператора CREATE TABLE. См. IBM глоссарий терминов и определений ПО DB2 для Linux, UNIX и Windows.


Особенности VoltDB:
  • in-memory (все обрабатывается в памяти);
  • автоматическая фрагментация (partitioned);
  • однопоточная (single-threaded), т.е. не требуются блокировки (locking & latching);
  • распределенная (distributed);
  • ACID-совместимая.

Минусы традиционных СУБД:
  • медленные доступ к диску;
  • ручная фрагментация (manual sharding);
  • блокировка (locking & latching);
  • Rip/Replace upgrades.
Плюсы традиционных СУБД:

Надежность (durability) обеспечивают следующие возможности:
  • snapshots;
  • command logging;
  • database replication.

Максимальная пропускная способность достигается за счет фрагментации (partitioning) как данных так и транзакций обращающихся к этим данным. Поэтому доступна параллельная обработка транзакций. Пропускная способность легко масштабируется путем увеличения фрагментов (partitions) на узле (node) или количеством узлов (nodes) в кластере.

Каждый фрагмент (partition) является однопоточным (single-threaded).

Распределение фрагмент (partitions) по кластеру позволяет VoltDB легко масштабироваться как в производительность (больше фрагментов (partitions)) так и в объеме (больше памяти становится доступно).

Кластеризация обеспечивает надежность и устойчивость (availability & durability):
  • K-Safety дублирует (replicates) фрагменты (partitions) в кластере защищая БД от индивидуальных сбоев узлов;
  • репликация БД создает второй экземпляр полностью всей БД обеспечивая тем самым аварийное восстановление (disaster recovery) и allowing for off-loading of read-only workloads.


Одно из отличий VoltDB от традиционных СУБД в том что в VoltDB сначала определяется схема БД, а уже потом создается сама БД. Такой подход позволяет более лучшим способом организовать фрагменты (partitions), когда БД стартует.
Каталог приложений (application catalog) содержит не только схему, но и информацию о фрагментах (partitioning information), а также хранимые процедуры (соответствующие Java классы .class импортируются в каталог).
Когда вы компилируете каталог, он компилируется в SQL (DDL) для создания таблиц, индексов, и materialized views.


Обновление схемы (добавление/удаление таблиц/индексов) доступно путем обновления каталога приложения во время работы БД.

После компиляции каталога из определения схемы (schema definition) и классов процедур, можно стартовать БД. Каждый узел кластера стартует с того что копирует себе копию каталога.


В каталоге содержится сведения о логической фрагментации (logical partitioning) таблиц. Во время запуска deployment файл указывает размер кластера и как много будет фрагментов (partitions) на каждом узле.


Во время работы БД, приложения подключаются к кластеру и выполняют хранимые процедуры или (нерегламентированные) ad hoc запросы через один из клиентских интерфейсов VoltDB (Java, C++, C#, Erlang, JDBC, JSON, Node.js, PHP, Python).


VoltDB работает путем фрагментации таблиц (partitioning tables) по всему кластеру основываясь на значения user-defined column.


VoltDB также делает фрагментацию работ (хранимые процедуры) основываясь на том же column value. Т.к. фрагменты независимы то множество запросов может выполняться параллельно.
Не все хранимые процедуры должны быть фрагментированы (partitioned). Для многокомпонентных запросов фрагменты (partitions) координируют исполнение.
Много многокомпонентных запросов (multi-part queries) поглощают пропускную способность.

Аналогично не все таблицы должны быть фрагментированы. Маленькие, в основном read-only таблицы могут дублироваться. Это позволяет большинству запросов фрагментироваться потому что дублируемая таблица доступна из любого фрагмента.


Хорошая практика проектировать схему так чтобы максимизировать использование single-partition запросов. Использовать дублируемые таблицы для маленьких в основном read-only данных, которые служат "look up" таблицами.

VoltDB может запускать множество фрагментов (partitions) на одном сервере (описывается как "sitesperhost"). VoltDB также может работать в кластере.


Вы также можете использовать множество серверов для дублирования фрагментов (partitions) чтобы увеличить надежность (availability). Репликация фрагментов также известна как K-Safety.


Индикатор K-Safety показывает сколько узлов могут дать сбой и БД выдержит. Чем больше K-Safety тем больше копий существует, тем более устойчива БД и тем меньше уникальных фрагментов (partiotions).


Кластерная конфигурация это компромисс между производительностью (больше уникальных фрагментов) и надежностью (availability) (больше копий). При использовании K-Safety лучше использовать нечетное количество серверов и включить обнаружение нарушений связности сети (network partition detection) чтобы защитить БД как от аппаратных сбоев так и сетевых проблем.

В отличие от традиционных СУБД в VoltDB вы должны определить схему перед тем как сделает старт БД.

Фрагментация максимизирует пропускную способность за счет параллельного выполнения транзакций.

VoltDB доступна только для 64-bit ОС. Запускается на Linux (development и production) или на Mac OS X (только development).