前言
2022年9月,云原生内存数据库Tair在阿里云正式上线。实际上,Tair在阿里内部已经使用超过十年,是阿里集团内部业务使用最广泛、访问量最大的数据库产品之一,特别是在线业务场景;同时,2020年开始,Tair在阿里云上也以阿里云Redis企业版/增强版的形态提供给广大客户,已被各行业大量客户使用。
Tair的历史和发展
准确的说,Tair在阿里内部诞生已有十三年。很多朋友肯定会想,为什么会是十三年了?
Tair最初是诞生在淘宝,定位是作为数据库之前的缓存,最开始用在了淘宝的用户中心;我们花了5年时间,将Tair从缓存演进到分布式KV存储兼备,场景也全方位覆盖了互联网在线业务,例如从淘宝的用户登陆、购物浏览、下单交易、消息推送等等都会访问Tair;技术上,这个阶段也伴随着单机到分布式系统的演进、存储介质的变化(HDD -> SSD) 、 新型存储引擎的兴起(LSM)等。
2014年至2015年,我们逐步走向对外服务,兼容社区生态,在阿里云上推出了OCS(兼容Memcache)产品和Redis产品,为客户提供了开箱即用的产品服务。
在2015年至2019年间,除了面向外部客户的云上Redis等产品迭代演进之外,Tair面向阿里集团内部的客户群体,重点打造低成本、高稳定性、客户使用体验等基础能力,支撑了阿里双十一每秒数十亿级别的访问量。同时研发丰富的模块扩展以应对不断涌现的新场景,例如孵化了TairGraph,以面向高度连接数据的存储和处理。
2019年至今,Tair在兼容Redis生态和Gremlin生态的同时,结合云原生技术演进,在经历了十三载阿里内部和外部客户在线实时场景的大规模实践和积累后,正式对外推出云原生内存数据库Tair。
Tair的定位
随着互联网和产业互联网的发展,各个行业和系统都逐步走向了在线化,通过线上服务来满足客户需求。这个阶段,爆发了非常多、丰富的在线数据管理的需求。
Tair内存数据库的定位,也从最初阿里内部承载超大流量的缓存,逐步扩展到提供高性能的、低延时的、支持多样化数据结构的实时数据处理系统。我们期待用一套可靠的高性能数据库系统,来服务客户更多的在线场景,让数据实时在线;同时,兼容业内的开源生态(Redis、Memcache、图数据库的Gremlin、SQL接口等);并结合云原生的技术,给客户提供更好的弹性、更低的成本、更高的稳定性、更优的体验。
Tair自主研发
Tair兼容了开源的生态,同时也期望能在在线数据管理场景上成为先进生产力的代表。这就要求Tair能有硬核的技术能力、能灵活地应对客户场景和能快速地跟上技术的演进,所以采取了自主研发的路线。
整套系统依托于云的基础设施构建,例如弹性裸金属服务器、倚天芯片、阿里云操作系统、高性能网络、云存储、容器等,除了云原生能力优势之外,也能够更快吸收云基础设施演进带来的技术红利。
并行处理引擎
Tair数据库的引擎是一个多线程的实现。相比开源的Redis版本,从本质上解决了单处理线程带来的多种问题,例如压力过大时导致的同步断线、出力慢时统计数据无法获得、pubsub在订阅客户端过多时不堪重负等问题。
Redis社区 6.x版本
Tair多线程引擎
技术实现上,Tair完全实现了多线程的并发引擎操作,突破了Redis社区版单机处理能力受限于工作线程处理的上限问题,也带来了更高的吞吐和更低的延时。在访问key均匀的情况下,可以水平扩展线程数量提升单分片性能(且接口完全兼容Redis社区版),在用户业务强依赖单节点访问方式(如事务处理)且短时间内无法适配集群版的情况下,能帮助用户承接业务增长和访问流量压力。
下图是阿里云上售卖的4G内存规格的Tair和Redis的性能对比,可以看到无论是吞吐能力还是延时,Tair都优于Redis。测试环境为:
客户压测机:云服务器ECS实例,规格为ecs.g5ne.16xlarge;
测试参数:256byte的value长度;关闭aof;
启动16个线程、256个连接、3000000个Key的redis-benchmark来进行GET/SET;
Redis & Tair 性能比较
实际上,单线程集群部署和多线程引擎单机部署各有优势。单线程集群部署的可扩展性很好,同时DB节点的处理比较简洁;不过,在某些用户场景下,单节点的多线程引擎是更符合客户需求的,例如客户如果需要对存储的数据做较为复杂的计算处理或者事务操作,那么单节点内部线程的可扩展性可以避免由于集群模式带来的网络来回开销或者分布式事务处理的复杂性。不少游戏客户场景中就有类似的需求,客户使用lua来处理多key的事务,同时期望单节点达到数十万的QPS,目前的Tair多线程引擎很好满足了该类客户的需求;同时既有的分布式架构也能满足大规格客户的需求。
兼容生态回馈生态
Tair在自主研发和完整兼容开源生态的同时,也在积极建设开源社区。就Redis社区来说,阿里云Tair团队共向Redis贡献200+patch,同时在Redis社区拥有1名core team member(核心维护者)和2名contributor(核心贡献者),是除原作者和Redis商业公司之外的,对Redis社区贡献最大的组织。
很多时候,Redis的用户都需要在不同实例之间搬迁数据。而RedisShake是我们开源的Redis数据传输工具,支持对Redis数据进行解析(decode)、恢复(restore)、备份(dump)和同步(sync或rump),满足客户在多种场景下的Redis搬迁需求。目前RedisShake在github上star数目超过2500,已经成为Redis用户的常用工具。
最新发布的Redis 7.0中,Tair主导和参与实现了众多重大功能,例如multi-part aof,解决了之前AOFRW存在的内存和CPU开销对Redis实例甚至业务访问带来的不利影响;同时,这次Redis 7.0的release note中,也可以看到已经有超过5名国内开发者贡献了核心feature,并贡献了近半数commit,展现了Redis本身生态的繁荣和高速发展。目前,Tair也一直和社区密集交流,期望将Redis建设成具有更丰富特性、更易用、更稳定的实时数据处理平台。
除了向Redis社区贡献之外,Tair自身还开源了众多Tair Module,例如TairString、TairHash、TairZset,这些都是在阿里集团内应用多年的。例如基于TairString实现高效限流器,通过简单的设置MAX/MIN的value,可以高效的实现秒杀抢购、并发限流、访问频率限制、密码修改限制等场景;基于TairZset可以轻松实现多维排行榜,例如游戏场景中的根据积分和时间等多个维度来进行排行的需求。此类Module,我们也开源了对应的多语言SDK来进行适配访问。
企业级安全能力加固
相比开源,自研产品往往具备更高的可控性和管理能力,而其中安全特性受到了越来越多客户的关注和重视。开源社区版本的Redis主打高性能和易用性;而做为自研内存数据库的Tair,在兼顾高效服务的同时,也在安全能力上做了非常多工作。从访问链路层、从账户和审计层、从引擎运行安全、从数据落盘和数据可能损毁的风险层面都做了措施。例如数据任意时间点回溯功能,可以帮助客户恢复到7天内的某个时间点的数据,确保数据可靠性;例如审计日志可以快速分析top的客户用户、访问来源和命令等,除了分析安全因素外,也能很快解决线上问题。
可观测性增强,快速定位问题
Tair做为内存数据库,一般都会用在客户在线数据管理的关键位置。稳定性是客户最为关心的一环,客户期望Tair不出问题安安静静的呆着,持续承接着大流量访问和平滑的数据处理。但是,系统的稳定性取决于非常多方面因素:引擎的处理能力、客户数据分布情况和热度、客户查询命令复杂度、服务器的负载和网络的情况等等。在出现抖动或者异常时,系统如何帮助客户快速定位问题至关重要,这些很大程度取决于系统提供的数据丰富度及在此基础之上对这些数据的利用。
Tair自研系统对引擎自身和上下游系统进行了全面的埋点,最大程度收取数据并进行处理分析。面向客户侧,客户可以快速察看访问的用户数和Top的访问用户、Top的访问客户端来源、Top的执行命令等;也可以对实时热key进行分析,解决业务热点的问题;可以通过时延洞察分析延时较大的命令,以此来解决慢查询等。
基于存储级内存的存储引擎
除了高性能的多线程处理引擎之外,Tair基于SCM存储级内存的自研存储引擎,对DRAM内存和存储级内存进行了混合分层存储,通过高效的数据放置和引擎设计,在吞吐上做到了和社区版Redis全内存基本相当,而单位容量的售卖价格会降低30%左右;同时,从内存的易失性到存储级内存的持久能力,Tair自研引擎的每个操作都能实时持久化,再配以系统层面的半同步机制,数据的可靠性大幅提升; 这项最新成果,我们也将之发布在了2022年的vldb会议上。
Tair在互联网的应用
我们来看一下目前Tair在互联网行业的应用。拿一个电商来看,主要有导购、交易、广告和风控等,其实这里的大部分系统不仅仅在电商里有,在其他的社交、游戏、金融、出行等行业也都普遍存在。这里面有缓存的需求,例如导购场景下,商品的库存和价格;用户的session信息;广告场景下,广告物料等;也有高性能数据库的需求,例如消息推送,指标平台和实时特征等;同时也有不少需要图计算和内存计算处理的场景,例如购物车实时优化、知识图谱异构数据融合决策等等; 所以,Tair内存数据库,在各行各业的场景中,让数据实时在线。
展望
观察业内内存数据库的发展,除了做强自身系统之外,还有两个显著的特征:
一是发展更多的数据结构,包括支持SQL接口访问。这个在Redis商业公司上表现的尤为明显,这几年陆续发布了RedisJson、RedisGraph、RedisTimeSeries、RedisBloom和RediSearch等Module。这个Redis本身的定位匹配,通过高效易用的数据结构来降低业务开发复杂度,目前Redis正重点推进RediSearch,一个轻量级的全文搜索引擎,我们也在国内看到了不少客户正在使用RediSearch。而随着这些数据结构的丰富,Redis内存数据库,也实实在在从当年的缓存在转变为一个实时数据处理平台。
二是数据的可靠性,内存数据库并不是仅仅把数据放在内存中,一般的做法依然会将数据放到磁盘上做checkpoint和增量日志,包括如何在多节点上做数据复制。Redis目前的做法就是通过持久化RDB和AOF来保障,但是AOF的sync级别和主从节点的异步复制模式导致了数据无法做到强一致。目前例如AWS的MemoryDB通过远端共享存储来做到数据的高可靠但同时也牺牲了较多的写入性能。
同样,Tair在这两块上过去投入了很多,也将持续投入。目前Tair已经在提供的众多扩展数据结构已经被广泛使用;同时,依托云原生的基础设施,通过软硬结合、共享存储和高速网络等技术,在保持服务能力的同时,不断提升数据高可靠。
注:文中提到的性能提升数据均经过阿里云测试得出,实际使用中可能因使用场景不用有所差异,请以实际使用情况为准。
/ End /