学会网站开发有什么好处,现在网站前台用什么做,wordpress 底部友情链接,如何做黑客攻击网站简介#xff1a; 阿里云数据库重磅发布自研Tair持久存储系列的产品打破了传统Redis中的数据只能在易失性存储上进行读写的刻板印象#xff0c;针对客户不同业务阶段的数据存储要求与服务成本考量#xff0c;全新实现了持久性更强、成本更低的KV数据库。
Redis做为当今主流的…简介 阿里云数据库重磅发布自研Tair持久存储系列的产品打破了传统Redis中的数据只能在易失性存储上进行读写的刻板印象针对客户不同业务阶段的数据存储要求与服务成本考量全新实现了持久性更强、成本更低的KV数据库。
Redis做为当今主流的内存数据库支持许多丰富的数据结构比如哈希表、集合还有lua脚本、事务、消息订阅等等高级特性同时使用内存做为主要的存储介质支持高速访问。
但是由于其数据全部存储在内存成本较高而且对于海量数据存储的支持也存在一些痛点比如在AOFREWRITE和生成RDB快照时会有较高的latency spike大数据量下全量同步耗时较长、失败率较高。并且数据可靠性稍弱RDB和AOF不能保证数据不丢失。
为了解决上述问题拓宽Redis的应用场景我们结合新技术新硬件推出了Tair持久存储系列产品容量存储型和持久内存型支持大容量存储和更高的数据可靠性。
发布会传送门
点击了解产品详情
容量存储型
使用磁盘存储就是其中的解决方案之一利用磁盘可以降低成本并且提供海量存储。但是在磁盘上实现redis也会有一些挑战
1.首先redis的数据结构都是基于内存实现内存可以直接寻址而磁盘是个块设备需要在磁盘上构建存储引擎来支持redis数据结构访问。
2.另外磁盘和内存有较大的性能差距原生redis单线程的架构无法满足吞吐需求需要从架构设计上提升访问性能。
应对这些挑战我们基于rocksdb进行了改造提供了高性能的存储引擎TairDB并实现了redis数据结构向简单kv的编码映射使redis数据能够存储在磁盘上采用多线程的架构来提升访问磁盘的性能同时使用阿里云ESSD高效云盘为存储底座利用云盘快照进行备份和全量同步避免fork带来的问题并提高全量同步效率。 redis有五种基本数据类型其中string可以直接映射到rocksdb的kv但是其他一些复杂的数据结构hash、list、set、zset需要通过一定格式的编码把redis的数据结构映射到rocksd的kv上。
我们把redis数据结构拆分为meta和data两类进行不同的编码通过meta可以去找到其对应的data也即二级索引。
以hash为例执行hset myhash myfield myvalue之后hash表的名字myhash就会在meta中生成一份kv其中key就是myhashvalue会标志它的属性为hash表myfield和myvalue会记录在data中再以key类型filed就可以索引到hash表的所有内容。 为了实现多线程架构首先需要解决key冲突的问题这里我们实现了key级别的锁这样可以大大降低锁冲突提高并发度。命令执行过程中多个线程首先获取key锁然后按命令的逻辑执行通过预先设计好的编码规则存取数据。最后再把结果以事务的方式提交给底层存储引擎。每个命令的执行都是要在事务提交之后才会返回结果这样每一条命令都是持久化的大大提升了数据可靠性。 关于主备复制全量复制使用云盘快照提高效率。增量复制采用类似MySQL binlog的方式事务提交之后同时也会写入binlog然后会有sender把binlog传输给备库binlog传输到备库上时会首先保存为relaylog作为中继然后通过relaylog再回放应用这样有两点好处
1.支持semisync只要relaylog落盘就可以认为事务在备库也提交完成不用等待relaylog应用这样既可以提升增量同步的效率同时提供了更强的主备一致性保证。
2.支持并发回放在relaylog中记录并发度的元信息不同的key就可以进行并发回放提高效率同时相同的key仍然按序回放保证主备一致性不会造成数据错乱。 上图为不同类型场景和实例规格下的性能测试结果测试命令为时间复杂度O(1)的GET/SET综合性能中位数在开源版70%。
在数据小于内存的情况下大部分数据都会缓存在操作系统的page cache中整体性能会优于数据大于内存的情况。规格越高的实例线程越多并发度也就越高性能也相对越好。另外不同于内存中的GET/SET磁盘上写入数据需要有read modify write的过程也即需要先读取元数据才能进行修改所以对于GET/SET写性能要弱于读性能。
持久内存型 傲腾持久内存是Intel推出的一款非易失性内存产品在提供接近内存延时能力的同时保持持久化的能力 理想情况下对于Redis场景来说是非常好的因为数据写入到持久内存中已经持久化那么就不需要额外的日志和Checkpoint用来保证持久化的特性同时傲腾持久内存在延迟上也比较接近内存优于传统SSD成本上对比内存也更加的便宜。
Redis基于傲腾持久内存能达到高性能的同时拥有较高的持久化能力但是实际在工程实现会碰到非常大的挑战包括
1.需要使用持久化内存的分配器来代替原有的内存分配器分配器的元数据信息需要持久化否则在恢复的时候会造成内存的泄露或者不一致。 2.原本StringSetHash这些数据结构和索引在异常的时候全部失效在恢复的时候重建而现在这些数据都是持久化的如何支持设计持久化的数据结构是目前工业界和理论界主要的研究方向之一 3.索引和数据的一致性数据的完整性这些都会在下一张NVM的挑战中做更详细的阐释 4.持久内存在延时还是比内存更高如何做好冷热分离让系统拥有更高的性能。 5.如何拥有高性能的同时兼备强大的持久化能力。 持久内存的使用分为两大类Memory Mode和 AppDirecrt Mode, memory mode无需用户改造但是没有持久化内里 使用App Direct mode之后对比传统SSD从block寻址转为字节寻址同时接口也从文件write/read转为内存的load和store。
数据写入内存的过程可能会停留在CPU L1L2cache需要调用类似CLWB和CLFLUSHOPT这样的指令来刷到内存系统中由于CPU只能保证8个字节的原子写入那么对于一个16字节的写很有可能在写完第一个8字节的时候crash后半部分没有写入成功这个就是所谓的partial writes 上层应用在使用持久内存的时候需要额外的实现来保障数据持久问题。
下面的例子是一个双向链表传统内存crash之后所有的数据丢失而持久内存则保留了crash的状态因此会出现B的Next指针指向了C而C的Prev指针缺没有指向B这个时候的双向链表是出于异常的状态。 从链表衍生开来内存分配器中的管理结构也存在这个问题会出现内存泄露等情况。 由于持久化的挑战目前主流使用持久内存的方式都是当做Memory或者使用AppDirect但是不支持持久化阿里云Tair持久内存版的是基于傲腾持久内存的自研引擎解决了持久化编程中遇到的各种挑战撘配阿里云官方提供的Linux操作系统镜像Aliyun LinuxAliyun弹性计算服务首次全球首家在神龙裸金属服务器上引入傲腾持久内存深度优化完善支持为客户提供安全、稳定、高性能的体验。
阿里云持久内存版Tair的每一条记录都确保写入AEP并且持久化才返回极大的提升数据的可靠性 同时在读取路径上使用Dram缓存如索引等热点数据结构和元数信息来加速数据访问的存取。 在神龙裸金属机器上我们使用相同配置进行了Tair持久内存版和Redis6.0的性能对比 整体上吞吐为社区内存版本的90% 延时上由于没有AofRewrite的干扰P95的延时更加的稳定。 原文链接 本文为阿里云原创内容未经允许不得转载。