Redis 与 Tarantool的对比
Redis 与Tarantool的对比
乍一看,这俩非常的相似:都是内存DB、都是NoSQL、也都是键值KV。
本文分三个主要部分:首先介绍什么是内存数据库,它们如何比磁盘解决方案更好?接着讲述它们的体系结构,它们的效率、可靠性和扩展性。后,深入探讨技术细节,包括数据类型、迭代器、索引、事务、编程语言、复制和连接器。
目录
1. 引言
· 什么是内存数据库?
· 为什么需要IMDB?
· 什么是Redis?
· Tarantool是什么?
2. 架构
· 性能
· 可靠性
· 可扩展性
· 数据模式验证
3. 技术特点
· 支持的数据类型
· 数据驱逐
· 带键迭代
· 二级索引
· 交易记录
· 持久化
· 存储过程编程语言
· 复制
· 来自其他编程语言的连接器
· 什么时候不使用Redis或Tarantool?
· 生态系统
· Redis的优势
· Tarantool优势
4. 总结
5. 参考文献
1.引言
什么是内存数据库?
Redis和Tarantool两者都采用内存技术。什么是内存数据库呢?内存数据库就是一个将所有数据存储在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.9,64位
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,Tarantool是78,437 RPS。
可靠性
数据存储的可靠性有两种基本应用:
· 持久性 在重新启动时,DB将从光盘加载数据,而不对外部系统进行任何查询。
· 复制如果一个节点崩溃,另一个节点上将有一个副本。复制可以是异步和同步的。
Redis和Tarantool都可以做到这一点。我们将进一步深入探讨一些技术细节。
可扩展性
可扩展性主要是指:
· 保留额外的节点,在其中一个崩溃时可以相互替换;
· 如果数据不适合单个节点,则必须在多个节点之间分布存放。
Redis
Redis节点可以通过异步复制的方式互联。我们将这些节点称为副本集。管理副本集的是Redis Sentinel。Redis 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。
· TarantoolCartridge(vshard)中的分片桶数量是可定制的。它在创建群集时设置一次。
桶重平衡(重新分片)
· 在Redis Cluster中,设置和启动是手动的。
· 它们在TarantoolCartridge(vshard)中是自动的。
查询路由
· 在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数据类型更适合在SQL和NoSQL DBMS中存储对象和/或文档。
数据驱逐
Redis和Tarantool都有引擎来限制占用的内存。如果客户端在达到限制后尝试添加数据,数据库将返回错误。不过,在这种情况下,Redis和Tarantool都将继续读取查询。
让我们看看如何删除«不再需要»的数据。Redis包括几个数据驱逐引擎:
· TTL -对象的生存期到期后立即驱逐;
· LRU -长期使用的数据驱逐;
· 随机-随机对象驱逐;
· LFU -很少使用的数据驱逐。
所有引擎都可以为整个数据量或仅为标记为可驱逐的对象设置。
在Tarantool中,过期或索引扩展可用于驱逐。另一个选项是创建用户自己的后台过程,该过程将按索引实现(例如,带有时间戳),并将删除不必要的数据。
带键的迭代
在Redis中,带键迭代可以通过运算符来完成:
· 扫描;
· 带键的迭代。
事务返回带有结果的页面。要获取新页面,必须发送上一个页面的ID。事务支持按模板过滤。
Tarantool提供了一个更灵活的«带键的迭代»模式。直接迭代和反向迭代都是可能的,用户还可以在对值进行过滤筛选。用户可以移动到某个键值,然后按升序或降序检查后续键,只是检查方向不能更改。
例如:
二级索引
Redis
Redis没有二级索引,但有一些方法可以模仿它们。
· 元素的顺序编号可以用作有序集合中的次键。
· 或,哈希映射可以将其密钥视为数据索引。
Tarantool
在Tarantool中,可以创建自定义数量的辅助数据索引。
· 次键可能包含多个字段。
· 类型HASH、树、RTREE和BITSET可用于二级索引。
· 辅助索引可以包含键和非键。
· 区域设置可用于任何索引,例如。,用于与寄存器无关的字符串值。
· 辅助索引可以基于具有值数组的字段(有时称为MultiIndex)。
总结
次键和方便的迭代器支持在Tarantool中构建关系数据存储模型,而在Redis中不可能构建这样的模型。
交易记录
事务允许执行多个操作。Redis和Tarantool都支持事务。Redis中的事务示例:
Tarantool中交易实例
持久化
数据持久化由两个引擎来保证-
· 以指定的间隔将内存中的数据记录到磁盘----快照;
· 所有传入操作的连续预写日志记录----事务日志。
Redis和Tarantool都有这些持久化引擎。
Redis
Redis以指定的时间间隔快照所有内存中的数据。默认情况下,每60秒完成一次(这个时间间隔可以自己定义)。Redis通过OS.fork复制当前内存中的数据,然后将数据存储到磁盘。在异常关闭的情况下,Redis会从近的保存中恢复其状态。如果后一个快照是很久以前制作的,则快照之后接收的所有数据都将丢失。
事务日志用于存储到达数据库的所有信息。每个操作都记录在磁盘日志中。当Redis启动时,它从快照恢复其状态,然后从日志中添加剩余的操作。
· 在Redis中,快照称为RDB(RedisDataBase)。
· Redis中的事务日志称为AOF(仅追加文件)。
Tarantool
· 持久性引擎源自数据库体系结构。
· 它是全面的,具有快照和事务日志记录。
· 此机制确保了基于WAL的可靠复制。
Tarantool以指定的时间间隔快照当前内存中的数据,并将每个事务记录到日志中。
· Tarantool中的快照称为snap,可以以任何频率来完成。
· 在Tarantool中,事务日志称为WAL(提前写入日志)。
在Redis和Tarantool中,每个引擎都可以关闭。当要进行可靠的数据存储时,两个引擎都应打开。用户可以权衡持久性并关闭快照和日志记录,以确保尽可能高的操作速度。
差异点
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}
存储过程编程语言
存储进程是在数据段中执行的代码。Redis和Tarantool都建议使用Lua创建存储进程。这种语言很简单。它是为那些在特定领域使用编程来解决任务的人设计的。
从数据库开发人员的角度来看:
· Lua可以很容易地集成到现有的应用程序中。
· 它很容易与应用程序的对象和进程集成。
· Lua具有动态类型化和自动内存管理。
· 此语言有一个垃圾收集器-增量标记和扫描。
差异点
实现方式
· Redis是PUC-Rio的一个普通实现。
· Tarantool使用LuaJIT。
任务超时
· Redis允许用户设置一个超时时间,在该超时时间之后,存储进程的执行将结束。
· 在Tarantool中,存储进程的编译和执行速度更快,但不能设置超时。要结束存储过程,用户应设置检查结束标志。
运行时
· Redis是单任务处理的:它逐个执行任务。
· Tarantool使用协作多任务处理。它一个接一个地执行任务,但同时任务放弃了IO操作管理。
总结
· 在Redis中,Lua只是关于存储进程。
· 在Tarantool中,它是一个支持与外部系统通信的协作运行。
复制
复制是一个引擎,它允许对象从一个节点复制到另一个节点。复制可以是异步和同步的。
· 异步复制:在将对象添加到一个节点后,系统不会等待它复制到第二个节点。
· 同步复制:添加对象后,系统等待它在个和第二个节点保存。
Redis和Tarantool支持异步复制,而同步复制仅在Tarantool中可用。
在某些情况下,我们需要等待对象复制:
· 在Redis中,我们使用wait命令。它只接受两个参数:
· 对象必须获得的副本数;
· 发生这种情况所需的时间。
· 在Tarantool中,它可以使用代码片段-伪代码:
同步复制
Redis没有同步复制。Tarantool在2.6的版本中有。
来自其他编程语言的连接器
Redis和Tarantool都支持流行编程语言的连接器:
· Go;
· Python;
· NodeJS;
· Java.
完整列表:
· https://redis.io/clients
· https://tarantool.io/ru/download/connectors
什么时候不使用Redis或Tarantool?
Redis和Tarantool都对OLAP任务定制得很差。二者在线分析处理处理历史或存档数据。OLAP的事务相对较少,查询通常很复杂,聚合操作也一样。
二者的数据都是逐行存储的,这使得聚合算法与面向列的数据库相比效率较低。
Redis和Tarantool对数据使用单线程,这使得并行分析查询变得不可能。
生态系统
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
相关文章