GaussDB(forRedis)揭秘:Redis存算分离架构最全
解析
前⾔:
本⽂根据华为云NoSQL数据库架构师余汶龙,在今年的中国系统架构师⼤会SACC上的演讲整理⽽成,内容如下。
本次分享的⼤纲分成如下四个部分:
1. 什么是GaussDB(for Redis)?
2. 为什么选择存算分离
3. 设计与实现
4. 竞争⼒总结
什么是GaussDB(for Redis)
1.1 开源Redis有哪些缺点?
要回答什么是GaussDB(for Redis)(下⽂简称⾼斯Redis)的问题,⾸先要从背景讲起。开源Redis是个⾮常好的KV缓存,但随着各种业务的蓬勃发展,数据规模、吞吐规模、业务复杂度的不断上升,开源Redis暴露出诸多问题:
1.A OF膨胀问题
开源Redis的定位是缓存,但为了满⾜业务的宕机数据快速恢复,增加了AOF⽇志来实现⼀定的持久化功能。可惜在Redis的设计⾥,并没有⼀个转储⽂件机制来消耗AOF,⽽是通过AOF重写,来不断的去重合并旧⽇志。⽽该重写机制需要⼀次fork调⽤,该调⽤会带来内存翻倍、性能阻塞等问题。
2.快照备份问题
随着业务对Redis的依赖越来越重,数据备份也变得⾮常重要。众所周知,Redis架构并⾮MVCC结构,因此想要备份数据,难免需要悲观锁定之后,拷贝内存数据。不过Redis作者设计了⼀个copy on write的⽅案,即调⽤fork,创建出⼦进程进⾏数据拷贝,避免了⽤户态加锁。然⽽,这个过程其实会在内核侧加锁,依然会给业务性能带来明显抖动。
3.主从脱节问题
开源Redis采⽤主从⾼可⽤架构,数据采⽤异步模式传输。因此主宕机之后,很容易造成数据丢失或不⼀致。此外,当主节点写⼊压⼒较⼤时,单线程的主从复制很可能⽆法追平增量数据,就会导致buffer堆积,进⼀步还可能出现写失败甚⾄OOM的灾难。虽然Redis能够通过临时⽣成快照并同步⼤⽂件,来尝试追平主从巨⼤差异,但如前⽂所述,此时⼜会引发fork系列问题。
4.f or k问题
redis支持的数据结构fork其实是个⾮常重的系统调⽤,虽然是写时拷贝,但是通常也会给他预留⼀倍的内存。fork⼯作时还需要加锁拷贝进程页表等信息,对业务的影响⾮常之⼤。上述3个问题的背后都有fork的因素,通常需要DBA采⽤关闭主节点AOF、关闭主节点备份等复杂运维⼿段来避免。但在主从频繁切换、节点数很多的场景下,运维是⾮常困难的。甚⾄在主从脱节场景,理论上毫⽆办法规避。
5.容量问题
开源Redis不适合⼤规模使⽤,有两个重要因素限制了其扩展性。⾸先是fork限制了Redis的垂直扩展能⼒(Scale Up),数据量越
⼤,fork越慢,对业务的影响就越⼤,因此单个Redis进程可承载的数据量⾮常有限。其次,低效率的gossip集管理限制了其⽔平扩展能⼒(Scale Out):因为节点数越多,其故障发现的时间越长,并且内部通信的⽹络风暴成⼏何级数增加,导致⼤集⼏乎不可⽤。
1.2 业界有哪些解决办法?
以上就是各⼤企业在开源Redis的⽣产实践中,真实碰到的经典问题。这些问题限制了开源Redis的⼤规模应⽤。因此,近年来业界提出了⾮常多的解决⽅案,见下图。
本质上,Redis是⼀种KV存储,按照场景其实可以进⼀步划分为两⼤阵营:缓存与持久化。
缓存场景:⼀般⽤来存放秒杀、热点事件的数据。⽐如微博热搜,这类数据是有有效期的,⽽且可丢。
持久化场景:在⽤Redis做缓存的时候,由于其接⼝简单、功能丰富,⼤家必然希望将更多重要数据也持久化存放到Redis,⽐如历史订单、特征⼯程、位置坐标、机器学习等。这类数据的数据量往往很⼤、有效期也很长、⼀般不可丢。
缓存场景⽐较简单就是开源Redis,持久化场景业界已有⾮常多⾃研产品,⽐如360的ssdb/pika,阿⾥的tair,腾讯的tendis,当然华为云的⾼斯Redis也属于⾃研的持久化Redis。
这⾥也补充另⼀个做持久化的理由,从成本考虑,256G内存条价格⽐256G的SSD磁盘⾼了将近30倍,在可⽤容量上也有巨⼤差异。
1.3 华为云数据库的解法是啥?
华为云数据库团队吸取开源Redis的经验,选择了⾃研持久化Redis,即今天分享的主⾓——⾼斯Redis。它的⼀句话定位是:⽀持Redis协议的NoSQL数据库,⽽不是缓存。它有两个跟业界完全不⼀样的特性:
1. 存算分离。⾼斯Redis基于华为内部⾃研分布式存储DFV,提供强⼤的数据存储能⼒,包括强⼀致、弹性扩缩容等⾼级特性。DFV为
何物?它是华为全栈数据服务的基⽯,⽐如⽂件EVS、对象OBS、块存储,还有数据库族、⼤数据族,都依赖于此,可以想象它的强⼤及稳定性。
2. 多模架构。实际上⾼斯Redis是多模数据库Gauss NoSQL的⼀员,Gauss NoSQL提供了全栈的分布式KV引擎、⽤户态⽂件系统、
存储池等技术,只需要在接⼝上封装Redis协议,即可轻松实现⼀个全新的NoSQL产品。类似的,我们还提供了MongoDB、
Cassandra、InfluxDB等NoSQL引擎。
2. 为什么选择存算分离?
在云原⽣概念铺天盖地的今天,数据库也逐步⾛向云原⽣,⽽它的云原⽣有⼀个重要特点就是存算分离。存算分离也代表了数据库上云的最新趋势。
第⼀代数据库服务:通过下图可以看到,传统IDC建设时,数据库架设在裸⾦属之上,由于数据库服务的敏感特殊性,DBA或者研发需要关⼼机型的选择、磁盘Raid阵列、组⽹,甚⾄采购等诸多事项。
第⼆代数据库服务:随着虚拟化技术的普及,应⽤型业务⼤量上云,数据库也开始上云搬迁,最简单的办法是在虚拟机或容器中运⾏⼀个数据库服务即可。这样做的优点很明显,但缺点有两个:⼀个是通⽤云盘都是3副本,加上数据库上层的多副本,资源浪费严重;另⼀个是备机资源浪费,平时⽆法提供服务。除此以外还有云盘IO性能等问题存在。
第三代数据库服务:基于存算分离架构,将数据库服务分成CPU密集的计算层和IO密集的存储层。数据的副本管理完全交给存储层,计算层实现⽆状态转发,既能发挥云的弹性优势,⼜能全负荷分担。
不过缺点也很明显,即基于旧架构改造难度⼤。
采⽤存算分离架构之后,数据库服务就是个分⽽治之的思想:计算层负责服务化、产品化的各种处理,全程⽆状态;⽽存储层,就专注于数据本⾝的维护,包括副本、容灾、硬件感知、扩缩容等等。
3. 设计与实现
接下来讲整体设计与实现,⾸先是软件架构。⾼斯Redis计算层的模块如下,主要有cfgsvr、proxy、datanode。连接计算与存储资源的有RocksDB和GeminiFS(⾃研⽤户态⽂件系统),分别负责将kv数据转成sst⽂件和负责将sst⽂件下推到DFV的对象存储池中。
接下来是组⽹设计。⼀个租户申请的数据库资源,被我们以反亲和的⽅式,分布在不同的物理机容器上,都属于同⼀个租户的相同VPC下。不同⽤户的数据库资源虽然也有可能共享同⼀台物理机,但是由于VPC隔离,保证了数据隔离。另外,计算层的数据库资源是独占容器的,⽽存储层资源是共享物理硬件的。
接下来解读容灾架构。既然⾼斯Redis定位是数据库⽽不是缓存,那它对待数据的态度是严肃的:既实现了region内的3AZ容灾,也提供了跨Region的容灾。
Region内的容灾,实现了⼀个容忍AZ级故障的⾼可⽤⽅案。在此故障下,数据依然保持强⼀致状态,这对企业级应⽤提供了⾮常强⼤的数据安全保障。这套架构的可靠性指标可以满⾜RPO为0,RTO⼩于10s的标准。
具体的实现原理是,依赖DFV的3副本强⼀致复制能⼒,计算层也做3AZ的反亲和部署。当⽤户的⼀条数据通过proxy写到datanode1
上,datanode1通过GeminiFS的⽤户态⽂件系统,调⽤DFV的SDK到⼀个local az的DFV存储节点,
和⼀个距离最近remote az的DFV 存储节点,组成多数派,写成功后即返回给⽤户。这样的架构下,不管是计算还是存储的AZ级故障,都对数据的安全性没有任何影响。
接下来继续讲跨Region级别的容灾。⾼斯Redis除了提供上述3AZ的强⼀致⽅案以外,还提供跨Region级别的容灾,也就是两个实例间的异步容灾。这套⽅案⾥,我们增加了⼀个Rsync-Server的模块,⽤来订阅主实例上新增的⽇志,再把⽇志反解编码成相应的格式,转发给对端的备实例,由备实例回放即可。这套⽅案,可以实现双向同步、断点续传、冲突解决等等。其中冲突解决,针对不同的Redis数据结构,采⽤不同的解决算法,保障最终⼀致性。
4. 竞争⼒总结
最后⼀节是对⾼斯Redis的优势总结,主要包括:强⼀致、⾼可⽤、冷热分离、弹性伸缩、⾼性能。
⾸先是强⼀致特性。
这⼀点主要受益于DFV的3副本机制,因此写⼊⾼斯Redis的数据,在客户端收到回复时,数据就已是3副本强⼀致的。强⼀致能⼒对业务实现⾮常友好,不需要忍受数据的不⼀致、不需要校验数据。⽽开源Redis数据采⽤异步复制,因此主从之间总是有个差异buffer,如果掉电,这部分数据就会丢失,且在⼤压⼒写的时候,还会产⽣buffer堆积,严重的时候,会导致OOM。因此,⾼斯Redis的强⼀致是个⾮常重要的特点,能为业务提供前后⼀致的状态,不⽤担⼼开源Redis主从切换后的数据⼀致性问题和丢失问题。
第⼆个特性是⾼可⽤。
⾼可⽤是数据库的基本能⼒,这⾥之所以要再次强调,是因为⾼斯Redis的可⽤性跟其他数据库不同,它做到了可接受N-1个节点故障。实现原理受益于共享存储DFV:当某⼀个计算节点发⽣故障挂掉,其维护的slot路由信息,会被剩下的节点⾃动接管。由于不涉及底层数据的迁移,这个接管过程⾮常快。以此类推,可以接受N-1个节点故障,且不影响全部数据的读写。当然,计算节点减少会对性能造成⼀定影响。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论