Введение#

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

В этом разделе находится информация о важных компонентах модели распределения данных DataGrid, включая партиционирование данных и Affinity colocation, а также о двух интерфейсах, которые можно использовать для доступа к данным — Key-Value API и SQL.

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

На физическом уровне каждая запись данных — и строка таблицы, и запись в кеше — хранится в виде бинарного объекта (Binary Object). Весь набор данных разделен на небольшие части, которые называются партициями. Партиции обычно равномерно распределены между всеми серверными узлами. Способ, с помощью которого данные распределяются по партициям, а партиции — по узлам, контролирует affinity-функция (подробнее о ней написано в разделе Affinity Collocation).

На логическом уровне данные должны быть представлены так, чтобы с ними было легко работать и чтобы конечным пользователям было удобно использовать их в своих приложениях. В DataGrid есть два варианта логического представления: в виде кешей с парами типа «ключ-значение» (Key-Value API) и SQL-таблиц. Эти варианты равноценны и могут представлять одинаковый набор данных.

Важно

В DataGrid концепции SQL-таблицы и кеша «ключ-значение» — два равноценных представления одной и той же (внутренней) структуры данных. Получить доступ к данным можно с помощью Key-Value API, SQL-запросов или обоих способов.

Сравнение Key-Value API и SQL API#

Кеш — коллекция пар ключ-значение, которую можно получить через Key-Value API. SQL-таблица в DataGrid совпадает с концепцией таблиц в традиционных СУБД с некоторыми ограничениями. Например, в каждой SQL-таблице должен быть первичный ключ.

Таблицу с первичным ключом можно представить в виде кеша с парами «ключ-значение», в котором столбец первичного ключа служит ключом, а остальные столбцы таблицы представляют поля объекта (значение):

Data-modeling

Разница между этими представлениями заключается в способе доступа к данным. Кеш «ключ-значение» позволяет работать с объектами с использованием всех языков программирования, которые поддерживает продукт. SQL-таблицы поддерживают традиционный синтаксис SQL и могут пригодиться, например при миграции из существующей базы данных. Можно объединить подходы и применять один или оба в зависимости от сценария использования.

Key-Value API поддерживает функции для работы с данными:

  • поддержка спецификации JCache (JSR 107);

  • ACID-транзакции;

  • Continuous Query API;

  • Index Query (запросы по индексированным полям объектов);

  • Scan Query;

  • Entry Processor API;

  • подписка на события (Events API).

Важно

Даже после запуска кластера можно динамически создавать кеши «ключ-значение» и SQL-таблицы. Кроме Key-Value API, работать с данными можно через API Service Grid и Compute Grid. Подробнее о динамичческом создании кешей написано в подразделе «Основные операции с кешем» раздела «Использование Key-Value API».

Формат хранения записей данных#

DataGrid хранит записи данных в специальном формате — в виде бинарных объектов (binary object). У этого формата сериализации есть ряд преимуществ:

  • Можно читать произвольное поле из сериализованного объекта без его полной десериализации. Это снимает требование развертывать классы ключа и значения на серверном узле в classpath.

  • Можно добавлять и удалять поля из объектов одного типа. На серверных узлах нет определений классов модели данных — это позволяет динамически изменять структуру объекта и сосуществовать нескольким клиентам с разными версиями определений классов.

  • Позволяет создавать новые объекты на основе названия типа даже без определений классов. Это обеспечивает динамическое создание типа.

  • Обеспечивает возможность беспрепятственного взаимодействия между платформами Java, .NET и C++.

Бинарные объекты можно использовать, если в конфигурации установлен marshaller по умолчанию и не установлены другие.

Подробнее о том, как настроить и использовать бинарные объекты, написано в подразделе «Работа с бинарными объектами» раздела «Использование Key-Value API».

Партиционирование данных#

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