Redis 与 Tarantool的对比

2022-04-14 00:00:00 数据 数据库 节点 复制 快照

Redis Tarantool的对比

 

乍一看,这俩非常的相似:都是内存DB、都是NoSQL、也都是键值KV

本文分三个主要部分:首先介绍什么是内存数据库,它们如何比磁盘解决方案更好?接着讲述它们的体系结构,它们的效率、可靠性和扩展性。后,深入探讨技术细节,包括数据类型、迭代器、索引、事务、编程语言、复制和连接器。

 

目录

 

1.    引言

·       什么是内存数据库?

·       为什么需要IMDB

·       什么是Redis

·       Tarantool是什么?

2.    架构

·       性能

·       可靠性

·       可扩展性

·       数据模式验证

3.    技术特点

·       支持的数据类型

·       数据驱逐

·       带键迭代

·       二级索引

·       交易记录

·       持久化

·       存储过程编程语言

·       复制

·       来自其他编程语言的连接器

·       什么时候不使用RedisTarantool

·       生态系统

·       Redis的优势

·       Tarantool优势

4.    总结

5.    参考文献

 

 

1.引言

 

什么是内存数据库?

RedisTarantool两者都采用内存技术。什么是内存数据库呢?内存数据库就是一个将所有数据存储在RAM中的数据库。它的大小受节点RAM容量的限制。虽然内存容量限制了数据的总量,但是系统处理速度却大幅度提高。内存数据库可以地存储到磁盘上。系统节点可以在不丢失信息的情况下重新启动。如今,内存数据库早已用作生产中的主存储。例如,俄罗斯的Mail.ruCloud Solutions使用Tarantool作为主数据库,将元数据存储在其S3兼容的对象存储库中。内存数据库还用于高速数据访问,它每秒能够处理10,000个请求。

人们为什么需要内存数据库?

Cache(缓存)。内存数据库通常是当做磁盘数据库的缓存用。RAM比任何磁盘(甚至SSD)都快得多。但是,缓存的问题是一旦重新启动或系统崩溃,就无法使用。

要避免崩溃,人们就得对缓存进行持久性、保留和分片等处理。

·       持久性,就是将缓存里的数据存储在磁盘上。重新启动后,状态重新恢复。否则的话,人们将长时间保持缓存数据,主数据库崩溃几率大大增加。

·       保留,意味着缓存可以复制数据。如果一个节点崩溃,第二个节点将接收查询。由于有保留节点,主存储不会因为过载而崩溃。

·       分片,如果热数据不适合节点的RAM,则多个节点将并行使用。这就是指水平扩展。

采用分片技术可以做一个大规模的系统。采用保留技术可以做一个可靠的系统。再加上持久性,我们可获得集群数据存储。它可以存储TB的数据,并以惊人的速度访问它,甚至超过百万RPS

OLTP代表在线事务处理。内存解决方案由于其体系结构而适合此类任务。OLTP包括许多短在线事务,如插入、更新、删除。OLTP系统的主要内容是快速处理查询和确保数据完整性。效率通常以RPS衡量。

 

Redis是什么?

·       Redis是一个内存数据结构存储。

·       Redis是一个键值存储。

·       如果你在谷歌上搜索«数据库缓存»几乎每篇文章都会提到Redis

·       Redis只提供主键访问,不支持二级索引。

·       Redis包含Lua存储过程引擎。

 

Tarantool是什么?

·       Tarantool是一个内存计算平台。

·       Tarantool是一个支持文档和关系数据模型的键值存储。

·       它是为热数据而设计的--MySQL缓存在社交网络中,但逐渐成为一个功能齐全的数据库。

·       Tarantool可以提供任意数量的索引。

·       Tarantool也支持Lua中的存储过程。

 

2、架构

 

性能

关于内存数据库流行的问题是«它们的速度有多快?»«我们可以获得多少百万RPS»。这里我们来做一个简单的合成测试,尽可能近似真正数据库的设置。用Go语言脚本使用随机键填充存储。

硬件配置是

MacBook Pro 2,9 GHz四核英特尔酷睿i7

Redis版本6.0.964

Tarantool 2.6.2

Redis

文件:redis_test.go

内容:

redis_test.go



Tarantool


Tarantool
初始化:

 


启动。为了将数据库加载到大限度,我们使用更多的线程。


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,Tarantool78,437 RPS

 

可靠性

 

数据存储的可靠性有两种基本应用:

 

·       持久性  在重新启动时,DB将从光盘加载数据,而不对外部系统进行任何查询。

·       复制如果一个节点崩溃,另一个节点上将有一个副本。复制可以是异步和同步的。

 

RedisTarantool都可以做到这一点。我们将进一步深入探讨一些技术细节。

 

可扩展性

 

可扩展性主要是指:

·       保留额外的节点,在其中一个崩溃时可以相互替换;

·       如果数据不适合单个节点,则必须在多个节点之间分布存放。

 

Redis

Redis节点可以通过异步复制的方式互联。我们将这些节点称为副本集。管理副本集的是Redis SentinelRedis Sentinel是一个特殊的进程,或者是其中的几个集群进程,用于监控Redis节点。他们执行4项主要任务:

1)    检查组中的节点状态-死或活。

2)    如果组内出现问题,通知系统管理员。

3)    主机自动倒换。

4)    为外部客户端配置提供程序,以便他们知道连接到哪里。

如果数据要分片到多个节点,Redis提供了开源版本的Redis Cluster。它支持从多个复制组构建群集。集群中的数据在16384个插槽上进行分片。槽位范围在Redis节点之间是确定的。

群集中的节点通过单独的开放端口通信,以便了解其邻居的状态。不过,如果要使用RedisCluster,应用程序得使用特殊的连接器。

 

Tarantool

Tarantool支持复制和分片。可扩展性管理的关键工具是Tarantool Cartridge。它将节点合并为副本集。用户可以创建一个此类组,并与Redis Sentinel一样使用它。Tarantool Cartridge可以管理多个副本集,并跨集合进行分片数据。vshard库就是用于分片的。

 

差异点

管理

 

·       RedisCluster中的脚本和命令。

·       Tarantool墨盒中的Web界面或API

 

分片桶Sharding buckets

 

·       Redis中的分片桶数量是固定的,就是16384

·       TarantoolCartridgevshard)中的分片桶数量是可定制的。它在创建群集时设置一次。

 

桶重平衡(重新分片)

·       Redis Cluster中,设置和启动是手动的。

·       它们在TarantoolCartridgevshard)中是自动的。

 

查询路由

·       Redis Cluster中,查询在客户端应用程序的一侧路由。

·       TarantoolCartridge中,查询在群集路由器节点上路由。

 

数据架构验证

Redis中,主数据模式是key-value,但值可以包含不同的结构。您不能在服务器端设置验证规则。用户无法指示某些数据类型应该如何使用,以及值应该具有什么结构。架构必须由连接器或客户端应用程序验证。

Tarantool支持服务器端的数据模式验证:

·       使用集成的验证框.space.格式,该格式仅涵盖字段的部分;

·       使用已安装的Avro架构扩展。

 

3、技术特点

可以存储哪些数据类型?

Redis中,只有字符串可以是键。Redis支持以下数据类型:

·       字符串;

·       字符串列表;

·       字符串的无序集合;

·       哈希映射或仅键值字符串对;

·       字符串的有序集合;

·       位图和HyperLogLog

 

Tarantool支持以下数据类型:

·       原语

o  字符串;

o  布尔值(真或假);

o  整数;

o  带浮点;

o  带小数浮点;

o  UUID.

·       复合体

o  数组;

o  哈希映射。

Redis数据类型更适合事件计数器,包括的计数器,以及小型成品数据集市的存储。

Tarantool数据类型更适合在SQLNoSQL DBMS中存储对象和/或文档。

 

数据驱逐

RedisTarantool都有引擎来限制占用的内存。如果客户端在达到限制后尝试添加数据,数据库将返回错误。不过,在这种情况下,RedisTarantool都将继续读取查询。

让我们看看如何删除«不再需要»的数据。Redis包括几个数据驱逐引擎:

·       TTL -对象的生存期到期后立即驱逐;

·       LRU -长期使用的数据驱逐;

·       随机-随机对象驱逐;

·       LFU -很少使用的数据驱逐。

所有引擎都可以为整个数据量或仅为标记为可驱逐的对象设置。

 

Tarantool中,过期或索引扩展可用于驱逐。另一个选项是创建用户自己的后台过程,该过程将按索引实现(例如,带有时间戳),并将删除不必要的数据。

 

带键的迭代

Redis中,带键迭代可以通过运算符来完成:

·       扫描;

·       带键的迭代。

事务返回带有结果的页面。要获取新页面,必须发送上一个页面的ID。事务支持按模板过滤。

Tarantool提供了一个更灵活的«带键的迭代»模式。直接迭代和反向迭代都是可能的,用户还可以在对值进行过滤筛选。用户可以移动到某个键值,然后按升序或降序检查后续键,只是检查方向不能更改。

 

例如:

二级索引

 

Redis

Redis没有二级索引,但有一些方法可以模仿它们。

·       元素的顺序编号可以用作有序集合中的次键。

·       或,哈希映射可以将其密钥视为数据索引。

 

Tarantool

Tarantool中,可以创建自定义数量的辅助数据索引。

·       次键可能包含多个字段。

·       类型HASH、树、RTREEBITSET可用于二级索引。

·       辅助索引可以包含键和非键。

·       区域设置可用于任何索引,例如。,用于与寄存器无关的字符串值。

·       辅助索引可以基于具有值数组的字段(有时称为MultiIndex)。

 

总结

 

次键和方便的迭代器支持在Tarantool中构建关系数据存储模型,而在Redis中不可能构建这样的模型。

 

交易记录

 

事务允许执行多个操作。RedisTarantool都支持事务。Redis中的事务示例:


Tarantool
中交易实例


持久化

数据持久化由两个引擎来保证-

·       以指定的间隔将内存中的数据记录到磁盘----快照;

·       所有传入操作的连续预写日志记录----事务日志。

RedisTarantool都有这些持久化引擎。

 

Redis

Redis以指定的时间间隔快照所有内存中的数据。默认情况下,每60秒完成一次(这个时间间隔可以自己定义)。Redis通过OS.fork复制当前内存中的数据,然后将数据存储到磁盘。在异常关闭的情况下,Redis会从近的保存中恢复其状态。如果后一个快照是很久以前制作的,则快照之后接收的所有数据都将丢失。

事务日志用于存储到达数据库的所有信息。每个操作都记录在磁盘日志中。当Redis启动时,它从快照恢复其状态,然后从日志中添加剩余的操作。

·       Redis中,快照称为RDB(RedisDataBase)

·       Redis中的事务日志称为AOF(仅追加文件)。

 

Tarantool

·       持久性引擎源自数据库体系结构。

·       它是全面的,具有快照和事务日志记录。

·       此机制确保了基于WAL的可靠复制。

Tarantool以指定的时间间隔快照当前内存中的数据,并将每个事务记录到日志中。

·       Tarantool中的快照称为snap,可以以任何频率来完成。

·       Tarantool中,事务日志称为WAL(提前写入日志)。

RedisTarantool中,每个引擎都可以关闭。当要进行可靠的数据存储时,两个引擎都应打开。用户可以权衡持久性并关闭快照和日志记录,以确保尽可能高的操作速度。

 

差异点

Redis使用OS.fork进行快照。Tarantool使用所有数据的内部读取视图,这比fork快。

默认情况下,Redis仅具有快照功能。Tarantool同时具有快照和事务日志。

Redis只存储和使用一个文件,用于快照和事务日志。默认情况下,Tarantool存储两个快照文件(但此数量是可自定义的)和持续扩大无限数量的事务日志。如果Tarantool中的快照文件损坏,它可以使用上一个快照文件加载。在Redis中,用户需要设置备份。

 

Redis不同,Tarantool中的快照和日志形成了文件系统中数据显示的通用引擎。这意味着在Tarantool中,快照文件和日志存储事务上的所有元信息,即谁创建了事务,以及何时创建了事务。它具有相同的格式,是互补的。

 

修复问题

Redis日志文件毁坏时:

redis-check-aof --fix

Tarantool日志文件毁坏时:

tarantool> box.cfg{force_recovery=true}

 

存储过程编程语言

存储进程是在数据段中执行的代码。RedisTarantool都建议使用Lua创建存储进程。这种语言很简单。它是为那些在特定领域使用编程来解决任务的人设计的。

从数据库开发人员的角度来看:

·      Lua可以很容易地集成到现有的应用程序中。

·      它很容易与应用程序的对象和进程集成。

·      Lua具有动态类型化和自动内存管理。

·      此语言有一个垃圾收集器-增量标记和扫描。

 

差异点

 

实现方式

·      RedisPUC-Rio的一个普通实现。

·      Tarantool使用LuaJIT

 

任务超时

·      Redis允许用户设置一个超时时间,在该超时时间之后,存储进程的执行将结束。

·      Tarantool中,存储进程的编译和执行速度更快,但不能设置超时。要结束存储过程,用户应设置检查结束标志。

 

运行时

·      Redis是单任务处理的:它逐个执行任务。

·      Tarantool使用协作多任务处理。它一个接一个地执行任务,但同时任务放弃了IO操作管理。

 

总结

 

·      Redis中,Lua只是关于存储进程。

·      Tarantool中,它是一个支持与外部系统通信的协作运行。

 

复制

复制是一个引擎,它允许对象从一个节点复制到另一个节点。复制可以是异步和同步的。

·      异步复制:在将对象添加到一个节点后,系统不会等待它复制到第二个节点。

·      同步复制:添加对象后,系统等待它在个和第二个节点保存。

 

RedisTarantool支持异步复制,而同步复制仅在Tarantool中可用。

在某些情况下,我们需要等待对象复制:

·      Redis中,我们使用wait命令。它只接受两个参数:

·      对象必须获得的副本数;

·      发生这种情况所需的时间。

·      Tarantool中,它可以使用代码片段-伪代码:

 


同步复制

Redis没有同步复制。Tarantool2.6的版本中有。

 

来自其他编程语言的连接器

RedisTarantool都支持流行编程语言的连接器:

·       Go

·       Python

·       NodeJS

·       Java.

 

完整列表:

·       https://redis.io/clients

·       https://tarantool.io/ru/download/connectors

 

什么时候不使用Redis或Tarantool?

RedisTarantool都对OLAP任务定制得很差。二者在线分析处理处理历史或存档数据。OLAP的事务相对较少,查询通常很复杂,聚合操作也一样。

二者的数据都是逐行存储的,这使得聚合算法与面向列的数据库相比效率较低。

RedisTarantool对数据使用单线程,这使得并行分析查询变得不可能。

 

生态系统

 

Redis

Redis模块有三类:

·       企业;

·       针对企业和开源进行验证和认证;

·       未经验证。

 

企业模块:

·       全文搜索;

·       通过开花过滤器存储和搜索;

·       时间序列存储。

认证:

·       存储图形和对图形的查询;

·       JSON的存储和对其的查询;

·       ML模型的存储及其操作。

 

Tarantool

模块分为两类:

·       嵌入式:https://www.tarantool.io/en/doc/latest/reference/

· 企业:https://www.tarantool.io/en/enterprise_doc/rocksref/#closed-source-modules

 

Redis的优势

·       更容易使用。

·       网络上有更多信息,20000个关于Stackoverflow的问题(其中7000个待回答)。

·       进入门槛较低。

·       有更多使用Redis的人。

 

Tarantool优势

·       Telegram上的免费开发人员支持。

·       二级索引可用。

·       索引迭代可用。

·       可用用于群集管理的UI

·       具有协作多任务处理的应用程序服务器。它类似于单流Go

·       更高的生产上限。

 

4.总结

 

Redis提供了一个很棒的缓存,但它不能用作主存储。Tarantool是一个多范式数据库,可用作主存储。

Tarantool支持:

·       SQL的关系存储模型。

·       分布式NoSQL存储。

·       缓存创建。

·       制作队列代理。

 

Redis的入口门槛较低。


来自:https://mp.weixin.qq.com/s/ttzeL3c_ljZggmcf7XfkrA     


相关文章