“内存是新的硬盘,硬盘是新的磁带”此话出自图灵奖得主Jim Gray。
一、前言
我理解这句话的意思是,我们应该把随机IO都放到内存中去,而把像磁带一样的顺序IO留给硬盘(这里不包括SSD)。
如果应用没有达到一定的级别,可能我们看上面两句话都会觉得太geek,然而在应用数据量日益庞大,动态内容比例日益增大的今天,再忽视这个基本准则将会是一个灾难。
今天我们谈一下这一理论在NoSQL产品中的展现。
二、实现
问题一:宕机数据丢失
我们先看一下几个杰出的NoSQL代表,Cassandra,MongoDB,Redis。他们几乎都使用了同一种存储模式,就是将写操作在内存中
进行,定时或按某一条件将内存中的数据直接写到磁盘上。这样做的好处是我们可以充分利用内存在随机IO上的优势,而避免了直接写磁盘带来的随机IO瓶颈:
磁盘寻道时间。当然,坏处就是如果遭遇宕机等问题时,可能会丢失一些数据。
解决宕机丢数据的问题有两个方法:
1.实时记录操作日志
这时通常的做法是当一个写操作到达,系统首先会往日志文件里追加一条写记录,成功后再操作内存进行写数据操作。而由于日志文件是不断追加的,因此也就保证了不会有大量的随机IO产生。
2.Quorum NRW
这一理论是基于集群式存储的,其原理是如果集群有N个结点,那么如果我们每次写操作需要至少同步到W个结点才算成功,而每次读操作只要从R个结点读
数据就一定能保证其得到正确结果(如果某一结点有此数据,既成功,如果所有R个结点都无数据,则说明无此数据)。而NRW之间的关系必须满足N <
R + W 。其实这一理论并不难理解,我们可以将这个不等式做一下移项:R > N – W
,我们有N个结点,写的时候最少写W个才算成功,也就是W个结点有这份数据,那么N-W就是说可能没有某一份数据的最大结点数。最多可能有N-W个结点没
有某一数据,那如果我们进行数据读取操作时,读到大于N-W个结点,那么必然有一个以上的结点是有这份数据的。所以要求R > N-W。
所以可能你已经想明白了,为了防止数据丢失,我们采用的实际是简单的冗余备份的方法。数据写到多台机器会比写单台机器的磁盘快吗?对。相对于直接的磁盘操作,跨网络进行内存操作可以更快。其最简单的例子就是改进的一致性hash,(关于一致性hash请看这里
):
上图摘自Amazon的Dynamo文档,key的hash值位于A,B结点间的数据,并不是只存在B结点上,而是顺着环的方向分别在C和D结点进行备份。当然这样做的好处并不完全在于上面说的冗余备份。
当然,很多时候是上面两种解决方法同时使用以保证数据的高可用性。
问题二:内存容量的限制
当我们将内存当作硬盘来用的时候,我们必然会面临容量问题。这也是我们上面说到的数据会定时flush到磁盘的原因,当内存中的数据已经超出可用内
存的大小,那么我们就需要将其进行落地操作,对swap的过度使用是不符合我们初衷的,也是达不到高效随机IO的效果的。这里也有两种解决方案:
1.应用层swap
采用这种方法的有TokyoCabinet和Redis两个产品。TokyoCabinet主要是通过mmap提高IO效率,而其mmap到的只有
数据文件头部的一部分内容。一旦数据文件大于其设置的最大mmap长度(由参数xmsize控制),那剩下的部分就是纯粹的低效磁盘操作了。于是它提供了
一种类似于Memcached的缓存机制,通过参数rcnum配置,将一些通过LRU机制筛选出来的热数据进行key—value式的缓存,这一部分内存
是和mmap占用的内存完全独立的。同样的,Redis在2.0版本之后增加了对磁盘存储的支持,其机制与TokyoCabinet类似,也是通过数据操
作来判断数据的热度,并将热数据尽量放到内存中。
2.多版本的数据合并
什么叫多版本的数据合并呢?我们上面讲Bigtable,或其开源版本Cassandra,都是通过定时将内存中的数据块flush到磁盘中,那么
我们会想,如果这次是一个update操作,比如keyA的值从ValueA变成了ValueB,那么我们在flush到磁盘的时候就得执行对老数据
ValueA的清除工作了。而这样,是否就达不到我们希望进行顺序的磁盘IO的目的呢?没错,这样是达不到的,所以Bigtable类型的系统确实也并不
是这样做的,在flush磁盘的时候,并不会执行合并操作,而是直接将内存数据写入磁盘。这样写是方便很多,那读的时候可能会存在一个值有多个版本的情
况,这时就需要我们来进行多版本合并了。所以第二种方法就是将一段时间的写操作写成一个块(可能并非一个文件),保证内存的使用不会无限膨胀。在读取时通
过读多个文件块进行数据版本合并来完成。
那如果存储在磁盘的数据量是内存容量的很多倍,我们可能会产生许多个数据块,那么我们在获取数据版本时,是否需要全部遍历所有数据块呢?当然不用,如果你看过BigTable论文,相信你还记得它其中用到了bloom-filter
算
法。bloom-filter算法最广泛的应用是在搜索引擎爬虫中,它用于判断一个URL是否存在于已抓取集合中,这一算法并不百分之百精准(可能将不在
集合中的数据误判为在集合中,但不会出现相反的误差),但其在时间复杂度上仅是几次hash计算,而空间复杂度也非常低。Bigtable实现中也用到了
bloom-filter算法,用它来判断一个值是否在某一个集合中。而由于bloom-filter算法的特点,我们只会多读(几率很小),不会少读数
据块。于是我们就实现对远远大于物理内存容量的数据的存储。
三、结尾
好了,就写到这里,关于NoSQL中对此原理的应用还有更多理解和认识的同学,欢迎交流。
原文链接:http://lgone.com/html/y2010/801.html
分享到:
相关推荐
技术关键词: SQL、关系数据库、NoSQL 内容关键词: 数据建模、查询优化、事务处理 用途: 理解数据存储和管理的基本原理,确保数据的有效性和安全性 资源描述: "MySQL官方文档"提供了MySQL数据库的详尽文档和教程,...
在IT行业中,数据库管理是至关重要的领域,它涵盖了多种技术和工具,如SQL、关系数据库以及NoSQL等。本文将深入探讨这些关键知识点,帮助你掌握高效的数据管理与操作技巧。 首先,我们来看SQL(Structured Query ...
CHAPTER 1: NOSQL: WHAT IT IS AND WHY YOU NEED IT 3 CHAPTER 2: HELLO NOSQL: GETTING INITIAL HANDS-ON EXPERIENCE 21 CHAPTER 3: INTERFACING AND INTERACTING WITH NOSQL 43 PART II: LEARNING THE NOSQL ...
TJ会通过若干互动的演示,而不是干巴巴的宣讲的方式来为大家介绍MongoDB风靡全球,成为NoSQL王者的关键原因。如果您已经是Mongo老司机,不用担心,你也可以从TJ的文档模式设计精粹及一分钟关系型到MongoDB的迁移演示...
NoSQL(Not Only SQL)是一种非关系型数据库技术,它源于对传统关系型数据库在大数据、高并发场景下性能瓶颈的挑战。与SQL数据库不同,NoSQL不采用固定的表格模式,也不强制数据的一致性,而是追求水平扩展性和高...
nosql包装 NoSQL包装器 我创建此对象是为了减少重新创建与NoSQL数据库的连接实例的需要。 基本上,每个NoSQL的所有python依赖关系都将由该库处理。 版: Python 3 资料库 支持的: MongoDB 去做: 卡桑德拉 ...
NoSQL 关系数据库 NoSQL CAP定理,AXP 2015,JWN 2016 C CAP中的一致性实际上意味着线性化,这是一个非常具体(非常强烈)的一致性概念。 特别地,即使C也代表“一致性”,它与ACID中的C无关。 线性化的含义如下...
1. **NoSQL的兴起**:随着互联网技术的快速发展,大数据量、高并发和实时性需求的增长,传统的关系型数据库(RDBMS)难以满足这些新场景的需求,NoSQL应运而生。NoSQL数据库旨在提供可扩展性、高性能和灵活的数据...
在新版本NoSqlBooster5.1.4中,用户可以期待以下关键特性: 1. **全面支持MongoDB 4.0.6**:此版本的NoSqlBooster针对MongoDB的最新稳定版本4.0.6进行了优化,确保了与数据库服务器的无缝对接。这意味着用户可以...
缺点:内存限制,数据持久化复杂。 - MongoDB优点:文档型数据模型,适合半结构化数据;缺点:写操作相对较慢,对硬件要求较高。 通过这个项目,你可以深入了解NoSQL数据库的优势和适用场景,掌握如何使用...
【标题】:“基于Node.js的NoSQL产品:FileDB V3.0开发完毕” 这篇标题表明了一个关键的信息,即FileDB已经更新到了V3.0版本,并且是基于Node.js平台构建的一个NoSQL数据库产品。NoSQL(Not Only SQL)数据库通常...
《深入NoSQL-Professional NoSQL》是一本专为IT专业人士准备的深度探索非关系型数据库技术的书籍。这本书中文版的扫描质量较高,适合对NoSQL有深入学习需求的读者。NoSQL,全称为"Not Only SQL",是近年来随着大数据...
【标题】"nosql-benchmark" 指的是一项针对符合 ACID(原子性、一致性、隔离性、持久性)属性的 NoSQL 数据库进行的性能基准测试项目。这个项目的目标是评估和比较不同 NoSQL 数据库在处理事务时的能力,以确保在...
NoSQL(Not Only SQL)是一种非关系型数据库技术,它在大数据处理、分布式系统和实时应用等场景下表现出了强大的优势。与传统的关系型数据库不同,NoSQL数据库不依赖于固定的表结构,而是采用键值对、列族、文档型或...
在右侧,您将看到一个名为NoSql Explorer的新工具窗口。 单击工具栏上的扳手图标,您将被重定向到插件设置。 您可以在面板顶部指定mongo和redis CLI路径 要添加服务器,请单击[+]按钮并选择您的数据库供应商
NodeJS NoSQL ODM 这个库是一个小巧而简单的 ODM,它将帮助您轻松构建业务模型层,而无需处理任何 NoSQL 引擎(支持 Couchbase、Redis 和 Sphinx)的技术方面。 CRUD 操作 记录属性上的 Getter 和 Setter 保存前...
NoSQL数据库技术发展趋势 NoSQL数据库技术发展趋势是当前数据库技术发展的热点。近年来,NoSQL数据库技术获得了高速发展,许多企业和机构都在投入巨资来开发和应用NoSQL数据库技术。阿里云作为中国软件行业的领导者...
oSQL Data Models: Trends and Challenges ISBN 10: 1786303647 ISBN 13: 9781786303646 Edition: 1 Released: 2018-08-14 pages: 278 List Price: $145
在IT行业中,NoSQL数据库和MapReduce是两个重要的概念,特别是在大数据处理和分布式计算领域。本文将深入探讨这两个概念,并进行对比分析,旨在帮助你理解它们的特点、应用场景以及如何进行聚合操作。 首先,NoSQL...