Mail.RuПочтаМой МирОдноклассникиИгрыЗнакомстваНовостиПоискВсе проекты

Программное обеспечение
с открытым исходным кодом

Это означает, что любой может заглянуть внутрь —
изучить, как работает программа, убедиться, что в ней
нет вирусов, и даже внести свои изменения.

На этом ресурсе собрана информация об открытых
разработках Mail.Ru Group и ее сотрудников.

Tarantool

Tarantool — уникальное решение, совмещающее неблокирующий сервер приложений на Lua с NoSQL базой данных. Храните свои данные близко к вычислениям.

Высокой производительности позволяет достичь стек технологий, который использует тарантул:

  • libev, libcoro и libeio для реализации event-loop'а, кооперативной многозадачности (coroutines/fibers) и асинхронной работы с сетью и другими задачами.
  • LuaJIT — Трассирующий JIT-компилятор для Lua (на стероидах).

Особенности хранилища

Базовым элементом хранения является кортеж. Кортеж имеет любую размерность, это просто произвольно длинный список полей, ассоциированный с уникальным ключом. Каждый кортеж принадлежит какому то пространству (space). По полям кортежа можно определять индексы. Если проводить аналогии с реляционными СУБД, то "пространство" соответствует таблице, а "поля" соответствуют столбцам.

A. Несколько движков хранения данных:

  • Memtx — движок хранения данных полностью в памяти, с поддержкой нескольких видов индексов:
    • TREE (B+*-Дерево) — для быстрого поиска значений и возможности итерирования.
    • HASH (Хеш-таблица) — для еще более быстрого поска значений.
    • BITSET (Битовая маска) — возможность поиска по битовым маскам.
    • RTREE (многомерное R*-Дерево) — для быстрого поиска близжайших соседей (KNN) и точек в заданных многомерных параллелепипедах с заданными функциями расстояния между двумя точками.
  • Sophia — двухуровневый движок хранения информации на диске, который был разработан в ответ на "недостатки" в LSM-деревьях, B-Деревьях и других. Он прекрасно подходит для нагрузки типа "много записи данных среднего размера и немного чтений", но расчёт идёт также на то, что чтение не будет занимать много времени.

B. Возможность поддерживать "персистентность" с помощью xlog (также известный как Transaction Log), snap (который, в свою очередь, является полным снимком БД) и eventual-consistency (консистетность в конечном счёте) master-master репликации.

C. Поддержка вторичных ключей и составных ключей.

D. Аутентификация и привелегии для пользователей и ролей.

E. MessagePack в качестве протокола для связи клиента с сервером и хранения информации внутри самой базы. MessagePack обеспечивает упаковку некоторых данных, что позволяет снизить траффик, передаваемый по сети и размер занимаемой памяти в самом хранилище.

F. Поддержка транзакций и мультиверсионности индексов (с помощью которой реализован snapshot'инг в соседнем треде, для этого не нужно делать fork и использовать COW или останавливать СУБД).

Характеристика сервера приложений

Язык Lua прекрасно подходит для написания бизнес-логики вашего приложения и прост в освоени, а благодаря трассирующей JIT компиляции можно добиться существенной производительности. Также есть возможность писать модули приложения на языке C/C++.

Из встроенных библиотек есть возможность работы с YAML, JSON и CSV; имеется возможность для работы с неблокирующим дисковым/сетевым вводом-выводом, работой с UUID, алгоритмами хешированиями, упаковкой-распаковкой данных с заданной схемой и другое.

Имеется возможность связывать Tarantool'ы в кластера с помощью модуля 'net.box'. В качестве примера можно использовать модуль 'sharding', который реализует шардинг на стороне сервера и 'connection-pool'.

Модули для использования с Tarantool

Модули расширения (rocks) от разработчиков Tarantool:

  • 'shard' — шардинг на стороне сервера с поддержкой однофазных и двухфазных операций и репликации (избытычности). Поддерживает мониторинг шардов и автоматического исключения выбывших нод. Для определения шардов используется консистентное хеширование. Написан полностью на Lua.
  • 'connection-pool' — "пул" соединений между Tarantool'ами с поддержкой зон. Написан полностью на Lua.
  • 'queue' — коллекция серверов очередей — от самой FIFO очереди с приоритетом, до коллекции FIFO очередей без приоритетов и с поддержкой времени жизни таска.
  • 'expirationd' — полностью настраиваемый модуль для автоматического фонового удаление устаревших данных.
  • 'http' — возможность превратить ваш Tarantool в HTTP-сервер или клиент.
  • 'pg' и 'mysql' — асинхронные коннекторы к двум самым популярным реляционным СУБД.
  • 'gperftools' — для профилирования использования CPU Tarantool'ом.

Имеется возможность устанавливать модули с помощью LuaRocks.

Существует набор биндингов для связи с Tarantool'ом из разных языков, в том числе для C, Python, Perl, Java, Go, Node.JS, PHP (Native and PECL) и Ruby.

Проект написан на языке C++, C и Lua. Для тестирования используется тестирующая система на Python с поддержкой функциональных, интеграционных и юнит-тестов.

Для внутренних нужд мы написали на самом Tarantool такие сервисы как microb — сервис "микро-бенчей" для замеров производительности и trytry.tarantool.org.

Так же существуют модули для интеграции в NGINX (для пересылки REST запросов по бинарному протоколу тарантула) и twemproxy (nutcracker) (прокси-шардинг). Подробное описание смотрите на сайте проектов.

Дополнительная информация

Среди пользователей Tarantool следует отметить такие компании, как Mail.Ru, Badoo, Avito и др. Разработка ведется с 2009 года. Исходный код доступен под BSD2 лицензий.

Ссылки