Архитектура памяти Apache Ignite позволяет хранить и обрабатывать данные и индексы как в виртуальной памяти, так и на дисках серверов.
Первоначально первые версии Apache Ignite действительно могли использовать только виртуальную память, но в процессе развития продукта была получена возможность использования дисков.
Хорошо продуманная модель данных может повысить производительность вашего приложения, более эффективно использовать ресурсы и помочь в достижении целей.
Чтобы понять, как данные хранятся и используются в Ignite, полезно провести различие между физической организацией данных в кластере и логическим представлением данных, т. е. тем, как пользователи будут просматривать свои данные в своих приложениях.
Физический уровень
На физическом уровне каждая запись данных (либо запись в кэше, либо строка таблицы) хранится в виде двоичного объекта, а весь набор данных разделен на более мелкие наборы, называемые set (разделы). Разделы равномерно распределены между всеми узлами. Способ разделения данных на разделы и разделов на узлы контролируется функцией привязки.
Логический уровень
На логическом уровне данные должны быть представлены таким образом, чтобы с ними было легко работать и чтобы сервисам было удобно использовать их в своих приложениях. Ignite предоставляет два различных логических представления данных: кэш значений ключей и таблицы SQL . Хотя эти два представления могут показаться разными, на самом деле они эквивалентны и могут представлять один и тот же набор данных.
Key-Value Cache vs. SQL Table
Cash(кэш) - это набор пар ключ-значение, к которым можно получить доступ через API ключ-значение. Таблица SQL в Ignite соответствует понятию таблиц в традиционных СУБД с некоторыми дополнительными ограничениями; например, каждая таблица SQL должна иметь первичный ключ (primary key).
Таблица с первичным ключом может быть представлена в виде кэша ключ-значение, в котором столбец первичного ключа служит ключом, а остальные столбцы таблицы представляют поля объекта (value).
Разница между этими двумя представлениями заключается в способе доступа к данным. Кэш "ключ-значение" позволяет работать с объектами с помощью поддерживаемых языков программирования. Таблицы SQL поддерживают традиционный синтаксис SQL и могут помочь вам, например, выполнить миграцию из существующей базы данных. Вы можете объединить два подхода и использовать один из них — или оба — в зависимости от вашего варианта использования.
API кэша поддерживает следующие функции:
- Support for JCache (JSR 107) specification
- ACID Transactions
- Continuous Queries
- Events
Data Partitioning
Для оптимальной работы Apache Ignite используется технология распределения данных Data Partitioning.
Data Partitioning - это метод разделения больших наборов данных на более мелкие блоки и сбалансированного распределения их между всеми узлами сервера.
Разделение контролируется функцией сходства. Функция сходства определяет сопоставление между ключами и разделами. Каждый раздел идентифицируется номером из ограниченного набора (по умолчанию от 0 до 1023). Набор разделов распределен между доступными на данный момент узлами сервера (нодами). Таким образом, каждый ключ сопоставляется с определенным узлом и хранится на этом узле. Когда количество узлов в кластере изменяется, разделы перераспределяются - посредством процесса, называемого ребалансом, — между новым набором узлов.
Partitioning повышает производительность за счет распределения операций чтения и записи. Более того, вы можете спроектировать свою модель данных таким образом, чтобы записи данных, которые используются вместе, хранились вместе (т.е. в одном разделе). Когда вы запрашиваете эти данные, сканируется только небольшое количество разделов.
Partitioning помогает достичь линейной масштабируемости практически в любом масштабе. Вы можете добавлять больше узлов в кластер по мере роста вашего набора данных, и Ignite гарантирует, что данные распределяются "поровну" между всеми узлами.
Режимы работы cash
При создании кэша или таблицы SQL вы можете выбирать между partitioned или replicated режимом работы кэша. Эти два режима предназначены для разных сценариев использования и обеспечивают различные преимущества производительности и доступности.
Partitione
В этом режиме все разделы распределяются поровну между всеми узлами сервера. Этот режим является наиболее масштабируемым режимом распределенного кэша и позволяет хранить столько данных, сколько помещается в общей памяти (ОЗУ и диске), доступной на всех узлах. По сути, чем больше у вас узлов, тем больше данных вы можете хранить.
Replicated
В режиме репликации все данные реплицируются на каждый узел кластера. Этот режим кэширования обеспечивает максимальную доступность данных, поскольку они доступны на каждом узле. Однако каждое обновление данных должно распространяться на все другие узлы, что может повлиять на производительность и масштабируемость.
Поскольку одни и те же данные хранятся на всех узлах кластера, размер реплицируемого кэша ограничен объемом памяти (ОЗУ и диска), доступным на узле. Этот режим идеально подходит для сценариев, в которых чтение кэша происходит намного чаще, чем запись в кэш, а наборы данных невелики. Если ваша система выполняет поиск в кэше более 80 % времени, вам следует рассмотреть возможность использования режима реплицированного кэша.
Backup Partitions
По умолчанию Ignite сохраняет одну копию каждого раздела (одну копию всего набора данных). В этом случае, если один или несколько узлов становятся недоступными, вы теряете доступ к разделам, хранящимся на этих узлах. Чтобы избежать этого, вы можете настроить Ignite для сохранения резервных копий каждого раздела.
Резервные копии настраиваются для каждого кэша (таблица). Если вы настроите 2 резервные копии, кластер будет поддерживать по 3 копии каждого раздела. Один из разделов называется основным разделом, а два других называются разделами резервного копирования. По расширению узел, содержащий основной раздел, называется основным узлом для ключей, хранящихся в разделе. Узел с разделами резервного копирования называется узлом резервного копирования.
Когда узел с основным разделом для некоторого ключа покидает кластер, Ignite запускает процесс обмена картами разделов (PME). PME помечает один из разделов резервного копирования (если они настроены) для ключа как основной.