Tair和redis

集群架构

代理模式双副本集群为例。其他还有
在这里插入图片描述
configService
两台configServer互为主备
利用心跳机制检测dataServer的存活情况,并更新路由信息表
提供客户端查询路由信息表的能力
调度dataServer间的数据备份和迁移操作

dataServer
dataServer提供存储引擎
dataServer执行client请求的 put/get/remover等操作
数据的备份和迁移操作
访问统计

proxyService
代理服务器(Proxy)承担着路由转发、负载均衡与故障转移等职责

Tair的对照表

简介:
对照表主要是由configServer生成的提供给client使用key来寻找对应dataServer的路由表。

原理:
主configServer会利用心跳机制检测dataServer的存活情况,并更新路由对照表,待客户端请求时返回新的路由表。备configServer也会通过心跳,检测各自的存活情况;当主configServer失活,备configServer及时切换成主configServer提供服务。

如何告诉client对照表发生变化了?
configserver会每次为对照表维护一个版本号,每次将对照表与版本号也会发给dataServer。客户端请求数据的时候,dataserver每次都将自己的数据对照表版本号放入response中,客户端收到response后,将对照表version与本地比较,如果不相同,则再次向configser请求最新对照表。

扩缩容

后台预拷⻉:Tair集群版采用后台预拷⻉方式,数据拷⻉过程中不会影响线上业务,拷⻉完成前源端持有完整数据,规避大Key迁移卡顿等问题。
一键回滚:在扩缩容过程中若发生异常情况,支持一键回滚。
数据按槽(Slot)迁移:数据按Slot迁移,规避同一槽(Slot)内涉及多Key的命令在迁移过程中执行失败的问题。
支持同时拷贝Lua脚本:在迁移过程中会同时拷⻉Lua脚本,规避迁移后脚本丢失问题。
优化数据迁移:不用完全重分配

内存型

Tair内存型(简称内存型)适合并发量大、读写热点多,对性能要求超过Redis社区版实例的场景。相比Redis社区版,内存型重点增强了多线程性能并集成多个自研扩展数据结构。

线程架构

在这里插入图片描述
Redis社区版和原生Redis采用单线程模型,数据处理流程为:读取请求,解析请求,处理数据,发送响应。其中网络IO和请求解析占用了大部分的资源。

Tair内存型将服务各阶段的任务进行分离,通过分工明确的多个线程并行处理各阶段任务,达到提高性能的目的。
IO线程:负责请求读取、响应发送、命令解析等。
Worker线程:负责命令处理、定时器事件等。
辅助线程:负责高可用探测、保活等。
IO线程读取用户的请求并进行解析,之后将解析结果以命令的形式放在队列中发送给Worker线程处理。Worker线程将命令处理完成后生成响应,通过另一条队列发送给IO线程。
Tair内存型最多支持4个IO线程并发运行。为了提高线程的并行度,IO线程和Worker线程之间采用无锁队列和管道进行数据交换。

区别于Redis社区版6.0的多线程(主线程轮训CPU资源消耗高),内存型的Real Multi-IO能够将IO加速地更彻底,具备更高的抗连接冲击性,且可以线性地提升吞吐能力。

数据结构模块集成

云Redis社区版与开源Redis相同,支持String、List、Hash、Set、Sorted Set、Stream等数据类型,能够满足大部分场景下的开发需求,但在一些复杂场景中,原生数据类型无法直接满足某些业务需求,只能使用通过调整应用数据、使用Lua脚本等方式来实现。

内存型集成多个自研的Redis模块,包括TairString(含CAS和CAD命令)、TairHash、TairGIS、TairBloom、TairDoc、TairTS、TairCpc、TairZset、TairRoaring和TairSearch,扩展了Redis的适用性,同时降低了复杂场景下业务的开发难度。

CAS(Compare And Set)和CAD(Compare And Delete)命令为增强Redis String的功能而开发的命令,可以实现简洁高效的Redis分布式锁。
使用TairString实现乐观锁
TairString,又称为exString(extended string),是一种带版本号的string类型数据结构。原生Redis String仅由key和value组成,而TairString不仅包含key和value,还携带了版本(version),极为适合乐观锁等场景。切可传递最大值和最小值实现超量和限流控制

TairHash不但和Redis Hash一样支持丰富的数据接口和高处理性能,还改变了hash只能为key设置过期时间的限制,可以为field设置过期时间和版本,极大地提高了hash数据结构的灵活性,简化了很多场景下的业务开发工作。TairHash使用高效的Active Expire算法,可以在不对响应时间造成明显影响的前提下,更高效的完成对field的过期判断和删除。

企业级特性

数据闪回功能

优化基于AOF(Append-only-file)的持久化机制,将AOF增量归档,可实现方便快捷的秒级恢复,提升运维便捷性

热点问题

云数据库Redis会根据高效的排序和统计算法识别出实例中存在的热点Key(通常热点Key的QPS大于3,000),开启该功能后,代理节点Proxy会根据设定的规则缓存热点Key的请求和查询结果(仅缓存热点Key的查询结果,无需缓存整个Key)。当在缓存有效时间内收到相同的请求时,Proxy会直接返回结果至客户端,无需和后端的数据分片执行交互。在提升读取速度的同时,降低了热点Key对数据分片的性能影响,避免访问倾斜。

多活

数据传输服务DTS(Data Transmission Service)支持Redis企业版实例间的双向同步,适用于异地多活、数据容灾等多种应用场景
Redis全球多活是基于云数据库Redis自研的多活数据库系统,可轻松支持异地多个站点同时对外提供服务的业务场景

持久内存型

Tair持久内存型(简称持久内存型)基于持久内存技术,提供大容量、兼容Redis的内存数据库产品。单实例成本对比Redis社区版最高可降低30%,且数据持久化不依赖传统磁盘,保证每个操作持久化的同时提供近乎Redis社区版的吞吐和延时,极大提升业务数据可靠性。

适用场景
海量数据下对性能与成本要求高的场景
计算中间数据对性能的要求很高,采用Redis社区版成本较高,如果采用HBase之类的数据库存储数据则可能无法满足性能需求。采用持久存储型实例保障数据持久化的同时提供近乎Redis社区版的吞吐和延时,可很好地平衡性能与成本。

最终数据存储持久化要求高的场景
游戏场景直接采用持久存储型实例作为最终的数据存储,相较于使用Redis+MySQL的架构场景,可获得更简洁的架构,更高的性能和性价比,且数据更加可靠。

磁盘型

Tair磁盘(ESSD)型基于云盘ESSD研发,兼容Redis核心数据结构与接口,可提供大容量、低成本、强持久化的数据库服务。磁盘(ESSD)型在降低成本和提升数据可靠性的同时,也解决了原生Redis固有的fork问题而预留部分内存的问题。适用于兼容Redis、需要大容量且较高访问性能的温冷数据存储场景。

集群扩缩容

社区版Redis集群版通常会涉及到数据节点弹性扩缩容、分片间的数据迁移等需求,但业界常见的扩缩容方案仍存在一些问题,例如按Key迁移速度慢、不支持多Key命令、Lua脚本无法迁移、大Key迁移出现卡顿甚至引发高可用切换、迁移失败回滚复杂等。

Tair推出的新一代以Slot复制为原理的无感迁移数据架构,优化实例内部线程调度算法,高效、准确地控制集群行为,支持真正的无感扩缩容。下文详细介绍了社区版Redis集群、云数据库Redis集群扩缩容方案的不足以及Tair集群版无感扩缩容方案。

参考文档

https://help.aliyun.com/document_detail/145957.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值