Interested Article - Tarantool
- 2021-03-21
- 1
Tarantool — платформа in-memory вычислений с гибкой схемой данных для эффективного создания высоконагруженных приложений. Включает в себя базу данных и сервер приложений на Lua .
Обладает высокой скоростью работы по сравнению с традиционными СУБД, обладая теми же свойствами: , ACID , репликации master-slave, master-master.
Обзор
База данных
Язык запросов:
Технологии хранения данных:
- memtx — хранение данных в оперативной памяти, с дисковыми снимками данных и логом транзакций.
- vinyl — хранение данных на жестком диске, с оптимизацией для быстрой вставки данных.
Для хранения данных используются таплы (кортежи). Это массив с данными, которые не типизированы. Кортежи или таплы объединяются в спейсы. Спейс – это аналог из мира SQL, таблица. Спейс это коллекция таплов, а тапл это коллекция полей.
Поля могут быть одного из следующих типов:
Скалярный/составной | тип MsgPack | тип Lua | Пример |
---|---|---|---|
скалярный | nil | «nil» | msgpack.NULL |
скалярный | булевый | «boolean» | true |
скалярный | строковый | «string» | «A B C» |
скалярный | целочисленный | «number» | 12345 |
скалярный | с плавающей точкой двойной точности | «number» | 1.2345 |
составной | ассоциативный массив | «table» со строковыми ключами | {«a»: 5, «b»: 6} |
составной | массив | «table» с числовыми ключами | [1, 2, 3, 4, 5] |
составной | массив байт | «cdata» |
Кортежи организованы в пространства (space или таблицы). Для каждого пространства указывается технология хранения (memtx или vinyl).
Пространство должно быть проиндексировано первичным ключом. Также поддерживаются неограниченное количество вторичных ключей.
Ключ может состоять из одного и более полей.
Поддерживаемые индексы:
- TREE (дерево) — для быстрого поиска значений и возможности итерации.
- HASH (хеш-таблица, только для memtx) — для еще более быстрого поиска значений.
- BITSET (битовая маска, только для memtx) — возможность поиска по битовым маскам.
- RTREE (многомерное R*-дерево, только для memtx) — для быстрого поиска ближайших соседей (KNN) и точек в заданных многомерных параллелепипедах с заданными функциями расстояния между двумя точками.
В качестве формата хранения и протокола передачи данных используется .
База данных поддерживает асинхронную и синхронную репликацию. Репликация может быть выполнена в виде мастер-мастер.
Для разделения доступа используется традиционная модель ACL . У каждого объекта есть владелец имеющий неограниченный доступ. Владелец может предоставить доступ к объекту другим пользователям или ролям. Роль это в свою очередь группа пользователей.
Список разграниченных действий:
- read
- write
- execute
- create
- alter
- drop
База данных поддерживает хранимые процедуры и триггеры написанные на языке Lua .
Глобальный триггер
- box_once — первый запуск базы данных (бутстрап).
Триггеры для пространств (таблиц):
- on_replace — триггер только для чтения на события вставка, обновления, удаления данных
- before_replace — триггер с возможностью модификации событий вставки, обновления, удаления данных
Сервер приложений
Для написания бизнес-логики используется язык Lua и его компилятор LuaJIT .
Сервер приложений содержит высокоуровневый API для доступа к базе данных, файловой системе, сети.
Пользователь может динамически добавлять, удалять, модифицировать функции. Для одновременного выполнения кода используется кооперативная многозадачность .
Для расширения сервера приложений доступны Lua библиотеки как из репозитория tarantool/rocks так и собранные из исходников.
Список стандартных модулей tarantool-а:
- box — доступ к СУБД
- clock — системное время
- crypto — криптографические функции
- csv — работа с CSV форматом данных
- decimal — арифметика с десятичной плавающей точкой (например, денежная)
- digest — хеширование строк
- errno — доступ к переменной системных ошибок *nix
- fiber — многопоточность и инструменты синхронизации
- fio — работа с файловой системой, ввод/вывод
- fun — функциональное программирование
- iconv — работа с текстом в разных кодировках
- json — работа с JSON форматом данных
- log — логирование событий
- msgpack — работа с MsgPack форматом данных
- net.box — модуль связи tarantool-ов между собой
- os — небольшая часть основных команд операционной системы
- pickle — сериализация/десериализация Lua структур
- socket — работа с сетью
- string — утилиты для работы со строками
- tap — фреймворк для модульного тестирования
- uuid — работа с UUID
- uri — работа с форматом uri
- yaml — работа с YAML форматом данных
Модули доступные из репозитория tarantool/rocks:
- vshard — шардирование и репликация данных для горизонтального масштабирования сервиса
- avro-schema — валидация и преобразование сложных структур данных
- date — манипуляция с датой и временем
История
Mail.ru , крупная интернет-компания в России, начала проект в 2008 году с вложения средств и поиска программистов. В качестве руководителя проекта наняли бывшего технического директора из MySQL .
Tarantool стал частью самого портала Mail.ru и сейчас используется для динамического контента: сеансов пользователей, мгновенных сообщений и прочего, а также используется в качестве слоя кэширования для традиционных реляционных баз данных, таких как MySQL или PostgreSQL .
В 2014 году Tarantool также был принят социальными сетями Badoo и Одноклассники .
В июне 2014 года исследователи из и Университета Коимбры (Португалия) провели первый официальный независимый тест производительности систем NoSQL , которые включали в том числе и Tarantool. Испытания использовали стандартный , а конкуренцию Tarantool составляли другие системы NoSQL: Cassandra , HBase , ( ), Redis , ( ), , Elasticsearch , MongoDB и OrientDB .
В 2018 году руководитель команды разработки ядра Tarantool Константин Осипов стал лауреатом премии . В сентябре 2019 года он покинул команду проекта в Mail.ru, создав собственную ветку разработки.
Примечания
- . Дата обращения: 18 мая 2018. 12 марта 2017 года.
- . Дата обращения: 18 мая 2018. 19 апреля 2021 года.
- . Дата обращения: 18 мая 2018. 16 мая 2018 года.
- . habr.com. Дата обращения: 10 декабря 2018. 9 декабря 2018 года.
- . CNews.ru. Дата обращения: 1 января 2020. 1 января 2020 года.
Ссылки
- 2021-03-21
- 1