首页 > 编程知识 正文

曙光分布式存储,黑匣子解读技术

时间:2023-05-05 20:29:37 阅读:141622 作者:2547

33558www.Sina.com/AlibabaCloud (阿里巴巴云)数据库是由Tair永久存储系列推出的产品,传统的Redis数据只能通过易失性存储进行读写考虑到客户各个业务阶段的数据存储要求和服务成本,我们推出了新的耐用、低成本的KV数据库。

Redis支持许多丰富的数据结构,包括哈希表、集合、lua脚本、事务和消息订阅等高级功能,同时使用内存作为主要存储介质,实现快速访问

但是,由于其所有数据都存储在内存中,因此在支持大量数据存储方面也存在一些问题,例如成本较高,并且在创建AOFREWRITE和RDB快照时会产生较高的latency spike。 大数据量需要大量同步时间,失败率较高。 此外,数据可靠性稍弱,RDB和AOF不能保证数据不会丢失。

为了解决这些问题,拓展Redis的应用场景,我们结合新技术的新硬件推出了Tair永久存储系列产品。 大容量存储和永久存储器支持大容量存储和更高的数据可靠性。

发布会的接送门

点击查看产品详情

简介:

使用磁盘存储是解决方案之一,使用磁盘可以降低成本并提供大量存储。 但是,在磁盘上实现redis存在一些挑战。

1 .首先,redis的所有数据结构都是基于内存实现的,内存可以直接寻址。 另一方面,磁盘是块设备,必须在磁盘上构建存储引擎以支持对redis数据结构的访问。

2 .此外,磁盘和内存存在较大的性能差异,本机redis单线程架构不能满足吞吐量要求,需要从架构设计上提高访问性能。

为了应对这些挑战,我们基于rocksdb进行了改造,提供了高性能的存储引擎TairDB,实现了redis数据结构到kv的简单编码映射,能够将redis数据保存到磁盘; 多线程体系结构可提高磁盘访问性能。 它还使用AlibabaCloud (阿里巴巴云) ESSD高效云盘作为存储基础,通过云盘快照进行备份和总量同步,避免fork问题,提高总量同步的效率

redis有五种基本数据类型,其中string可以直接映射到rocksdb的kv,而其他复杂的数据结构hash、list、set、zset通过一定格式的编码使redis的数据结构成为rocksd的kv

将redis数据结构分为元和data两种,进行不同的编码,可以通过元找到对应的data,即二次索引。

例如,对于hash,执行hset myhash myfield myvalue时,hash表中的名称myhash会在meta中生成kv。 其中key是myhash,value表示该属性是hash表。 myfield和myvalue记录在data中,key类型的filed可以索引hash表的所有内容。

为了实现多线程架构,首先必须解决key冲突问题。 在这里,实现了key级别的锁定。 这将大大减少锁定冲突,提高并发性。 在指令执行过程中,多个线程首先获得key锁,然后按照指令逻辑执行,以预先设计的编码规则访问数据。 最后,将结果作为事务提交给底层存储引擎。 由于每个命令的执行都是在提交事务后返回结果,因此每个命令都是永久的,从而大大提高了数据的可靠性。

对于主拷贝,全量拷贝使用云磁盘快照来提高效率。 增量复制采用类似于MySQL binlog的方法,在提交事务的同时也会将其写入binlog。 然后,sender将绑定日志转发到备用。 binlog传输到备用磁盘后,它首先作为relaylog存储,在relaylog中播放后应用。 这有两个优点。

支持semisync。 如果释放relaylog,则事务也将提交备用事务,并且可能不需要等待relay log APP。 这样可以提高增量同步的效率,同时提供更强的主备份一致性保证。

2 .支持同时播放,在relaylog中记录同时度的元信息,可以在不同的key上同时播放,提高效率。 另外,即使是同一个key也可以按顺序播放,从而保持母带的一致性,避免数据混乱。

上图为不同类型场景和实例规范下的性能测试结果,测试命令为时间复杂度o(1)的GET/SET,综合性能中位数为开源版的70%。

如果数据小于内存,则大多数数据将缓存在操作系统的page cache中,并且总体性能高于内存。 规格越高的实例线程越多,并发性也越高,性能也相对提高。 此外,与内存中的GET/SET不同,向磁盘写入数据需要读修改写过程。 这意味着GET/SET的写入性能比读取性能弱,因为必须在读取元数据后进行修改。

容量存储型

引以为豪的持久性存储器是英特尔推出的非易失性存储器产品,能够提供接近内存延迟的功能,同时保持持久性。 理想情况下,在Redis场景中非常出色。 这是因为,将数据写入永久存储器已经被永久化了,所以不需要追加的日志和Checkpoint,在确保用于保证持久性的特性的同时,自豪的永久存储器在延迟方面也比以往的SSD优越,在成本方面也与存储器相比

Redis在基于引以为豪的耐久性存储器实现高性能的同时,具有很高的耐久性,但实际上在工程实现会上

碰到非常大的挑战,包括:

1.需要使用持久化内存的分配器来代替原有的内存分配器,分配器的元数据信息需要持久化,否则在恢复的时候会造成内存的泄露或者不一致。
2.原本String,Set,Hash这些数据结构和索引在异常的时候全部失效在恢复的时候重建,而现在这些数据都是持久化的,如何支持设计持久化的数据结构是目前工业界和理论界主要的研究方向之一
3.索引和数据的一致性,数据的完整性,这些都会在下一张NVM的挑战中做更详细的阐释
4.持久内存在延时还是比内存更高,如何做好冷热分离,让系统拥有更高的性能。
5.如何拥有高性能的同时兼备强大的持久化能力。

持久内存的使用分为两大类Memory Mode和 AppDirecrt Mode, memory mode无需用户改造但是没有持久化内里, 使用App Direct mode之后对比传统SSD从block寻址转为字节寻址,同时接口也从文件write/read转为内存的load和store。

数据写入内存的过程可能会停留在CPU L1,L2cache,需要调用类似CLWB和CLFLUSHOPT这样的指令来刷到内存系统中,由于CPU只能保证8个字节的原子写入,那么对于一个16字节的写很有可能在写完第一个8字节的时候crash,后半部分没有写入成功这个就是所谓的partial writes, 上层应用在使用持久内存的时候需要额外的实现来保障数据持久问题。

下面的例子是一个双向链表,传统内存crash之后所有的数据丢失,而持久内存则保留了crash的状态,因此会出现B的Next指针指向了C而C的Prev指针缺没有指向B,这个时候的双向链表是出于异常的状态。 从链表衍生开来内存分配器中的管理结构也存在这个问题,会出现内存泄露等情况。

由于持久化的挑战,目前主流使用持久内存的方式都是当做Memory或者使用AppDirect但是不支持持久化,阿里云Tair持久内存版的是基于傲腾持久内存的自研引擎,解决了持久化编程中遇到的各种挑战,撘配阿里云官方提供的Linux操作系统镜像Aliyun Linux,Aliyun弹性计算服务首次(全球首家)在神龙裸金属服务器上引入傲腾持久内存,深度优化完善支持,为客户提供安全、稳定、高性能的体验。

阿里云持久内存版Tair的每一条记录都确保写入AEP并且持久化才返回,极大的提升数据的可靠性, 同时在读取路径上使用Dram缓存如索引等热点数据结构和元数信息,来加速数据访问的存取。

在神龙裸金属机器上,我们使用相同配置进行了Tair持久内存版和Redis6.0的性能对比, 整体上吞吐为社区内存版本的90%, 延时上由于没有AofRewrite的干扰,P95的延时更加的稳定。

 

 

原文链接
本文为阿里云原创内容,未经允许不得转载。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。