Tarantool: обзор СУБД и сервера приложений¶
Tarantool — это российская open-source in-memory (в оперативной памяти) NoSQL-СУБД (система управления базами данных) и сервер приложений, разрабатываемая компанией Mail.ru Group (ныне VK). Ключевая особенность системы — хранение основной части данных в оперативной памяти, что обеспечивает сверхнизкие задержки при операциях чтения и записи, а также наличие встроенного сервера приложений, позволяющего выполнять бизнес-логику непосредственно внутри базы данных.
¶История
Проект был начат в 2008 году как внутренняя разработка для нужд Mail.ru. Первоначально система называлась Tara и использовалась для решения задач, требующих высокой производительности, таких как подсчёт лайков и хранение пользовательских сессий. Позже проект был переименован в Tarantool и в 2011 году выпущен как открытое программное обеспечение (лицензия BSD). С момента открытия кода вокруг Tarantool сформировалось активное сообщество разработчиков. В 2015 году была выпущена версия 1.6, которая представила значительные улучшения в репликации и кластеризации. В 2017 году вышла версия 1.7, ставшая важной вехой в стабильности и производительности. В 2018 году появился модуль Tarantool Cartridge для упрощения построения распределённых кластеров. Развитие проекта продолжается, выпускаются новые версии, добавляющие функции совместимости с SQL, улучшенное управление памятью и другие возможности.
¶Архитектура и принципы работы
В отличие от традиционных дисковых СУБД, Tarantool хранит данные в оперативной памяти, используя собственную структуру для хранения кортежей (записей). Это позволяет достигать производительности до миллиона операций чтения в секунду на одном узле. Для обеспечения долговечности данных используется механизм журналирования: каждая операция записи фиксируется в write-ahead log (WAL) на диске до подтверждения успешности транзакции. Периодически создаются снапшоты данных для ускорения восстановления.
¶Пространства и кортежи
Данные в Tarantool организованы в пространства (аналог таблиц в реляционных СУБД). Пространство состоит из кортежей (аналог строк), которые представляют собой упорядоченные массивы полей. Каждое поле может быть одного из поддерживаемых типов данных: целые числа, числа с плавающей точкой, строки, булевы значения, а также более сложные типы, такие как массивы и ассоциативные карты.
¶Индексы и производительность
Для быстрого доступа к данным пространства используют индексы. Tarantool поддерживает несколько типов индексов: TREE (сбалансированное дерево), HASH (хэш-таблица), RTREE (для пространственных данных) и BITSET (для битовых операций). Индексы также хранятся в памяти, что обеспечивает высокую скорость поиска. Возможность создания вторичных индексов и работа с составными ключами позволяют эффективно выполнять сложные запросы.
¶Сервер приложений и Lua
Встроенный сервер приложений позволяет писать хранимые процедуры и бизнес-логику на языке программирования Lua. Это даёт возможность выполнять код максимально близко к данным, устраняя сетевые задержки между приложением и базой данных. Код на Lua может выполняться в триггерах, вызываться как хранимые процедуры или работать в фоновом режиме. Для взаимодействия с внешним миром предоставляются коннекторы для многих популярных языков программирования: C, C++, Go, Java, Python, PHP, Ruby и других.
¶Кластеризация и репликация
Tarantool поддерживает механизмы репликации и шардирования для построения отказоустойчивых и масштабируемых кластеров.
¶Репликация
Репликация основана на модели ведущий-ведомый (master-slave) с возможностью автоматического переключения на резервный узел. Существует также поддержка топологии с несколькими ведущими узлами для распределения нагрузки на запись. Репликация является асинхронной, что позволяет избежать блокировок на основном узле, однако в случае сбоя возможна незначительная потеря данных. Для синхронной репликации с гарантией целостности используется механизм подтверждений в отдельных конфигурациях.
¶Шардирование
Для горизонтального масштабирования используется шардирование — распределение данных по нескольким узлам кластера. Встроенный модуль vshard позволяет настраивать распределение данных по хэш-ключам, обеспечивая автоматическую балансировку и маршрутизацию запросов. Модуль Cartridge предоставляет более высокоуровневый инструментарий для управления кластером: автоматическое обнаружение узлов, развертывание, настройку репликации и шардирования через единый интерфейс.
¶Язык запросов и SQL
Исторически Tarantool использовал собственный API для запросов, основанный на Lua-функциях. Однако начиная с версии 2.0, в систему была добавлена поддержка языка структурированных запросов SQL (Structured Query Language). Это позволяет разработчикам, знакомым с реляционными базами данных (например, MySQL или PostgreSQL), использовать привычный синтаксис для выборки и модификации данных. Поддержка SQL включает создание таблиц, вставку, обновление, удаление и выборку данных с использованием JOIN, GROUP BY и других конструкций. Несмотря на это, для достижения максимальной производительности и использования всех возможностей системы, рекомендуется применять встроенный Lua API.
¶Применение
Благодаря высокой производительности и низкой задержке, Tarantool используется в сценариях, где критически важна скорость обработки данных:
- Высоконагруженные веб-приложения: обработка пользовательских сессий, кэширование, очереди сообщений.
- Платёжные системы и финтех: обработка транзакций, учёт балансов, антифрод-системы.
- Игровая индустрия: хранение игровых состояний, инвентаря, лидербордов.
- Интернет вещей (IoT) и телеметрия: сбор и обработка данных с датчиков в реальном времени.
- Аналитика в реальном времени: агрегация данных, построение отчётов на лету.
Примером использования является применение Tarantool в инфраструктуре VK, а также во многих других компаниях, включая «Яндекс», Avito, Wildberries и банковский сектор.
¶Преимущества и недостатки
¶Преимущества
- Экстремально высокая производительность для операций чтения и записи.
- Встроенный сервер приложений, упрощающий архитектуру и снижающий сетевые издержки.
- Гибкая модель данных на основе кортежей, позволяющая хранить слабоструктурированную информацию.
- Активное сообщество и наличие подробной документации.
- Открытый исходный код и независимость от конкретного вендора.
¶Недостатки
- Ограниченный объём данных, определяемый объёмом оперативной памяти сервера.
- Сложность настройки и администрирования кластеров по сравнению с традиционными СУБД.
- Меньшая распространённость и, как следствие, меньшее количество специалистов на рынке труда.
- Отсутствие полной поддержки всех возможностей SQL, привычных для реляционных СУБД.
¶Заключение
Tarantool представляет собой специализированный инструмент, решающий задачи, где традиционные дисковые базы данных не могут обеспечить требуемую скорость. Его архитектура, объединяющая базу данных и сервер приложений, позволяет строить высокопроизводительные и отказоустойчивые системы. Наиболее эффективно применение Tarantool в проектах с высокими требованиями к скорости обработки запросов и возможностью размещения рабочего набора данных в оперативной памяти.