Главная » ЭКСП » tarantool errors

tarantool errors

errors’s Language Statistics

tarantool’s Other Repos

  • tarantool/cartridge-cli: Command-line utility to manage tarantool cartridge applicationsLast Updated: 2022-06-04
  • tarantool/c-dt: Lightweight C library for date arithmetic and date conversion using the proleptic Gregorian calendar. Supports conversion between all ISO 8601 dates.Last Updated: 2022-05-14
  • tarantool/test-run: Tarantool functional testing frameworkLast Updated: 2022-07-31
  • tarantool/smtp: Send email via SMTP from TarantoolLast Updated: 2022-07-31
  • tarantool/expirationd: Expiration daemon module for TarantoolLast Updated: 2022-05-15
  • tarantool/crud: Easy assess to data stored in vshard clusterLast Updated: 2022-05-17
  • tarantool/metrics: Metric collection library for TarantoolLast Updated: 2022-05-17
  • tarantool/cartridge: Out-of-the-box cluster manager for Tarantool with a modern web UILast Updated: 2022-10-09
  • tarantool/ddl: The DDL module enables you to describe data schema in a declarative YAML-based format.Last Updated: 2022-05-15
  • tarantool/doc: Tarantool documentationLast Updated: 2022-05-13
  • tarantool/dump: Logical backup and restore of a tarantool instance.Last Updated: 2022-05-13
  • tarantool/luatest: Tarantool test framework written in LuaLast Updated: 2022-06-01
  • tarantool/try-tarantool: Last Updated: 2022-07-13
  • tarantool/installer.sh: Tarantool installer utilityLast Updated: 2022-07-31
  • tarantool/pg: PostgreSQL connector for TarantoolLast Updated: 2022-07-31
  • tarantool/sysprog: Systems Programming courseLast Updated: 2022-07-28
  • tarantool/tarantool-python: Python driver for TarantoolLast Updated: 2022-10-20
  • tarantool/cartridge-springdata: Spring Data TarantoolLast Updated: 2022-07-31
  • tarantool/vshard: The new generation of sharding based on virtual bucketsLast Updated: 2022-09-21
  • tarantool/tarantool-c: A new C client for Tarantool 1.6+ Last Updated: 2022-07-31
  • tarantool/go-tarantool: Tarantool 1.6+ client for Go languageLast Updated: 2022-10-04
  • tarantool/cartridge-java: Tarantool Cartridge Java driver for Tarantool versions 1.10+ based on Netty frameworkLast Updated: 2022-07-31
  • tarantool/h2o: H2O — the optimized HTTP/1, HTTP/2, HTTP/3 serverLast Updated: 2022-07-31
  • tarantool/checks: Easy, terse, readable and fast function arguments type checkingLast Updated: 2022-05-16
  • tarantool/rocks.tarantool.org: Last Updated: 2022-07-31
  • tarantool/front-ui-kit: Last Updated: 2022-07-15
  • tarantool/frontend-core: Tarantool core module for pluggable WebUI developmentLast Updated: 2022-06-03
  • tarantool/http: Tarantool http serverLast Updated: 2022-09-18
  • tarantool/memcached: Memcached protocol ‘wrapper’ for tarantoolLast Updated: 2022-07-31
  • tarantool/docker: Docker images for tarantool databaseLast Updated: 2022-07-31
  • tarantool/tuple-merger: Last Updated: 2022-05-16
  • tarantool/go-prompt: Building powerful interactive prompts in Go, inspired by python-prompt-toolkit.Last Updated: 2022-07-31
  • tarantool/luajit: Mirror of the LuaJIT git repositoryLast Updated: 2022-06-02
  • tarantool/document: Effortless JSON storage for TarantoolLast Updated: 2022-06-03
  • tarantool/cartridge-spark: Tarantool connector for Apache SparkLast Updated: 2022-06-04
  • tarantool/errors: Error objects with stack trace supportLast Updated: 2022-07-16
  • tarantool/cartridge-extensions: Last Updated: 2022-07-22
  • tarantool/sentry: Send exceptions from Tarantool to SentryLast Updated: 2022-07-19
  • tarantool/queue: Create task queues, add and take jobs, monitor failed tasksLast Updated: 2022-09-15
  • tarantool/httpng: Last Updated: 2022-07-31
  • tarantool/luarapidxml: A fast XML parser for Tarantool based on rapidxmlLast Updated: 2022-07-31
  • tarantool/migrations: Last Updated: 2022-07-31
  • tarantool/luacheck: A tool for linting and static analysis of Lua code. Last Updated: 2022-05-15
  • tarantool/setup-tarantool: Setup Tarantool for use with Github ActionsLast Updated: 2022-07-17
  • tarantool/ansible-cartridge: Ansible role for deploying tarantool cartridge-based applicationsLast Updated: 2022-06-02
  • tarantool/sharded-queue: Last Updated: 2022-07-31
  • tarantool/rws: Last Updated: 2022-07-31
  • tarantool/cartridge-java-testcontainers: Special testcontainers for Tarantool and Tarantool CartridgeLast Updated: 2022-05-25
  • tarantool/kafka: Full featured high performance kafka library for Tarantool based on librdkafka.Last Updated: 2022-05-28
  • tarantool/tntcxx: Last Updated: 2022-07-31
  • tarantool/s3: Amazon S3 backup pluginLast Updated: 2022-07-31
  • tarantool/tarantool-php: PECL PHP driver for TarantoolLast Updated: 2022-09-19
  • tarantool/ldecnumber: Lua decnumber bindingsLast Updated: 2022-07-31
  • tarantool/membership: Membership library for Tarantool based on a gossip protocolLast Updated: 2022-05-28
  • tarantool/reload: Hot code reloading for TarantoolLast Updated: 2022-01-05
  • tarantool/github-google-sheets: Sync your GitHub issues to a Google SheetLast Updated: 2022-01-05
  • tarantool/websocket: A websocket implementation for TarantoolLast Updated: 2022-07-13
  • tarantool/docbot: Bot to automate some GitHub thingsLast Updated: 2022-07-31
  • tarantool/tarantool-qa: QA related issues of TarantoolLast Updated: 2022-07-31
  • tarantool/gentoo-overlay: Tarantool Gentoo OverlayLast Updated: 2022-05-30
  • tarantool/xxHash: Extremely fast non-cryptographic hash algorithmLast Updated: 2022-07-31
  • tarantool/spring-petclinic-tarantool: Simple example how to use cartridge spring data Last Updated: 2022-07-17
  • tarantool/easy-function: Last Updated: 2022-07-20
  • tarantool/watchdog: tarantool watchdog moduleLast Updated: 2022-07-17
  • tarantool/mysql-tarantool-replication: A standalone MySQL -> Tarantool replication daemonLast Updated: 2022-07-13
  • tarantool/tuple-keydef: Tarantool’s tuple comparators and key extraction functions.Last Updated: 2022-07-31
  • tarantool/frontend-stub: Tarantool frontend stubLast Updated: 2022-07-17
  • tarantool/doc-builder: Last Updated: 2022-05-16
  • tarantool/graphql: GraphQL implementation in LuaLast Updated: 2022-07-30
  • tarantool/luagraphqlparser: GraphQL parser based on libgraphqlparser for LuaLast Updated: 2021-12-28
  • tarantool/xtm: Last Updated: 2022-01-09
  • tarantool/jepsen.tarantool: Jepsen tests for TarantoolLast Updated: 2022-07-31
  • tarantool/examples: Last Updated: 2022-07-16
  • tarantool/mqtt: Tarantool MQTT clientLast Updated: 2022-07-18
  • tarantool/tarantool-lua: Tarantool connector for LuaLast Updated: 2022-07-27
  • tarantool/pregel: Large scale graph processing based on TarantoolLast Updated: 2022-07-16
  • tarantool/curl: A command line tool and library for transferring data with URL syntax, supporting HTTP, HTTPS, FTP, FTPS, GOPHER, TFTP, SCP, SFTP, SMB, TELNET, DICT, LDAP, LDAPS, FILE, IMAP, SMTP, POP3, RTSP and RTMP. libcurl offers a myriad of powerful featuresLast Updated: 2022-07-12
  • tarantool/tarantool-internals: Last Updated: 2022-01-08
  • tarantool/bench-run: Tarantool performance testing scriptsLast Updated: 2022-07-31
  • tarantool/tpch: Tarantool TPC-H testsLast Updated: 2022-05-15
  • tarantool/tvisor: Last Updated: 2022-07-22
  • tarantool/tarantool-ruby: Tarantool Ruby driverLast Updated: 2022-07-16
  • tarantool/sqlparser: An SQL parser for Tarantool based on HyriseLast Updated: 2022-07-27
  • tarantool/cartridge-cli-extensions: Last Updated: 2021-12-31
  • tarantool/gis: A full-featured geospatial extension for TarantoolLast Updated: 2022-05-26
  • tarantool/zookeeper: ZooKeeper client for TarantoolLast Updated: 2022-07-16
  • tarantool/wslay: The WebSocket library in CLast Updated: 2022-07-16
  • tarantool/tarantool-operator: Tarantool Operator manages Tarantool Cartridge clusters atop KubernetesLast Updated: 2022-05-28
  • tarantool/awesome-tarantool: A curated list of delightful Tarantool modules, connectors and other resourcesLast Updated: 2022-10-14
  • tarantool/avro-schema: Apache Avro schema tools for TarantoolLast Updated: 2022-10-23
  • tarantool/icu-date: Date and time formatting library for Tarantool based on International Components for UnicodeLast Updated: 2022-07-12
  • tarantool/tarantool-sp: Calculate SPs from labels on tickets in the given projectLast Updated: 2022-07-17
  • tarantool/topology: Topology provider for TarantoolLast Updated: 2022-07-13
  • tarantool/tarantool: Get your data in RAM. Get compute close to data. Enjoy the performance.Last Updated: 2022-10-09
  • tarantool/tarantool-idea-plugin: Tarantool support plugin for Intellij PlatformLast Updated: 2022-07-14
  • tarantool/tarantool-java: A Java client for TarantoolLast Updated: 2022-10-13
  • tarantool/conf: Configuration storage clientLast Updated: 2022-07-24
  • tarantool/nginx_upstream_module: Tarantool NginX upstream module (REST, JSON API, websockets, load balancing)Last Updated: 2022-10-18
  • tarantool/small: Specialized memory allocatorsLast Updated: 2022-09-26
  • tarantool/grafana-dashboard: Dashboard for Tarantool application and database server monitoring with GrafanaLast Updated: 2022-07-12

Star history of errorsIssue history of errors

3. Технические особенности

Какие типы данных можно хранить

В Redis ключом может быть только строка. В Redis можно хранить и манипулировать следующими типами данных:

  • строки;
  • списки строк;
  • неупорядоченные множества строк;
  • хешмапы или просто строковые пары ключ-значение;
  • упорядоченные множества строк;
  • Bitmap и HyperLogLog.

В Tarantool можно хранить и манипулировать следующими типами данных:

  • Атомарными:
    • строки;
    • логический тип (истина, ложь);
    • целочисленный;
    • с плавающей запятой;
    • с десятичной плавающей запятой;
    • UUID.

  • Комплексными:
    • массивы;
    • хешмапы.

Типы данных Redis лучше подходят для счётчиков событий, в том числе уникальных, для хранения небольших готовых витрин данных. А типы данных Tarantool лучше подходят для хранения объектов и/или документов, как в SQL и NoSQL СУБД.

Вытеснение данных

Redis и Tarantool содержат в себе механизм ограничения занимаемой памяти. Когда клиент попытается добавить ещё данные, когда лимит уже был исчерпан, базы ответят ошибкой. И Redis, и Tarantool в этой ситуации продолжат выполнять запросы на чтение.
Перейдём к другому механизму, когда мы можем настроить алгоритм удаления «больше ненужных» данных. Redis содержит в себе несколько механизмов вытеснения:

  • TTL — вытеснение объектов по завершении срока жизни;
  • LRU — вытеснение давно использованных данных;
  • RANDOM — вытеснение случайно попавшихся под руку объектов;
  • LFU — вытеснение редко используемых данных.

Все механизмы могут быть настроены либо на весь объем данных, либо только на те объекты, которые помечены как вытесняемые.
В Tarantool для вытеснения данных можно использовать расширения expirationd или indexpiration, или создать собственную фоновую процедуру, которая будет проходить по вторичному индексу (с таймштампом) и удалять ненужные данные.

Итерация по ключам

В Redis можно это сделать с помощью операторов:

  • SCAN;
  • итерация по ключам.

Операции возвращают страницы с результатами. Для получения каждой новой страницы, необходимо передать «идентификатор» предыдущей. Операции поддерживают фильтрацию по шаблону. Для этого используется параметр MATCH. Фильтрация происходит на момент выдачи страницы, поэтому некоторые страницы могут оказаться пустыми. Это не будет означать, что страниц больше не осталось.
В Tarantool доступна гибкая схема итерации по ключам. Можно итерироваться в прямом и обратном направлении. В процессе можно дополнительно фильтровать значения. Можно сместиться на определённое значение ключа, затем проходить по следующим ключам в сторону возрастания или убывания. Направление прохода на лету менять нельзя.
Например:
results = {}
for _, tuple in box.space.pairs(‘key’, ‘GE’) do
if tuple[‘value’] > 10 then
table.insert(results, tuple)
end
end
return results

Вторичные индексы

Redis
У Redis нет вторичных индексов. Есть некоторые трюки, чтобы их имитировать:

  • В упорядоченных множествах можно использовать порядковый номер элемента как вторичный ключ.
  • Использовать хешмапы, ключ которых является, в некотором смысле, индексом данных.

Tarantool
В Tarantool можно строить произвольное количество вторичных индексов для данных:

  • Вторичные ключи могут состоять из нескольких полей.
  • Для вторичных индексов можно использовать типы HASH, TREE, RTREE, BITSET.
  • Вторичные индексы могут содержать уникальные и не уникальные ключи.
  • У любых индексов можно использовать настройки локали, например, для регистронезависимых строковых значений.
  • Вторичные индексы могут строиться по полям с массивом значений (иногда их называют мультииндексы).

Вывод
Вторичные ключи и удобные итераторы позволяют строить в Tarantool реляционные модели хранения данных. В Redis такую модель построить невозможно.

Транзакции

Механизм транзакций позволяет выполнить несколько операций атомарно. И Redis, и Tarantool поддерживают транзакции. Пример транзакции в Redis:
> MULTI
OK
> INCR foo
QUEUED
> INCR bar
QUEUED
> EXEC
1) (integer) 1
2) (integer) 1

Пример транзакции в Tarantool:
do
box.begin()
box.space.kv:update(‘foo’, {{‘+’, ‘value’, 1}})
box.space.kv:update(‘bar’, {{‘+’, ‘value’, 1}})
box.commit()
end

Персистентность

Персистентность данных обеспечивается двумя механизмами:

  • периодическим сбросом in-memory данных на диск — snapshoting;
  • последовательной упреждающей записью всех приходящих операций в файл — transaction journal.

И Redis, и Tarantool содержат оба механизма персистентности.
Redis
Redis периодически сбрасывает все данные из памяти на диск. Происходит это по-умолчанию каждые 60 секунд (настраивается). Redis использует механизм ОС fork для «копирования» текущих данных в памяти, затем информация сохраняется на диск. Если происходит аварийное завершение, то Redis восстановит состояние из последнего сохранения. Если последний снапшот был сделан давно, то данные, пришедшие после снапшота, будут утеряны.
Журнал операций используется для сохранения всей приходящей в базу информации. Каждая операция сохраняется в журнал на диске. Так, при запуске Redis восстанавливает своё состояние из снапшота и затем донакатывает оставшиеся транзакции из журнала.

  • Снапшот в Redis называется RDB (redis database).
  • Журнал операций в Redis называется AOF (append only file).

Tarantool

  • Механизм персистентности взят из архитектур баз данных.
  • Он является целостным — снапшоты и журналирование.
  • Этот же механизм позволяет существовать надежной WAL-based репликации.

Tarantool периодически сохраняет текущие in-memory данные на диск и записывает каждую операцию в журнал.

  • Снапшот в Tarantool называется snap (snapshot). Можно делать с произвольной частотой.
  • Журнал транзакций в Tarantool называется WAL (write ahead log).

И в Redis, и в Tarantool каждый из механизмов может быть выключен. Для надёжного хранения данных оба механизма надо включить. Для максимального быстродействия можно отключить снапшотинг и журналирование, заплатив персистентностью. Слабоумие и отвага!
Различия
Для снапшотинга в Redis используется механизм ОС fork. Tarantool использует внутренний readview всех данных, это работает быстрее чем fork.
В Redis по умолчанию включён только снапшотинг. В Tarantool включён снапшотинг и журнал.
Redis хранит и использует только по одному файлу для снапшотов и журнала операций. Tarantool по-умолчанию хранит два файла снапшотов (можно настроить и больше) и консистентно дополняющее неограниченное количество журналов операций. При повреждении снапшот-файла Tarantool сможет загрузиться из предыдущего. Для Redis необходимо наладить механизм бекапов.
В Tarantool, в отличие от Redis, снапшоты и журналы образуют единый механизм отображения данных в файловой системе. Это значит, что в Tarantool и в файлах снапшотов и в журналах хранится полная метаинформация о транзакции, кто её сделал и когда. Она одного формата и взаимодополняющая.
Troubleshooting
Если повреждён файл журнала в Redis:
redis-check-aof —fix
Если повреждён файл журнала в Tarantool:
tarantool> box.cfg{force_recovery=true}

Язык программирования для хранимых процедур

Хранимые процедуры — это код, выполняющийся рядом с данными. И Redis, и Tarantool предлагают Lua для создания хранимок. С точки зрения пользователя это очень простой язык. Он создавался для людей, для которых программирование будет инструментом решения задач в предметной области.
C точки зрения разработчика базы данных:

  • Lua — это язык, который легко встраивается в существующее приложение.
  • Он просто интегрируется с объектами и процессами приложения.
  • Lua имеет динамическую типизацию и автоматическое управление памятью.
  • Язык имеет сборщик мусора incremental Mark&Sweep.

Различия
Реализация

  • В Redis используется ванильная реализация PUC-Rio.
  • В Tarantool используется LuaJIT.

Таймаут задач

  • В Redis можно задать таймаут, после которого выполнение хранимой процедуры прервётся.
  • В Tarantool хранимые процедуры компилируются и выполняются быстрее, но в этом механизме нет возможности выставить таймаут. Для прерывания хранимой процедуры пользователь должен предусмотреть механизм проверки флага прерывания.

Runtime

  • В Redis используется однозадачность: задачи выполняются по одной и целиком.
  • В Tarantool используется кооперативная многозадачность. Задачи выполняются по одной, но при этом задача отдаёт управление на операциях ввода-вывода или явно с помощью yield.

Вывод

  • В Redis Lua — это просто хранимые процедуры.
  • В Tarantool — это кооперативный runtime, в котором можно взаимодействовать со внешними системами.

Репликация

Репликация — это механизм копирования объектов с одного узла на другой. Бывает асинхронная и синхронная.

  • Асинхронная репликация: при вставке объекта на один узел мы не дожидаемся, когда этот же объект будет отреплицирован на второй узел.
  • Синхронная репликация: при вставке объекта мы дожидаемся, когда он будет сохранён на первом и втором узлах.

И Redis, и Tarantool поддерживают асинхронную репликацию. Только Tarantool умеет в синхронную репликацию.
На практике бывают ситуации, когда мы хотим дождаться репликации объекта. И в Redis, и в Tarantool есть способы для этого:

  • В Redis это команда wait. Она принимает два параметра:
    • сколько реплик должны получить объект;
    • сколько ждать, пока это произойдёт.

  • В Tarantool это можно сделать фрагментом кода:

псевдокод:
local netbox = require(‘net.box’)
local replica = netbox.connect(…)
local replica_vclock, err = replica.eval([[
return box.info().vclock
]])

while not vclock_compare(box.info().vclock, replica_vclock) do
fiber.sleep(0.1)
end

Синхронная репликация
В Redis нет синхронной репликации. Начиная с Tarantool 2.6 синхронная репликация доступна [2].

Коннекторы из других языков программирования

И Redis, и Tarantool поддерживают коннекторы для популярных языков программирования:

  • Go;
  • Python;
  • NodeJS;
  • Java.

Полные списки:

  • https://redis.io/clients
  • https://tarantool.io/ru/download/connectors

Под какие задачи плохо подходят

И Redis, и Tarantool плохо подходят для решения OLAP-задач. Online analytical processing имеет дело с историческими или архивными данными. OLAP характеризуется относительно низким объёмом транзакций. Запросы часто очень сложны и включают агрегацию.
В обоих случаях данные хранятся построчно, и это снижает эффективность алгоритмов агрегации в сравнении с базами с колоночным хранением.
Redis и Tarantool — однопоточные базы данных, что не позволяет распараллелить аналитические запросы.

Экосистема

Redis
Модули Redis представлены в трёх категориях:

  • Enterprise;
  • проверенные и сертифицированные для Enterprise и Open source;
  • непроверенные.

Enterprise-модули:

  • полнотекстовый поиск;
  • хранение и поиск по bloom-фильтрам;
  • хранение временных рядов.

Сертифицированные:

  • хранение графов и запросы к ним;
  • хранение JSON и запросы к нему;
  • хранение и работа с моделями машинного обучения.

Все модули, отсортированные по количеству звёзд на Github: https://redis.io/modules
Tarantool
Модули представлены в двух категориях:

  • Встроенные: https://www.tarantool.io/en/doc/latest/reference/
  • Enterprise: https://www.tarantool.io/en/enterprise_doc/rocksref/#closed-source-modules

Чем Redis лучше

  • Проще.
  • В интернете представлено больше информации, 20 тыс. вопросов на Stackoverflow (из них 7 тыс. без ответов).
  • Ниже порог входа.
  • Как следствие, проще найти людей, которые умеют работать с Redis.

2. Архитектурная часть

Производительность

Это самый любимый запрос про БД в памяти — а насколько вы быстрые? «Сколько миллионов РПС можно снять с одного ядра?» Проведём простой синтетический тест, в нём максимально приблизим настройки баз данных. Скрипт на Go наполняет хранилище случайными ключами со случайными значениями.
MacBook Pro 2,9 GHz Quad-Core Intel Core i7
Redis version=6.0.9, bits=64
Tarantool 2.6.2

Redis
redis_test.go
package main

import (
«context»
«fmt»
«log»
«math/rand»
«testing»

«github.com/go-redis/redis»
)

func BenchmarkSetRandomRedisParallel(b *testing.B) {
client2 := redis.NewClient(&redis.Options{Addr: «127.0.0.1:6379», Password: «», DB: 0})
if _, err := client2.Ping(context.Background()).Result(); err != nil {
log.Fatal(err)
}

b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
key := fmt.Sprintf(«bench-%d», rand.Int31())
_, err := client2.Set(context.Background(), key, rand.Int31(), 0).Result()
if err != nil {
b.Fatal(err)
}
}
})
}

Tarantool
tarantool>
box.cfg{listen=’127.0.0.1:3301′, wal_mode=’none’, memtx_memory=2*1024*1024*1024}
box.schema.user.grant(‘guest’, ‘super’, nil, nil, {if_not_exists=true,})
box.schema.space.create(‘kv’, {if_not_exists=true,})
box.space.kv:create_index(‘pkey’, {type=’TREE’, parts={{field=1, type=’str’}},
if_not_exists=true,})

tarantool_test.go
package main

import (
«fmt»
«math/rand»
«testing»

«github.com/tarantool/go-tarantool»
)

type Tuple struct {
_msgpack struct{} `msgpack:»,asArray»`
Key string
Value int32
}

func BenchmarkSetRandomTntParallel(b *testing.B) {
opts := tarantool.Opts{
User: «guest»,
}
pconn2, err := tarantool.Connect(«127.0.0.1:3301», opts)
if err != nil {
b.Fatal(err)
}
b.RunParallel(func(pb *testing.PB) {
var tuple Tuple
for pb.Next() {
tuple.Key = fmt.Sprintf(«bench-%d», rand.Int31())
tuple.Value = rand.Int31()
_, err := pconn2.Replace(«kv», tuple)
if err != nil {
b.Fatal(err)
}
}
})
}

Запуск Чтобы полностью прогрузить базы данных, используем больше потоков.
go test -cpu 12 -test.bench . -test.benchtime 10s

goos: darwin
goarch: amd64
BenchmarkSetRandomRedisParallel-12 929368 15839 ns/op
BenchmarkSetRandomTntParallel-12 972978 12749 ns/op

Результаты. Среднее время запроса к Redis составило 15 микросекунд, к Tarantool — 12 микросекунд. Это даёт Redis 63 135 RPS, Tarantool — 78 437 RPS.
Тест нужен, чтобы показать уровень производительности БД в памяти, а не для замера, кто быстрее. Каждый из вас может измерить так, что быстрее окажется нужный вариант, я это тоже понимаю.

Надёжность

Для надёжности хранения данных используют две основные техники:

  • Персистентность. При перезагрузке БД загрузит свои данные с диска, не будет запросов в сторонние системы.
  • Репликация. Если упал один узел, то есть копия на втором. Бывает асинхронная и синхронная.

И Redis, и Tarantool содержат эти функции. Технические подробности мы рассмотрим далее.

Масштабируемость

Масштабирование может рассматриваться для двух задач:

  • Зарезервировать дополнительные узлы, которые могут заменять друг друга в случае, если сосед вышел из строя.
  • Данные не помещаются на один узел, и их необходимо распределить на несколько.

Redis
Узлы Redis можно соединить друг с другом асинхронной репликацией. Такие узлы будем называть репликационной группой, или replica set. Управлением такой репликационной группой занимается Redis Sentinel.
Redis Sentinel — это один или несколько объединенных в кластер специальных процессов, которые следят за узлами Redis. Они выполняют четыре основные задачи:

  • Мониторинг узлов в группе: живой или мертвый.
  • Уведомление администратора или какой-то системы, если что-то случилось в группе.
  • Автоматическое переключение мастера.
  • Провайдер конфигурации для внешних клиентов, чтобы они знали, к кому подключиться.

В случае, когда данные необходимо расшардировать на несколько узлов, Redis предлагает open source-версию Redis Cluster. Она позволяет построить кластер, состоящий из нескольких репликационных групп. Данные в кластере шардируются по 16 384 слотам. Диапазоны слотов распределяются между узлами Redis.
Узлы в кластере общаются по отдельному открытому порту, чтобы понимать состояния соседей. Приложение при работе с Redis Cluster должно использовать специальный коннектор.
Tarantool
Tarantool также содержит в себе оба механизма масштабирования: репликацию и шардирование. Основной инструмент управления масштабированием — Tarantool Cartridge. Он объединяет узлы в репликационные группы. В этой ситуации вы можете построить одну такую репликационную группу и использовать её аналогично Redis Sentinel. Tarantool Cartridge может управлять несколькими репликационными группами и шардировать данные между ними. Шардирование выполняется с помощью библиотеки vshard.
Различия
Администрирование

  • Администрирование Redis Cluster — с помощью скриптов и команд.
  • В Tarantool Cartridge администрирование — с помощью web-интерфейса или через API.

Корзины шардирования

  • Количество корзин шардирования в Redis фиксированное, 16 тыс.
  • Количество корзин шардирования Tarantool Cartridge (vshard) произвольное. Указывается один раз при создании кластера.

Ребалансировка корзин (решардинг)

  • В Redis Cluster настройка и запуск вручную.
  • В Tarantool Cartridge (vshard) — автоматически.

Маршрутизация запросов

  • Маршрутизация запросов в Redis Cluster происходит на стороне клиентского приложения.
  • В Tarantool Cartridge маршрутизация запросов происходит на узлах-роутерах кластера.

Инфраструктура

  • Tarantool Cartridge также содержит:
    • механизм map/reduce запросов;
    • утилиту по упаковке приложения в пакеты rpm, dep и tar.gz;
    • Аnsible-роль для автоматического развёртывания приложения;
    • экспорт параметров мониторинга кластера.

Валидация схемы данных

В Redis основная схема данных — ключ-значение. Но в значениях могут быть разные структуры. На стороне сервера нет механизма для задания правил. Мы не можем указать, в каком ключе какой тип данных должен использоваться и какая именно структура должна быть у значения. Валидацией схемы должен заниматься или коннектор, или клиентское приложение.
В Tarantool на стороне сервера можно использовать валидацию по схеме данных:

  • с помощью встроенной валидации box.space.format, которая затрагивает только верхний уровень полей;
  • с помощью установленного расширения avro-schema.

Источники

  • https://issueexplorer.com/repo/tarantool/errors
  • https://temofeev.ru/info/articles/tarantool-vs-redis-chto-umeyut-in-memory-tekhnologii/
[свернуть]
Решите Вашу проблему!


×
Adblock
detector