24.04.2024

Microsoft открыл код хранилища Garnet, совместимого с Redis

Компания Microsoft открыла исходные тексты NoSQL-системы Garnet, рассчитанной на создание кэширующих хранилищ и совместимой с существующими клиентскими библиотеками для хранилища Redis. Garnet поддерживает создание масштабируемых кластеров для кэширования данных, в которых может использоваться репликация, миграция ключей и сегментирование данных между узлами кластера. Проект написан на языке C# с ядром хранения на C++, открыт под лицензией MIT и может работать на всех платформах, поддерживаемых в .NET (первичными платформами заявлены Linux и Windows).

Для хранения данных используется движок 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 обгоняет конкурирующие системы в десять раз.

Источник: https://www.opennet.ru/opennews/art.shtml?num=60808 Источник.