Для хранения данных используется движок Tsavorite (форк хранилища Microsoft FASTER), который поддерживает многопоточную обработку запросов, транзакции, фиксацию изменений в неблокирующем режиме (checkpointing), восстановление после сбоев, сохранение избыточных копий и ведение лога операций. Сетевой обработчик в Garnet построен с использованием архитектуры разделяемой памяти, предложенной исследовательским проектом
ShadowFax. Обработка TLS и взаимодействие с хранилищем выполняется в одном потоке, что даёт возможность избежать накладных расходов на переключение потоков и более эффективно использовать кэш CPU при передаче данных по сети.
Архитектура Garnet отделяет логику разбора и обработки запросов от операций с хранилищем. Данные хранятся с использованием двух хранилищ в формате ключ-значение, реализованных на базе библиотеки Tsavorite. Первое «основное» хранилище оптимизировано для быстрого выполнения операций со строками, а второе «объектное» хранилище оптимизировано для размещения сложных объектов и расширенных типов данных, таких как хэши и списки. Типы данных во втором хранилище реализованы с привлечением библиотек .NET. Данные хранятся в куче (C# heap), что позволяет их эффективно обновлять, и в сериализированном виде на диске.
Особенности Garnet:
- Возможно развёртывание многоуровневых хранилищ, охватывающих оперативную память, SSD-накопители и облачные хранилища, в которых менее востребованные данные вытесняются в медленные хранилища для создания кэшей, размером больше оперативной памяти.
- Расширяемая поддержка устройств, допускающая создание слоёв, оптимизированных для работы с различными устройствами, например, имеются слои для SDD, жёстких дисков и облачного хранилища Azure Storage.
- Эффективный механизм повторного использования освободившегося пространства в оперативной памяти, предотвращающий фрагментацию.
- Настраиваемые лимиты на размер памяти, используемой для индексов, лога и хранения объектов.
- Для обращения к хранилищу применяется протокол RESP, что позволяет использовать Garnet с немодифицированными клиентами Redis.
- Поддержка хранения как строковых значений, так и сложных структур данных, таких как списки, хэши, множества, отсортированные списки и данные геопозиционирования. Возможность определения времени жизни ключа.
- Наличие API для выполнения аналитических запросов (HLL/Hyperloglog, Bitmap), транзакций (MULTI/EXEC) и использования парадигмы публикация/подписка.
- Наличие средств для гибкого управления доступом через ACL.
- Возможность определения конфигурации в формате JSON или redis.conf.
- Поддержка подключения дополнительных сетевых обработчиков. Возможность шифрования трафика с использованием TLS (на базе SslStream).
- Возможность создания расширений на языке C#, реализующих дополнительные операции со строками и объектами.
- Поддержка транзакционных хранимых процедур, охватывающих несколько ключей.
- Возможность восстановления состояния с ранее сохранённой позиции (checkpoint-recovery). Наличие режима только добавления (AOF, append-only file), при котором все старые данные остаются доступны и не замещаются.
- Поддержка создания кластера хранения с репликацией, сегментированием (Sharding), динамической миграцией ключей между узлами и восстановлением сбойных узлов.
- Высокая производительность и низкие задержки при выполнении запросов. Эффективная обработка мелких пакетных запросов при большом числе клиентских сеансов, позволяющая добиться пропускной способности (число обработанных запросов в секунду) на порядок выше, чем у конкурирующих решений. При запуске в виртуальных машинах в облаке Azure в большинстве случаев задержки обращения клиента не превышают 300 микросекунд. В проведённых тестах Garnet значительно опережает Redis, Dragonfly и KeyDB по производительности и отзывчивости. В некоторых тестах Garnet обгоняет конкурирующие системы в десять раз.
Источник: http://www.opennet.ru/opennews/art.shtml?num=60808