NoSQL_概述

一、关系型数据库的特点

  1. 关系型数据库

    ① 能够持久保存数据,控制并发访问(事务),同时也提供了一套集成机制
    ② 由于关系模型与内存中的数据结构不匹配,所以应用程序开发人员一直为这种阻抗失谐问题所困扰
    ③ 数据库领域的迁移趋势是:原来,各个应用程序都把同一份数据库当成共用的集成点;而现在,各个应用程序都会封装自己的数据库,并通过服务彼此继承。
    ④ 促使数据存储方式发生变化的重要原因是:需要在集群上运行大量数据,而关系型数据库不能在集群中高效运行

  2. 阻抗失谐
    关系模型和内存中的数据结构之间存在差异,这种现象称为阻抗失谐。关系模型把数据组织成“关系”和“元组”,元组是由键值对构成的集合,而关系则是元组的集合。建立在“关系”基础上的数据库,不能包含“嵌套记录”或“列表”等任何结构;而内存中的数据结构则无此限制。这样一来,如果在内存中使用了较为丰富的数据结构,那么要把它保存到磁盘之前,必须先将其转换成“关系”形式。于是就发生了“阻抗失谐”:需要在两种不同的表现形式之间转译。

二、 聚合数据模型

  1. NoSQL生态系统中广泛使用的模型分为四类:“键值”、“文档”、“列族”、“图”。前三类数据模型有一个共同的特征:“面向聚合”。
  2. 聚合
    关系模型把待存储的信息分隔成元组(行)。元组是受限的数据结构:它只能包含一系列的值,因此不能在元组中嵌套另一个元组,也不能包含由值或元组所组成的列表。
    把一组相互关联的对象视为一个整体单元来操作,这个单元就叫聚合。
  3. 键值数据模型与文档数据模型
    键值数据库的聚合不透明,只包含一些没有太多意义的大块信息;文档数据库的聚合中,可以看到其结构。
    不透明的优势是聚合中可以存储任意数据。文档数据库则要限制其中存放的内容,它定义了其允许的结构与数据类型,这样的好处是能够更加灵活地访问数据。
    键值数据库要访问聚合内容,只能通过键来查找。而文档数据库,可以用聚合中的字段查询,还可以按照聚合内容创建索引。
  4. 列族存储
    这里写图片描述
  5. 面向聚合数据库总结
    ① 键值数据模型将聚合看作不透明的整体,着意味着只能根据键来查出整个聚合,而不能仅仅查询或获取其中的一部分。
    ② 文档模型的聚合对数据库透明,于是可以只查询并获取其中一部分数据。不过,由于文档没有模式,因此在想优化存储并获取集合中的部分内容时,数据库不大好调整文档结构。
    ③ 列族模型把聚合分为列族,让数据库将其视为行聚合内的一个数据单元。此类聚合的结构有某种限制,但是数据库可利用此种结构的优点来提高其易访问性。
  6. 要点
    聚合是作为交互单元的数据集合。数据库中的ACID操作以聚合为界。键值数据库、文档数据库、列族数据库都属于面向聚合的数据库。聚合使数据库在集群上管理数据存储更为方便。如果数据交互大多在同一聚合内执行,则应使用面向聚合的数据库;若交互操作需要使用多种不同格式的数据,那么最好选用“聚合无知式数据库”

三、数据模型详解

  1. 关系
    聚合的有用之处在于它可以把经常访问的数据存放在一起。如果待处理的数据中存在大量关系,那么这意味着更应该选用关系型数据库。但是,随着join子句数量越来越多,sql语句会更加难写,而且查询效率也更低了。

  2. 图数据库
    因为想要在集群环境上运行,所以很多nosql数据库因之诞生,它们使用面向聚合的模型来描述一些具备简单关联的大型记录组。图数据库的催生动机与之不同,它是为解决复杂相互关系而设计的,因此其数据模型也与其他nosql数据库相反。
    在捕获社交网络、产品偏好、资格认定规则等包含复杂关系的数据时,使用图数据库较为理想。
    图数据库的基本数据模型:由边连接而成的若干节点。
    图数据库会多花一些时间用于插入关系数据,以此来缩短遍历关系时所需的时间。在那种查询效率比插入数据的速度更为重要的场合,这种权衡就非常划算了
    图形数据库通常运行在单一的服务器上,而不是分布于集群。为了使数据保持一致,ACID事务需要涵盖多个节点与边。

  3. 物化视图
    预先算好并缓存在磁盘中的视图。如果读取数据非常频繁,而访问者又不介意略显陈旧的数据,那么使用物化视图效率比较高。
    虽说nosql数据库没有视图,但是它们可以预先计算查询操作的结果,并将其缓存起来。
    构建物化视图有两种方法:
    ①一旦基础数据有变动,那么立即更新物化视图。如果读取物化视图的次数远比写入次数多,而且想要获得更为及时的数据,那么这种方法比较合适。
    ②若是不想每次改变基础数据时都去更新物化视图,那么可以定期通过批处理操作来更新它。
    需要理解业务需要,据此判断物化视图可以使用多久以前的数据。
  4. 要点
    使用面向聚合的数据库处理不同聚合之间的关系,要比处理同一聚合内部的关系更难
    图数据库将数据组织成一张由节点和边所组成的图,它们适合处理关系复杂的数据结构
    在无模式数据库中,可以给记录随意新增字段,然而用户在使用数据时,通常还是要遵循一套隐式模式
    面向聚合的数据库通常能够用不同方式重组主聚合的数据,以计算出各种“物化视图”。计算过程一般通过“映射化简”来实现

四、分布式模型

数据分布有两条路径:复制和分片。“复制”就是将同一份数据拷贝至多个节点;而“分片”则是将不同数据存放在不同节点中。“复制”有两种形式:“主从式”(M/S)和“对等式”(P2P)。

  1. 单一服务器
    在大多数情况下,都推荐使用最简单的分布形式:也就是根本不分布。将数据放在一台服务器,让它处理对数据存储的读取与写入操作。这种方式的好处在于不用考虑使用其他方案时所需应对的复杂事务。
  2. 分片
    一般来说,数据库的繁忙体现在:不同用户需要访问数据集中的不同部分。在这种情况下,把数据的各个部分存放于不同的服务器中,以此实现横向扩展。该技术就叫“分片”
    需要考虑:怎样存放数据,才能保证基本上只需要从一台服务器中获取它。
    在节点的数据排布问题上,若能够确定聚合的访问者基本上都处在某个地理范围内,那么就可以把数据放得离访问者近一些。
    另一个因素就是要保持负载均衡。要把聚合数据均匀地分布在各个节点中,让他们需要处理的负载量相等。在某些情况下,可以把有可能需要一次读取的聚合放在一起。
    很多nosql数据库都提供了“自动分片”功能,可以让数据库自己负责把数据分布到各个分片。
    分片对提升性能尤其有用,因为它可以同时提升读取和写入效率。使用“复制”技术,尤其是带缓存的复制,可以极大地改善读取性能,但对那种需要频繁执行写入操作的应用程序,却帮助不大。
  3. 主从复制
    在“主从式分布”中,主节点存放权威数据,而且通常处理数据更新操作。其余节点都叫“从节点”,复制操作就要让从节点与主节点同步。
    主从复制最有助于提升数据访问性能,通过新增更多从节点的方式来进行扩展,就可以同时处理更多数据读取请求,并且能保证所有请求都引导至从节点。
    主从复制的第二个好处是:可以增强“读取操作的故障恢复能力”,万一主节点出错了,那么从节点依然可以处理读请求。
    “复制”技术的一个缺陷是:数据的不一致性。
    这里写图片描述
  4. 对等复制
    “主从复制”有助于增强读取操作的故障恢复能力,然而对写入操作却帮助不大。它所提供的故障恢复能力,只有在主节点出错时才能体现出来。实际上,主节点仍然是系统的瓶颈和弱点。
    “对等复制”没有“主节点”这一概念。所有“副本”地位相同,都可以接受写入请求,而且丢失其中一个副本,并不影响整个数据库的访问。
    “对等复制”中,有可能出现两位用户在同一时间试图更新同一条记录的情况,这就导致“写入冲突”。同时,数据读取不一致也是个问题。
  5. 要点
    数据分布有两种方式:
    ① 将不同的数据分片存放在多个服务器中,每一个数据子集都专门由一台服务器负责。
    ② 将数据复制到多个服务器上,每份数据都能在多个节点中找到
    数据库系统可以只选用其中一种技术,也可以两种都用。
    “复制”技术又有两种形式:
    ③“主从复制”:将其中一个节点当作权威数据源,并负责写入操作;其他从节点都要和主节点保持同步,它们可以负责读取操作。
    ④“对等复制”:任何节点均可写入,节点间相互协调以同步数据。
    “主从复制”减少了更新数据时的冲突几率,但它却会让主节点成为写入操作的瓶颈,而“对等复制”则避免了这一点。

五、一致性

  1. 更新一致性
    在并发环境下维护数据一致性所用的方式,通常分为“悲观方式”与“乐观方式”。“悲观方式”就是避免发生冲突;而“乐观方式”则是先让冲突发生,然后检测冲突并对发生冲突的操作排序。
    在处理更新冲突时,最常见的“悲观方式”就是采用“写入锁”,在修改某个值之前,必须先获取“写入锁”,系统确保某一时刻只有一个客户能够获得这把锁。
    “乐观方式”通常采用“条件更新”,也就是任意客户在执行更新操作之前,都先要测试数据的当前值和上一次读入的值是否相同。
  2. 读取一致性
    在执行影响多个聚合的更新操作时,会留下一段时间空挡,让客户端有可能在此刻读出逻辑不一致的数据。存在不一致风险的时间长度叫做“不一致窗口”。
  3. CAP
    CAP定理的基本表述:给定“一致性”、“可用性”、“分区耐受性”这三个属性,我们只能同时满足其中两个属性。
    “可用性”是指:如果客户可以同集群中的某个节点通信,那么该节点就必然能够处理读取写入操作。
    “分区耐受性”:如果发生通信故障,导致整个集群被分割成多个无法互相通信的分区时(脑裂),集群仍然可用。
  4. 仲裁
    假设某份数据需要复制到三个节点中。为了保证“强一致性”,不需要所有节点都确认写入操作,只需要其中两个节点(过半)确认即可。这种情况下,如果有发生出冲突的两个写入操作,那么只有其中一个操作能为超过半数的节点所认可,这就是“写入仲裁”。

六、版本戳

  1. 保证数据库中的记录都有某种形式的“版本戳”。版本戳是一个字段,每当记录中的底层数据改变时,其值也随之改变。读取数据时可以记下版本戳,这样的话,在写入数据之前,就可以先检查以下数据版本是否已经改变。
  2. 要点
    版本戳可用来检测并发冲突。读取并更新某份数据之后,可检测其版本戳,以确保在读取和写入操作之间,没有其他人更新过此数据
    版本戳可以用计数器、GUID、“内容哈希码”、时间戳等方式来实现,也可以将上述几种方式组合起来
    在分布式系统中,可以采用“由版本戳构成的数组”来检测不同节点之间是否发生了“相互冲突的更新操作”

七、MapReduce

  1. MapReduce框架会将所有文档数据的Map任务安排在合适的节点上执行,并把映射后的数据移交给Reduce函数。为了让Reduce函数编写其更加容易,MapReduce框架会将所有键值对收集起来,把相同关键字下的数值汇聚成集合,并以此关键字与数值集合为参数,调用Reduce函数。
  2. 首先要将Map函数的输出数据分区,以提升并发处理能力。每个Reduce函数都仅能操作具备相同关键字的一组结果。这样,多个reduce函数就可以在各个分区中并发执行了,最后将其结果合并起来就好。(这一步也叫shuffle)
    接下来的问题是:在由map阶段进入reduce阶段时,如何减少传输的数据量。大部分数据都是重复的,因为它们都是关键字相同的多个键值对。归并函数(combiner)可以把具备同一关键字的所有数据合并为一个值。
  3. 要点
    ·MapReduce是一种在集群上执行并发计算所用的模式
    ·MapReduce任务从聚合中读出数据,将之缩减为相关键值对。map操作每次只能读取一条记录,所以可在存放记录的节点上并发执行
    ·map任务会生成许多具备同一关键字的值,而reduce任务则将它们化简为单一输出值。每个reduce函数只操作与单个键相关的映射结果,所以多个reduce函数可以依据关键字执行并发化简
    ·输入数据与输出数据形式相同的多个reduce函数可归并为管道,以提高并行执行能力,并减少所需传输的数据量
    ·若某个reduce操作的输出是下一个map操作的输入,那么就可以用管道组合MapReduce操作
    ·如果需要广泛使用MapReduce计算的结果,那么可将其存储为“物化视图”
    ·可用增量式MapReduce操作更新“物化视图”,这样只需计算视图中发生改变的那部分数据即可,不需要把全部数据都从头算一遍

八、键值数据库

  1. 键值数据库是一张简单的哈希表,主要用在所有数据库访问均通过主键来操作的情况下。由于键值数据库总是通过主键访问,所以它们一般性能较高,且易于扩展。
    像redis这样的键值数据库也能存放集合、哈希表、字符串等随机数据结构
  2. 很多键值数据库都可用“分片”技术扩展。采用此技术后,键的名字就决定了负责存储该键的节点。像Riak这样的数据库,可以控制“CAP定理”中的参数:N(存放键值对的副本节点数)、R(顺利完成读取操作所需的最小节点数)和W(顺利完成写入操作所需的最小节点数)
  3. 不适用场合:如果要在不同数据集之间建立关系,或是将不同的关键字集合联系起来,那么即便某些键值数据库提供了“链接遍历”等功能,它们也不是最佳选择了;如果在保存多个键值对时,其中一个关键字出错,而你又需要复原或回滚其余操作,那么键值数据库就不是最好的解决方案;如果要根据键值对的某部分来搜寻关键字,那么键值数据库就不是很理想了;由于键值数据库一次只能操作一个键,所以它无法同时操作多个关键字。假如需要操作多个关键字,那么最好在客户端处理此问题。

九、文档数据库

  1. 一致性
    为了在Mongodb数据库中确保“一致性”,可以配置“副本集”,也可以规定写入操作必须等待所写数据复制到全部或是给定数量的从节点之后,才能返回。每次写入数据时,都可以指定写入操作返回之前,必须将所写数据传播到多少个服务器节点上。可以增加“副本集”的读取效率:设置slaveOK选项之后,就可以于从节点中读取数据了。
  2. 副本集
    “副本集”通常用于处理“数据冗余”、“自动故障切换”、“读取能力扩展”、“无需停机的服务维护”和“灾难恢复”等事项。
  3. 不适合场合
    文档数据库不适合执行“跨文档的原子操作”。

十、列族数据库

  1. Cassandra是一种能快速执行跨集群写入操作并易于对此扩展的数据库。集群中没有主节点,其中每个节点均可处理读取与写入请求。若某列数据不再使用,则数据库可于稍后的“压缩阶段”回收其所占空间。列族数据库的各行不一定要具备完全相同的列,并且可以随意向其中某行加入一列,而不用把它添加到其他行中。如果某列中包含一个由小列组成的映射表,那么它就是“超列”,它有名称和值,而值是一个由小列组成的映射表。用超列构建的列族叫做“超列族”。
  2. Cassandra将标准列族和超列族都放入“键空间”里。“键空间”与关系型数据库中的“数据库”类似,与应用程序有关的全部列族都存放于此。必须先创建键空间,才能为其增添列族:create keyspace ecommerce
  3. 一致性
    Cassandra收到写入请求后,会先将待写数据记录到“提交日志”(commit log)中,然后将其写入内存里一个名为“内存表”(memtable)的结构中。写入操作在写入“提交日志”及“内存表”后,就算成功了。写入请求成批堆积在内存中,并定期写入一种叫做“SSTable”的结构中。该结构中的缓存一旦写入数据库,就不会再向其继续写入了。若数据变动,则需要新写一张SSTable。无用的SSTable可由“压缩”(compaction)操作回收
  4. 索引
    Cassandra的列族可以用关键字之外的其他列作为索引。

十一、图数据库

何谓图数据库?
图数据库由节点和边构成。节点就是带有name属性的实体。Martin就是一个节点,它有一个值为Martin的name属性。
边也有类型,例如likes、author等。边是有方向性的。
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值