[Перевод] Сравниваем Tarantool с Redis и Memcached
Выбираете между Tarantool
и Redis
или между Tarantool
и Memcached
? Давайте рассмотрим основные различия, чтобы вам легче было определиться.
Tarantool и Redis
Что касается in-memory
баз данных, то у Redis
по сравнению с Memcached
улучшились возможности хранения кешированных данных, использования не только строковых, но и других типов данных, а также выполнения сложных операций с данными [1]. В Tarantool операции над группами данных вышли на ещё более высокий уровень сложности, причём с точки зрения надежности хранения (persistence)
и индексирования Tarantool
превосходит Redis
, не говоря уж о скорости работы и поддержке пользователей [2]. Учитывая развитость средств хранения, а также возможность работы с транзакциями и большими объёмами данных, Tarantool
можно эффективно использовать в качестве основной базы данных приложения — честно говоря, такой подвиг Redis
не всегда по плечу [3].
Главный недостаток Redis
— невозможность обрабатывать объёмы данных больше, чем объём оперативной памяти сервера. В Tarantool
же можно выбирать движки хранения:
Memtx
, работающий как традиционнаяin-memory
БД,- или
Vinyl/Disk
, позволяющий использовать диски в сочетании с оперативной памятью.
Vinyl
позволяет работать с данными, чей объём в 10—100 раз больше доступного объёма оперативной памяти [4]. Это достигнуто за счёт использования LSM-дерева (log-structured merge tree)
вместо более распространённого B-дерева, что в итоге привело к устранению случайных операций записи — самого узкого места дисковых движков [5].
Redis
и Tarantool
поддерживают скрипты на Lua
, т. е. позволяют применять к данным сложные функции. Кроме того, обе БД могут быть дополнены определёнными пакетами из экосистемы LuaRocks
. Но прямо из коробки Tarantool
использует более быстрый LuaJIT
, в отличие от ванильной Lua
-реализации в Redis
. Также Tarantool
оснащён полноценным, неблокирующим Lua
-сервером приложений, у которого есть доступ к сети и внешним сервисам. При этом в Redis
реализация Lua
помещена в «песочницу», а скрипты блокируются [6]. То есть ожидание завершения Lua
-процессов в Redis
может снизить производительность, а в Tarantool
такой проблемы нет: пока один вызов заблокирован на внешнем ресурсе, другой активный вызов, параллельно выполняющийся, продолжает работать.
Конечно, сравнение Tarantool
с Redis
было бы неполным без хотя бы краткого упоминания об их относительной пропускной способности и уровнях задержки. Тестирование на одной ноде с помощью бенчмарка Yahoo! Cloud Server Benchmark (YCSB)
с прогоном шести основных типов нагрузки — update heavy
, read mostly
, read only
, read latest
, short ranges
и read-modify-write
— показало, что применительно к индексам Hash
и Tree Tarantool
опережает Redis
при всех типах нагрузок. Также в большинстве случаев у Tarantool
меньше latency
. Это относится к нагрузкам с упреждающей записью в журнал и без неё.
Преимущество Tarantool
объясняется работой в тандеме системы управления базами данных (DBMS)
и полноценного сервера приложений [7]. У этого сервера, который может применяться и отдельно, целый набор дополнительных инструментов, а в Redis
их нет. Одна из интересных фич сервера приложений Tarantool
— возможность взаимодействовать с другими, более медленными базами данных с целью кеширования информации, хранящейся в них, и тем самым ускорять их работу: это относится к Oracle
, IBM DB2
, MySQL
, MS SQL Server
и PostgreSQL
.
Tarantool
оркестрирует и виртуализирует данные, ускоряя доступ к ним. Использование Tarantool
в архитектуре почти любых энтерпрайз-приложений и сервисов позволяет уменьшить кодовые базы интеграции и масштабирования, а также снижает требования к серверам и оборудованию. К примеру, один сервер Tarantool
может заменить десятки серверов, на которых крутится традиционная DBMS
, поэтому вы сможете быстрее масштабировать свои микросервисы и приложения [8].
Tarantool и Memcached
Memcached (2003)
и Tarantool (2009)
относятся к двум разным поколениям in-memory
баз данных на основе кеширования. Так что в некотором смысле сравнивать их не слишком честно, поскольку более свежие технологии обычно превосходят более ранние. Но если технология появилась позже, это ещё не значит, что она лучше годится для какой-то задачи. Иногда менее продвинутые инструменты предпочтительнее для определённых нужд. Будем исходить из предположения, что вы выбираете между Memcached
и Tarantool
для своего нового приложения или, возможно, раздумываете, продолжать ли поддерживать легаси-установку Memcached
.
Кеширование против «умного» кеширования
Подход Memcached
прост и хорош. Использующие его приложения проверяют, есть ли запрошенные данные в Memcached
, прежде чем вызывать сопряжённую с ним более медленную базу. Однако Memcached
и сопряжённая БД могут оказаться рассинхронизированы из-за сбоя обновления одного из них, поскольку оба они не реплицируются, а приложение взаимодействует с ними по отдельности. В Tarantool
эта проблема решается с помощью «умного» кеширования: обновление завершится только после успешного обновления сопряжённой БД. То есть вместо взаимодействия с двумя уровнями приложение взаимодействует только с Tarantool
, который отвечает за обновление сопряжённой БД. Кроме того, в любой момент к обработке данных можно подключить Lua
-сервер приложений, работающий одновременно с сервером базы данных.
Чтение и запись
Основное различие между двумя способами кеширования заключается в их возможностях по обработке операций чтения и записи в сопряжённых базах данных. Memcached
предназначен для уменьшения нагрузки на чтение, но не на запись. В Tarantool
тоже реализована хорошая обработка операций чтения. Его высокая эффективность использования CPU
может помочь уменьшить объём дорогостоящих реплик для медленных СУБД. При этом у Tarantool
развитые возможности обработки операций записи. Он записывает на диск синхронно и поэтому может заменять собой дисковые СУБД. Кроме того, операции записи в Tarantool
полностью соответствуют принципам ACID
.
Холодный запуск
При запуске Memcached
в нём нет данных, так что все операции выбора (select)
должны передаваться напрямую в сопряжённую базу данных. В Tarantool
это решается с помощью восстановления данных из сохранённых файлов.
Простота использования
Memcached
прост в установке и позволяет быстро выполнять запросы GET
и SET
, чего в каких-то ситуациях вполне достаточно. Tarantool
тоже легко устанавливается, но из-за более развитой функциональности имеет более обширный синтаксис. Однако если вы его освоите, то сможете применять Tarantool
в самых разных сферах — от микросервисов до вышеупомянутой высоконагруженной транзакционной обработки данных, соответствующей ACID
.
Независимость
Memcached
был создан для поддержки других баз данных. Tarantool
тоже работает в связке с другими базами, но может функционировать полностью независимо, что нехарактерно для кешевых решений. Это достигается с помощью надёжного хранения данных, полноценного сервера приложений, ACID
-транзакций, возможности работать с данными, чей объём больше оперативной памяти. По сути, Tarantool
не просто может работать независимо от реляционной СУБД, он способен вообще обходиться без дополнительного бэкенда в виде реляционной СУБД. Вы можете запрограммировать на Lua
полноценную программу точно так же, как с помощью традиционных хранимых процедур.
Масштабирование
Memcached
и Tarantool
можно легко масштабировать, добавляя новые машины, хотя вам придётся самому позаботиться о том, каким образом распределять данные по узлам. Дополнительно в Tarantool
имеется встроенный механизм шардинга, позволяющий масштабировать кластер автоматически. Более подробно об этом механизме можно почитать тут.
✽✽✽
Как видите, при выборе между Memcached
и Tarantool
придётся учесть много моментов, от проблем синхронизации до масштабирования. Если у вас есть какие-то вопросы о Tarantool
, пишите в комментариях.
Ссылки
- http://www.infoworld.com/article/3063161/application-development/why-redis-beats-memcached-for-caching.html
- https://hackernoon.com/tarantool-vs-redis-38a4041cc4bc
- https://news.ycombinator.com/item? id=3010345
- https://medium.com/@denisanikin/tarantool-vinyl-200k-transactions-per-second-on-a-disk-based-database-c5f3cbba6543
- https://medium.com/@denisanikin/when-and-why-i-use-an-in-memory-database-or-a-traditional-database-management-system-5737f6d406b5
- https://hackernoon.com/tarantool-vs-redis-38a4041cc4bc
- https://medium.com/tarantool-database/dbms-as-an-application-server-779402dbf485
- https://medium.com/@denisanikin/how-to-save-one-million-dollars-on-databases-with-tarantool-5eb1596ec628
- https://github.com/tarantool/vshard