本文主要讲述NoSQL在Flash设备上的可以选择的其中一种优化策略,并粗略提了一下SSD设备的特性。
对Flash设备的性能优化,微软曾经做过一份paper,但是里面很多东西比较局限:比如paper中将SSD作为了写入的buffer,而众所周知,写性能不会是任何一款NoSQL的瓶颈;比如SSD的索引采用了Hash的数据结构,这样在进行cache evict的时候,粒度的控制也很有问题。本文对其进行了改进,罗列如下:
Features of SSD
SSD对于传统硬盘的优势在于它没有机械装置,介质也由磁介质变为了电介质,因此它具备直接按地址读取数据的能力,没有了寻道时间,这也是为什么SSD的IOPS可以达到数万的原因。
而SSD的写操作比较特殊,其最小写入单元是4K,当写入空白位置的时候可以直接写入,但是当需要改写某个单元时,则需要一个额外的擦出操作,擦除的操作一般是128个page,每个擦出的单元称为一个块。
Wear Leveling
因为SSD的存储单元寿命有限,因此,当某个特定的部位被频繁擦写,不仅会造成性能问题,而且使得SSD寿命大幅降低,所以SSD做了Wear Leveling,即损耗均衡算法。这样,当需要改写某个page时,并不写入原有位置,而是读取现有块,合并需要改写的数据,然后一起写入新的空闲块,原有的块被标记为invalid,等待被擦除回收。这样做的好处在于,一是不会反复擦写同一个block,二是写入的速度会比较快(省略了擦除的动作)。
Write amplification
因为SSD的erase-before-write的特性,所以就出现了一个写入放大的概念,比如你想改写4K的数据,必须首先将整个擦除块(512KB)中的数据读出到缓存中,改写后,将整个块一起写入,这时你实际写入了512KB的数据,写入放大系数是128。写入放大最好的情况是1,就是不存在放大的情况。
Conclustion
综合SSD的特性,我们需要做到以下两点来合理使用SSD并且提高其使用寿命:
1. 尽量避免随机写。由于损害均衡算法的存在,随机写特定page将造成写入放大。
2. 避免每次写入过少的数据。如果每次写入的数据不足SSD的一个page大,那么当前写入的数据将导致该page有浪费,并且接下来对该文件逻辑上的append将导致,之前写的不足一个page的数据被读取出来,并合并到新的page中去。
3. 不要使用完全部的空间。SSD的损耗均衡算法虽然一定程度上减少了对特定部位的频繁擦写,但是如果空间不够,这个还是很难避免,因此,最好预留至少50%的空间。
可以看到,不得不说,绝大部分的NoSQL产品都做到了上述两个特性。因此,在新型存储设备上的尝试将是NoSQL时代的主题。
SSD as Level2 Cache
虽然当前SSD相比内存便宜了很多,但目前SSD每存储单元在价格上仍然比普通硬盘要贵很多,因此,在这个过渡时期,普遍的想法是把SSD当做二级Cache。像Flashcache这样利用Linux Device Mapper,将SSD等设备当做Write Back block cache。关于其详细介绍,这里就不多说了,可以去https://github.com/facebook/flashcache 看看官方的介绍。这里讲述另外一种可能比较简单易实现的方式。
根据上面描述的SSD的性能特点,可以采用下面的设计:
上图是逻辑上的结构,物理的实现已经把很多东西都合并了,比如读cache和写buffer,以及SSD的索引B-tree,都可以进行合并成为一颗B-tree(Berkeley Db的方式),另外,我需要强调的一点是,这里的SSD索引使用了B-Tree,相比于Hash是为了提供更粗粒度的SSD Cache失效机制,这一点的原因在上面的SSD特性中已经讲过了,下面讲述get以及set操作的流程。
Get
首先,逻辑上先查询内存中的Read Cache,如果不存在,则查询Write Buffer,然后是SSD Cache的B-Tree Index,然后是Bloom Filter确认key的确在硬盘存在,最后查询到硬盘。
Set
插入的时候,先写到write
buffer里面,当buffer到达一个临界值的时候将其刷到SSD上,当SSD到达一个临界值的时候,将其踢出并移到硬盘,当然整个过程Bloom Filter也要保持一致。
Delete
删除操作首先检查内存中的各buffer和cache有没有该值,如果有,直接在内存中删除其父节点对它的引用,随后直接返回;如果没有,那么先查看Bloom Filter是否该key存在,如果存在则去硬盘上删掉。
这里需要强调的是,删除操作只是一个标记删除,物理文件上的删除会有后台线程定时扫描,这样能够保证每次SSD的擦除操作能更加有效。
Evict strategy
既然SSD做为了二级Cache,那么其必然存在一个evict操作,evict操作的凭据是每个节点的generation,generation会在每次节点被访问的时候+1,这里的+1是一个全局的+1,即整颗树维护一个long型的generation,A节点被访问一次则其generation为1,那么过一会B节点被访问那么generation为2,以此类推。
Evict的时候将较小的generation的节点删除,将其踢到硬盘,这里需要注意,这里的节点我指的是非页节点,因此,一般情况下,每次evict至少有默认128个叶节点被踢出,即使这128个节点物理上的位置不连续,由于我们有后台的clean线程(参加海量数据存储之Key-value存储简介的过期数据清理一章)的参与,因此,我们总能保证,每次SSD的擦除操作都是连续并且是大块的。
最后,很显然,这样的设计L1
Cache、L2 Cache以及Disk组成了一套完整的数据,因此,在掉电的时候,SSD的cache无需失效,当然,前提是由于我们的系统有Write-ahead-log保证了内存中的数据掉电不丢失。
References
- 大小: 36.8 KB
分享到:
相关推荐
这将涉及到新技术的探索,比如改进分布式存储算法、优化数据处理流程和提升存储设备性能,以及引入新的数据安全机制和管理策略。 综上所述,这篇文章系统地介绍了分布式系统中的海量数据存储技术,涵盖了关键存储...
【海量视频数据分布式存储性能优化方法研究】 在当前数字化时代,视频数据的生成量呈现爆炸性增长,如何高效地存储和处理这些海量数据成为了一大挑战。本文针对文件系统存储效率低下、多余副本导致的空间浪费以及...
本文主要探讨的是海量数据存储管理方法的研究,重点关注在数据库性能优化和海量数据存储策略方面。随着现代技术的发展,对数据资源的需求日益增加,数据库的规模、容量和性能要求也随之提高。如何有效地管理和优化...
### 如何处理海量数据 #### 一、挑战与难点 处理海量数据是一项极其复杂且具有挑战性的任务。随着数据量的急剧增长,传统的手工处理方式已经无法满足需求,需要借助现代的技术手段来进行高效的管理和分析。海量...
在大数据领域,物联网(IoT)设备产生的海量数据对存储系统提出了新的挑战。元数据作为描述这些设备状态、属性和连接关系的关键信息,其高效、可靠存储与管理是物联网架构中的核心环节。本主题将深入探讨"大数据存储及...
### 基于SWIFT的海量数据存储平台设计 #### 1. 引言 随着中国航天事业的快速发展,特别是“天宫二号”与“神舟十一号”等重大航天项目的成功实施,我国在太空探索领域取得了显著成就。随之而来的大量航天科研数据...
【海量数据存储方式概述】 随着信息技术的快速发展,数据量呈指数级增长,导致了数据爆炸现象,这使得海量数据的存储和管理成为了当前研究的重要领域。传统的存储方式,如DAS(直接附加存储),在面对大数据量的...
总结来说,这篇论文研究的存储模型旨在解决医疗领域的数据存储挑战,通过数据分类、JSON配置文件以及优化的Hash表技术,提升了检索效率和系统性能,为大规模医疗数据的管理和应用提供了有效支持。这一模型对于软件...
《移动终端海量数据存储技术研究》 随着移动互联网的飞速发展,移动终端已经从传统的功能型设备转变为智能型设备,成为了移动大数据的重要输入输出源。用户通过智能移动终端使用各类应用程序,产生海量的生活相关...
1. SAN(存储区域网络):这是一种专用于存储的高速网络,将存储设备与服务器连接,提供块级数据访问。SAN的核心优势在于其高带宽和低延迟,适合于I/O密集型的应用,如数据库、虚拟化环境和大数据分析。常见的协议有...
传统的存储方案,如基于文件的存储方式,已经不能满足海量高清视频数据存储和处理的需求。因此,开发一种面向海量高清视频数据的高性能分布式存储系统变得十分重要。 分布式存储系统是指数据分散存储在多台独立的...
全书共分为九章,涵盖了海量网络存储系统的理论基础、基本存储设备(如磁盘的历史、原理、结构及数据布局和接口)、存储空间的组织和管理以及存储空间的可用性等。此外,书中还探讨了存储系统的虚拟化技术和设计方法...
【HP MO磁光盘库】在金融行业的应用中扮演了至关...它通过创新的技术和设计,解决了银行面临的海量数据存储和长期保存的挑战,同时提高了数据检索效率,降低了总体拥有成本,从而提升了银行业务的运营效率和服务质量。
在现代信息技术飞速发展的时代,数据库管理作为存储和处理海量数据的核心技术,其性能优化显得尤为重要。特别是对于Oracle数据库,由于其广泛应用于企业级应用中,对于海量数据处理的要求更是严苛。本文将围绕Oracle...
使用高速存储设备,如固态硬盘,可以显著提升I/O性能。 8. **索引策略**:在数据装载后,而非装载过程中创建索引,可以减少索引重建的时间和资源消耗。 9. **参考文献和专业指导**:查阅Oracle官方文档,了解最新...
理想的存储体系结构应当具备安全性、跨平台数据共享能力、高性能以及良好的可扩展性(既包括存储设备本身也包括客户端)。然而,当前存储体系结构的多样性及其复杂性使得存储管理变得越来越复杂。如何提高存储系统的...