|
何为NoSQL?NoSQL不是一个工具,而是由一些具有互补性和竞争性的工具组成的一个概念,是一个生态圈。这些被称为NoSQL的工具,在存储数据的方式上,提供了一种与(基于SQL语言的)关系型数据库截然不同的思路。要想了解NoSQL,必须先了解现有的这些工具,去理解那些引导它们开拓出新的存储领域的设计思路。
NoSQL其名 在给NoSQL下定义之前,我们先来试着从它的名字上做一下解读。顾名思义,NoSQL系统的数据操作接口应该是非SQL类型的。但在NoSQL社区,NoSQL被赋予了更具有包容性的含义,其意为Not Only SQL,即NoSQL提供了一种与传统关系型数据库不同的存储模式,这为开发者提供了关系型数据库之外的另一种选择。 NoSQL的启示 NoSQL运动受到了很多相关研究论文的启示,在所有资料中,最核心的有两个:Google的BigTable论文和Amazon的Dynamo论文。 特性概述 NoSQL系统舍弃了一些SQL标准中的功能,取而代之的是一些简单灵活的功能。NoSQL的构建思想就是尽量简化数据操作,尽量让操作的执行效率可预估。当你去考查一个NoSQL系统时,下面的几点是值得注意的。
NoSQL数据模型及操作模型 数据库的数据模型指的是数据在数据库中的组织方式,数据库的操作模型指的是存取这些数据的方式。通常数据模型包括关系模型、键值模型以及各种图结构模型。操作语言可能包括SQL、键值查询及MapReduce等。NoSQL通常结合了多种数据模型和操作模型,提供不一样的架构方式。 基于Key值存储的NoSQL数据模型 在键值型系统中,复杂的联合查询以及满足多个条件的数据查询操作就不那么容易实现了,需要换一种思维来建立和使用键名。比如要获取部门号为20的所有员工的信息,应用层可以先获取Key为employee_departments:20的这个列表,然后再循环地拿这个列表中的ID通过获取employee:ID得到所有员工的信息。
Key-Value存储可以说是最简单的NoSQL存储,每个Key值对应一个任意的数据值。对NoSQL系统来说,这个任意的数据值是什么,它并不关心。比如在员工信念数据库里,employee:30这个Key对应的可能就是一段包含员工所有信息的二进制数据。这个二进制的格式可能是Protocol Buffer、Thrift或者Avro都无所谓。
Key-结构化数据存储的典型代表是Redis,Redis将Key-Value存储的Value变成了结构化的数据类型。Value的类型包括数字、字符串、列表、集合以及有序集合。除了set/get/delete操作以为,Redis还提供了很多针对以上数据类型的特殊操作,比如针对数字可以执行增、减操作,对list可以执行push/pop操作,通过提供这种针对单个Value进行的特定类型的操作,Redis可以说实现了功能与性能的平衡。
Key-文档存储的代表有CouchDB、MongoDB和Riak。这种存储结构下Key-Value的Value是结构化的文档,通常这些文档是被转换成JSON或者类似于JSON的结构进行存储。文档可以存储列表,键值对以及层次结构复杂的文档。
HBase和Cassandra的数据模型都借鉴自Google的BigTable。这种数据模型的特点是列式存储,每一行数据的各项被存储在不同的列中(这些列的集合称作列簇)。而每一列中每一个数据都包含一个时间戳属性,这样列中的同一个数据项的多个版本都能保存下来。 列式存储可以这样理解:将行ID、列簇号,列号以及时间戳一起,组成一个Key,然后将Value按Key的顺序进行存储。Key值的结构化使这种数据结构能够实现一些特别的功能,最常用的就是将一个数据的多个版本存成时间戳不同的几个值,这样就能方便地保存历史数据。这种结构也能天然地进行高效的松散列数据(在很多行中并没有某列的数据)存储。当然,对于那些很少有某一行有NULL值的列,由于每一个数据必须包含列标识,这又会造成空间的浪费。 图结构存储 图结构存储是NoSQL的另一种存储实现。其指导思想是:数据并非对等的,关系型的存储或者键值对的存储,可能都不是最好的存储方式。图结构是计算机科学的基础结构之一,Neo4j和HyperGraphDB是当前最流行的图结构数据库。 复杂查询 在NoSQL存储系统中,有很多比键值查找更复杂的操作。比如MongoDB可以在任意数据行上建立索引,可以使用Javascript语法设定复杂的查询条件。BigTable型的系统通常支持对单独某一行的数据进行遍历,允许对单列的数据进行按特定条件的筛选。CouchDB允许你创建同一份数据的多个视图,通过运行MapReduce任务来实现一些更为复杂的查询或者更新操作。很多NoSQL系统都支持与Hadoop或者其他MapReduce框架结合来进行一些大规模数据分析工作。 事务机制 与关系型数据库不同的是,NoSQL系统通常注重性能和扩展性,而非事务机制。传统的SQL数据库的事务通常都是支持ACID的强事务机制。ACID的支持使得应用者能够很清楚他们当前的数据状态。对很多NoSQL系统来说,对性能的考虑远在ACID的保证之上。通常NoSQL系统仅提供行级别的原子性保证,也就是说同时对同一个Key下的数据进行的两个操作,在实际执行时是会串行的,保证了每一个Key-Value对不会被破坏。 Schema-free的存储 还有一个很多NoSQL的共同点,就是它通常并没有强制的数据结构约束。即使是在文档型存储或者列式存储上,也不会要求某一个数据列在每一行数据上都必须存在。 数据可靠性 最理想的状态是,数据库会把所有写操作立刻写到持久化存储的设备,同时复制多个副本到不同地理位置的不同节点上,以防止数据丢失。但这种对数据安全性的要求对性能是有影响的,所以不同的NoSQL系统在自身性能的考虑下,在数据安全上采取了不太一样的策略。 单机可靠性 单机可靠性理解起来非常简单,它的定义是写操作不会由于机器重启或者断电而丢失。通常单机可靠性的保证是通过把数据写到磁盘来完成的,而这通常会造成磁盘I/O成为整个系统的瓶颈。下面我们谈谈一些在单机可靠性的保证下提高性能的方法。
Redis提供了几种对fsync调用频率的控制方法。应用开发者可以配置Redis在每次更新操作后都执行一次fsync,这样会比较安全,当然也就比较慢。Redis也可以设置成N秒种调用一次fsync,这样性能会更好一点。但这样的后果就是一旦出现故障,最多可能导致N秒内的数据丢失。而对一些可靠性要求不太高的场合(比如仅仅把Redis当Cache用的时候),应用开发者甚至可以直接关掉fsync的调用:让操作系统来决定什么时候需要把数据flush到磁盘(译者注:这只是Redis append only file的机制,Redis是可以关闭aof日志的,另外,Redis本身支持将内存中数据dump成rdb文件的机制,和上面说的不是一回事)。
Cassandra、HBase、Redis和Riak都会把写操作顺序的写入到一个日志文件中。相对于存储系统中的其他数据结构,上面说到的日志文件可以频繁地进行fsync操作,这样就把对磁盘的随机写变成顺序写了。
Cassandra有一个机制,它会把一小段时间内的几个并发的写操作放在一起进行一次fsync调用,这种做法叫group commit。 多机可靠性 由于硬件层面有时会造成无法恢复的损坏,单机可靠性的保证在这时就鞭长莫及了。对于一些重要数据,跨机器做备份保存是必备的安全措施。一些NoSQL系统提供了多机可靠性的支持。
横向扩展带来性能提升 横向扩展的目标是达到线性的效果,即如果你增加一倍的机器,那么负载能力应该也能相应的增加一倍。其主要需要解决的问题是如何让数据在多台机器间分布,这里面涉及到分片技术。 分片的意思,就是没有任何一台机器可以处理所有写请求,也没有任何一台机器可以处理对所有数据的读请求。下面我们将会对hash分片和范围分片两种分片方式进行描述。 如非必要,请勿分片 分片会导致系统复杂程度大增,所以,如果没有必要,请不要使用分片。普通情况下,我们可以使用读写分离和构建缓存的方式来缓解我们的数据读压力。但如果写操作达到单点无法承担的程度,那我们可能就真的需要进行分片了。 通过协调器进行数据分片 一种分片策略是通过引入一个中间代理层来实现,该代理层记录数据在各个节点的分布状况,所有读写请求都通过代理层来做路由。比如与CouchDB的两个项目:Lounge和BigCouch。类似的,Twitter自己也实现了一个叫Gizzard的协调器,可以实现数据分片和备份功能。 一致性hash环算法 一致性hash是一种被广泛应用的技术,其最早在一个叫distributed hash tables(DHTs)的系统中进行使用。那些类Dynamo的应用,比如Cassandra、Voldemort和Riak,基本上都使用了一致性hash环算法。 如图1所示,一致性hash环算法有一个hash函数H,所有存储数据的节点和数据本身都可以通过这个函数算出一个hash值,作为自己在下面环上的位置。然后每个节点会负责存储其hash值到下一个节点间的所有数据的存储。这样使得即使节点数变化了,大部分数据并不需要进行迁移。 连续范围分区 使用连续范围分区的方法进行数据分片,需要我们保存一份映射关系表,标明哪一段Key值对应存在哪台机器上。与一致性hash类似,连续范围分区会把Key值按连续的范围分段,每段数据会被指定保存在某个节点上,然后会被冗余备份到其他节点。
Google BigTable论文中描述了一种范围分区方式,它将数据切分成一个个的tablet数据块。每个tablet保存一定数量的键值对。然后存储在Tablet 服务器上。tablet块的大小会保持在一定范围,太大的块会分裂成两个,太小的块又会合并成一个。BigTable通过一个叫Chubby的模块来实现节点状态检测。类似的在Hadoop中有一个叫ZooKeeper的工具实现此功能。 一致性 上面讲到了通过将数据冗余存储到不同的节点来保证数据安全和减轻负载,下面我们来看看这样做引发的一个问题:保证数据在多个节点间的一致性是非常困难的。在多个点间保持数据的一致性的问题,也就是本章的主题。下面我们首先来看一下在著名的CAP理论。
而CAP理论就是说在分布式存储系统中,最多只能实现上面的两点。再加之当前的网络硬件肯定会出现延迟丢包等问题,所以分区容忍性是我们必须需要实现的。结果就是我们只能在一致性和可用性之间进行权衡,没有NoSQL系统能同时保证这三点。 对一致性的保证,通常有强一致性和弱一致性的选择,而在弱一致性里,又以最终一致性的实现较为普遍。 如果我们采用NRW的设定,N为数据需要备份的份数,R为读操作需要读到的不同节点上的数据份数,W为写操作需要成功写到不同节点的数据份数,那么当R+W>N时,既是强一致性的保证,当R+W<N时,就是弱一致性。在弱一致性中,可以通过vector clock多版本控制等方法,来实现数据的最终一致性。 写在最后的话 目前NoSQL系统来处在它的萌芽期,我们上面讨论到的很多NoSQL系统,它们的架构、设计和接口可能都会改变。本章的目的,不在于让你了解这些NoSQL系统目前是如何工作的,而在于让你理解这些系统之所以这样实现的原因。NoSQL系统把更多的设计工作留给了应用开发工作者来做。理解上面这些组件的架构,不仅能让你写出下一个NoSQL系统,更让你对现有系统应用得更好。 |
相关推荐
NyaruDB, 在 Objective C 中,一个简单的NoSQL 数据库( key-value 对) 在iOS和 OS X 上,它运行.zip
NyaruDB, 在 Objective C 中,一个简单的NoSQL 数据库( key-value 对) 在iOS和 OS X 上,它运行 #NyaruDB ###\(・ω・\)SAN値(/・ω・)/ピンチ !這いよれニャル子さんW !MIT许可证NyaruDB是 objective-c 中的简单 NoSQL 数据库。 它可以在iOS和 OS X 上运行。它是一
在飞牛NAS上使用AList网盘挂载115网盘教程
这几天答应了一个网友,要出一篇关于115网盘挂载到飞牛nas上的教程。这不,教程就来了!其实这个教程是被催更的……思路大概是这样的:通过AList网盘挂载115网盘到本地,再通过WebDav把网盘上的东西同步到飞牛NAS的本地存储上(其实不同步也没关系了,毕竟挂载了WebDav,使用上也是差不多的)本教程基本上分为几个步骤,但开始之前,你需要在你的手机上下载115网盘应用,并登录上去登录完成之后就可以开始今天的教程!打开飞牛的【应用中心】,找到【AList网盘】应用。
YOLOv8知识蒸馏实战:用BCKD和LD在自制数据集上分别提点1.63%和1.69%的保姆级教程
本文详细介绍了在YOLOv8模型上应用知识蒸馏技术(BCKD和LD方法)的实战教程,通过自制数据集实现性能提升1.63%和1.69%。内容涵盖环境配置、模型选择、BCKD和LD的具体实现及调参技巧,适合目标检测领域的开发者和研究者。
把自己的网盘搬进服务器:OpenList 部署完整指南
不知道你有没有这样的烦恼:手机里装着百度网盘、阿里云盘、夸克网盘好几个 App,想找个文件得挨个翻一遍;遇到喜欢的电影资源,还得先下载到本地才能看;想给朋友分享个文件,不是限速就是过期。OpenList 这个工具能帮你解决这些问题。它是一个开源的目录列表程序,可以把各种网盘挂载到一起,统一管理和访问。你打开它的页面,就像打开了自己的文件管理器,里面是你所有网盘的内容,点一下视频就能直接播放,不用下载,也不用担心 bandwidth 不够——它会自动帮你找到最快的播放链接。
Python遥感技术实战:NDWI与MNDWI水体提取算法对比与优化
本文详细对比了NDWI与MNDWI两种水体提取算法在Python遥感技术中的应用。通过实战代码演示,分析了二者在自然与城镇场景下的表现差异,并重点介绍了阈值优化与后处理技巧,旨在帮助读者掌握高效、精准的水体提取方法,提升遥感数据分析能力。
2024东南大学533复试C++程序设计笔试真题精讲
【东南553复试C++】2024东南大学533复试C++程序设计笔试真题精讲
openlist电影剧集自动格式整理以及重命名 + strm 生成 + 多网盘支持:最强 Openlist + Emby 媒体资源自动整理工具Openlist-strm-rename
本项目可对挂载到 Alist 的电影、剧集、动漫资源自动重命名文件自动生成适配 Emby 的.strm文件支持以下网盘:115、阿里云盘、天翼云盘等。
【原理图PCB专题】Allegro模块化移动器件报...has the LOCKED property怎么解锁?
正常来说做好一个模块化,如果不需要再动,最好还是lock,防止不明白的工程师异动导致问题。如果复用布局设计时,因为有些器件和拓扑并不完全一致,那需要调整部分器件,被锁之后只能全选,无法修改。所以解开锁定后,就能正常编辑了。
nosql生态系统
源地址:http://blog.nosqlfan.com/html/2171.html NoSQL生态系统与本书中提到的其它主题不同,NoSQL不是一个工具,而是由一些具有互补性和竞争性的工具组成的一个概念,是一个生态圈。这些被称作NoSQL的工具,在存储数据的方式上,提供了一种与基于SQL语言的关系型数据截然不同的思路。要想了解NoSQL,我们必须先了解现有的这些工具,去
抖音移动端Web用户主页视频列表爬虫实战:逆向加密参数与高频采集方案
App端Hook/抓包:需要安卓逆向、Xposed或Frida,门槛高且容易被风控。官方开放API:限制极多,几乎不开放用户级视频列表。PC端Web:页面加载方式繁杂,且大量依赖懒加载与内部状态。移动端Web(:接口相对稳定,加密逻辑集中,且适合使用Requests/HTTPSession模拟,无需渲染引擎。本文聚焦于移动端Web下的用户主页视频列表爬取,采用Python 3.11 + httpx + PyExecJS + 正则/JSON解析的组合,破解X-Bogus签名和_signature。
PentAGI自动渗透测试平台搭建与使用
但是PentAGI的缺陷也比较明显,一个是自动化程度高带来过程的介入困难,整个渗透的过程都交给AI自动决策,无法进行人工调整,耗时较长;从上述过程来看PentAGI似乎是一个比较“可用”的AI自动化渗透测试平台,但是在继续等待测试的过程中,PentAGI的一些缺点也暴露了出来,一个是测试的过程非常漫长,因为PentAGI是使用配置大模型API key的方式全自动运行,支持openai、deepseek等主流LLM大模型,过程中不需要人工介入,会不断自动调整,所以比较依赖于大模型本身的响应速度。
NoSQL生态系统(nosql ecosystem)
Unlike most of the other projects in this book, NoSQL is not a tool, but an ecosystem composed of several complimentary and competing tools. The tools branded with the NoSQL monicker provide an alte...
华为OD机试真题 新系统【进制转换后自定义排序】
华为OD机试 新系统真题【进制转换后自定义排序】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【进制转换后自定义排序】多语言题解。
[转] NoSQL生态系统
NoSQL生态系统 与本书中提到的其它主题不同,NoSQL不是一个工具,而是由一些具有互补性和竞争性的工具组成的一个概念,是一个生态圈。这些被称作NoSQL的工具,在存储数据的方式上,提供了一种与基于SQL语言的关系型数据截然不同的思路。要想了解NoSQL,我们必须先了解现有的这些工具,去理解那些让他们开拓出新的存储领域的设计思路。 如果你正在考虑...
ANFIS实现数据非线性回归附Matlab代码
在本文中,我们将介绍如何使用Matlab实现基于MSE的ANFIS非线性回归,并提供相应的源代码。ANFIS是一种融合了模糊逻辑和神经网络的方法,它可以通过学习数据集中的模式来构建一个模糊推理系统。ANFIS的训练过程基于最小化MSE,以提高模型的拟合能力。通过上述代码示例,我们可以使用基于MSE的ANFIS模型对数据进行非线性回归,并获得相应的预测结果。在示例中,我们定义了一个包含两个样本的新输入数据集 X_new,然后使用训练好的ANFIS模型进行预测,并将结果存储在变量 Y_pred 中。
Camera2Demo
在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作
8GB显存笔记本本地部署大模型:从云端封号到自建对话环境实战
大语言模型本地部署正成为开发者关注的热点,其核心原理是通过量化技术将模型压缩至消费级显卡可承载的规模。在8GB显存条件下,70亿参数模型经4位量化后可流畅运行,兼顾推理速度与生成质量。这一方案的技术价值在于数据不出本地、无账号封禁风险、可离线批量处理,适用于文本摘要、信息抽取、代码辅助等场景。当云端工具突发不可用时,本地推理环境可作为稳定备选,覆盖日常大部分文本处理需求。
lwip-2.0.3
lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。
Ubuntu 20.04下RealSense相机SDK与ROS功能包安装详解
深度相机作为机器人感知系统的核心传感器,在SLAM建图、目标检测与三维重建中应用广泛。RealSense系列凭借高性价比和良好的开源生态,成为开发者常用的深度相机之一。在ROS环境下,深度数据需要经过SDK驱动解析,再通过ROS话题发布给上层算法,链路复杂且易错。很多开发者在Ubuntu系统上安装librealsense和realsense-ros时,常因版本不匹配、依赖缺失或权限问题而失败。本文从环境准备、依赖安装、SDK源码编译,到ROS功能包配置与调试,完整梳理了RealSense在Ubuntu 20
IMSL CNL 7.0.0 (x86-64)Crack
IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件
STM32F407中文手册
STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

1万+



被折叠的 条评论
为什么被折叠?



