“内存是新的硬盘,硬盘是新的磁带”此话出自图灵奖得主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
分享到:
相关推荐
简单的基于 Kotlin 和 JavaFX 实现的推箱子小游戏示例代码。这个游戏包含了基本的地图布局、玩家控制角色推动箱子到目标位置的功能,不过目前还只是一个简单的控制台版本,你可以根据后续的提示进一步扩展为图形界面版本并添加推流相关功能(推流相对复杂些,涉及到网络传输和流媒体协议等知识,需要借助如 FFmpeg 或者专门的流媒体库来实现,这里先聚焦游戏本身的逻辑构建)
基于simulink建立的PEMFC燃料电池机理模型(国外团队开发的,密歇根大学),包含空压机模型,空气路,氢气路,电堆等模型。 可以正常进行仿真。
Web端功能1.文件分类管理(文件、图片和视频),可以检索文件(按照分类查看,也可以根据名字检索),可以删除和添加文件,文件可以下载,图片和视频可以在线查看播放2.文件有个物理位置的属性,例如“A柜14排”3.文件可以被用户借阅,可以查看到文件的借阅状态。4.可以查看借阅历史列表信息。(任何借阅的记录都保存下来,用列表的方式展现出来)。5.目标角色分教师、教学秘书、专业负责人、教学院长及管理员6.角色教师通过系统提供的界面,(1)输入教学成果,包括项目、论文、著作封面、获奖证书等,提供成果作证材料,秘书审核后再提交给专业负责人及教学院长审核;(2)输入教学资料,包括教学日历、教学大纲、考试考核方法改革申报表、课程试卷及答案等,上传图片或者PDF文档,提交给教学秘书、专业负责人及教学院长审核。7.教学秘书审核教师提交的教学成果,依据作证材料逐条审核,然后提交给专业负责人及教学院长再作审核。8.专业负责人和教学院长相继审核,给出通过意见或者退回。9.管理员角色负责管理维护系统内部教师信息。10.系统界面设计美观,具有较高的易用性,能够进行角色权限控制...
物流工厂往复式升降机2018可编辑全套技术资料100%好用.zip
【资源说明】 基于USuperStar酒店管理系统(java web课程设计)、全部资料+详细文档+高分项目.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
在信息技术飞速发展的今天,我们正生活在一个信息大爆炸的时代。随着计算机技术的进步和移动终端的普及,国内信息技术已经走在了世界前列。在这样的背景下,传统的手工信息处理方式已经无法满足现代社会的需求,必须依靠计算机技术来提高信息处理的效率。 本次开发的小区物业管理系统采用Java技术,旨在通过计算机化管理提升小区物业信息管理的效率。系统实现了报修管理、房屋管理、收费管理、停车位管理、投诉管理和用户管理等多项功能。 小区物业管理系统的计算机化处理,确保了数据传输的即时性,无论是数据的获取还是输入,都能迅速反馈,极大提升了工作效率。同时,系统采用MySQL数据库,为数据提供了安全可靠的存储解决方案。
设计一个银行存取款管理系统,能够输入和查询客户存款取款记录。在客户文件中,每个客户信息是一条记录,包括编号、客户姓名、支取密码、客户地址、客户电话、账户总金额;在存取款文件中,每次存取款是一条记录,包括编号、日期、类别、存取数目、经办人。类别分为取款和存款两种。本系统能够输入客户存款或取款记录;根据客户姓名查询存款和取款记录
Matlab领域上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
在脚本之家的VBS栏目中,我们精心培育并推广了这一资源,使其逐渐被公众所熟知。我们所提供的代码资源,涵盖了从基础到高级技巧的广泛知识,是长期从网络收集和整理的结果,极具收藏价值,是学习VBS不可或缺的平台。 由于过去在查找和分类这些资料时存在不便,我们对内容进行了重新整理。在批处理之家站长的协助下,我们将这些资料转换成了更易于使用的CHM格式。尽管偶尔会出现乱码,且部分VBS代码可能会被杀毒软件误报,但我们确保这些资料是安全可用的。 我们对大家的支持表示衷心的感谢,并鼓励您访问脚本之家VBS栏目的最新内容。
基于改进A*算法融合DWA算法的机器人路径规划MATLAB仿真程序(含注释) 包含传统A*算法与改进A*算法性能对比?改进A*算法融合DWA算法规避未知障碍物仿真。 改进A*算法做全局路径规划,融合动态窗口算法DWA做局部路径规划既可规避动态障碍物,又可与障碍物保持一定距离。 任意设置起点与终点,未知动态障碍物与未知静态障碍物。 地图可更改,可自行设置多种尺寸地图进行对比,包含单个算法的仿真结果及角速度线速度姿态位角的变化曲线,仿真图片丰富
阈值分割是常见的直接对图像进行分割的算法,根据图像像素的灰度值的不同而定。对应单一目标图像,只需选取一个阈值,即可将图像分为目标和背景两大类,这个称为单阈值分割;如果目标图像复杂,选取多个阈值,才能将图像中的目标区域和背景被分割成多个,这个称为多阈值分割,此时还需要区分检测结果中的图像目标,对各个图像目标区域进行唯一的标识进行区分。阈值分割的显著优点,成本低廉,实现简单。当目标和背景区域的像素灰度值或其它特征存在明显差异的情况下,该算法能非常有效地实现对图像的分割。阈值分割方法的关键是如何取得一个合适的阈值,近年来的方法有:用最大相关性原则选择阈值的方法、基于图像拓扑稳定状态的方法、灰度共生矩阵方法、最大熵法和峰谷值分析法等,更多的情况下,阈值的选择会综合运用两种或两种以上的方法,这也是图像分割发展的一个趋势。
是一个包含英特尔公司(Intel Corporation,股票代码:INTC)从1980年至2024年历史股票数据的数据集。这个数据集提供了每日的股票价格信息,包括开盘价、最高价、最低价、收盘价以及调整后的收盘价,同时还记录了每天的交易量。这些数据对于分析英特尔的市场表现、股票价格趋势以及进行金融分析和预测模型的构建非常有用。 数据集的特点包括: 时间跨度长:覆盖了超过40年的时间,能够提供长期的股票市场趋势分析。 数据详细:包含了每日的股价和交易量,有助于进行深入的技术分析。 调整后的价格:提供了调整后的收盘价,考虑了股票分割、股息和其他公司行为,使得数据更加准确。 来源可靠:数据来源于Yahoo Finance,这是一个广泛认可的获取历史金融数据的平台。 使用这个数据集,分析师和投资者可以进行多种分析,如时间序列分析、股票价格预测和财务分析。这些分析有助于理解英特尔作为半导体行业领导者的发展和表现,以及其在个人电脑技术背后的推动作用。数据集的长期视角也为研究市场趋势和投资决策提供了宝贵的信息。
内容概要:包含温湿度、空气质量、用户交互菜单等功能设计的51单片机智能闹钟 适用人群:对51单片机有基础的了解,具备一定的C语言编程基础,学生与单片机爱好者 能学到什么:仅做借鉴参考,相关设计的思路,一些基础的单片机编程方法。 阅读建议:内置较详细注释可供理解查看,仍有许多不足之处,仅做参考,多多指教。。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。
【资源说明】 基于Java EE 课程设计 Java web 课程设计 基于spring Boot + Mybatis Plus + Vue + Android原生,前后端分离。附带设计报告、UML建模,团队协作赛鸽数据管理系统、全部资料+详细文档+高分项目.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
项目均经过测试,可正常运行! 环境说明: 开发语言:java JDK版本:jdk1.8 框架:springboot 数据库:mysql 5.7/8 数据库工具:navicat 开发软件:eclipse/idea
简介:money 是一个专为 Python 设计的货币类库,旨在帮助开发者更方便、更精确地处理货币相关的操作。 核心功能 精确的货币表示与计算:使用decimal类型来处理货币金额,避免了使用浮点数进行货币计算时可能出现的精度丢失问题,从而确保计算结果的高精度,适用于对精度要求极高的金融交易、电子商务、账单等领域. 多货币支持:内置了符合 ISO 4217 标准的世界各国货币数据,支持多种货币的符号、单位、汇率等功能,可轻松创建不同货币类型的货币对象,并对其进行各种数学运算,如加、减、乘、除等,且能确保精度的正确性,适合需要进行国际化货币处理的应用. CLDR 后端本地化格式:提供了可选的 CLDR(Common Locale Data Repository)后端本地化格式功能,通过format()方法,可根据不同的地区设置,将货币金额格式化为符合当地习惯的字符串形式,如$1,234.57(美国格式)、1.234,57\xa0$(西班牙格式)等,增强了货币显示的本地化和国际化适应性. 可扩展的货币兑换解决方案:通过 “安装” 实现了抽象基类。
管理员功能需求: 管理员登陆后,主要模块包括首页、个人中心、用户管理、教师管理、课程信息管理、班级信息管理、试题管理、在线试题管理、考试管理等功能。 用户功能需求: 用户登陆后,主要模块包括首页、个人中心、课程信息管理、班级信息管理、考试管理等功能。 环境说明: 开发语言:java JDK版本:jdk1.8 框架:springboot 数据库:mysql 5.7/8 数据库工具:navicat 开发软件:eclipse/idea
AppWizard has created this TcpClient application for you. This application not only demonstrates the basics of using the Microsoft Foundation classes but is also a starting point for writing your application. This file contains a summary of what you will find in each of the files that make up your TcpClient application. TcpClient.dsp This file (the project file) contains information at the project level and is used to build a single project or subproject. Other users can share the project (.dsp)
本项目是自己做的设计,有GUI界面,完美运行,适合小白及有能力的同学进阶学习,大家可以下载使用,整体有非常高的借鉴价值,大家一起交流学习。该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。 项目整体具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现不同的功能。。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。
两穴tray盘自动上下料设备sw17可编辑全套技术资料100%好用.zip