《NoSQL精粹》读书摘要

一、Why NoSQL?

  • 关注NoSQL的两个原因

    • 应用程序的开发效率(NoSQL简化了数据交互)
    • 大规模的数据(NoSQL为集群环境而设计)
  • NoSQL不是独立存在的,以后也不会取代关系型数据库,以后数据库领域将步入混合持久化(Polyglot Persistence)时代。
  • 关系型数据库的优点:
    • 标准化的建模
    • 较为容易的处理关系
    • 通过事务来处理并发
    • 可以持久化
  • 关系型数据库的缺点:
    • 阻抗失谐:关系型数据库中的存储结构(模式、表、元组)与应用程序中的数据结构需要转换。ORM框架可以解决这个问题,但是会引起性能的下降。
    • 应用程序数据库(摘绿帽)与集成数据库(戴绿帽):SOA的兴起(内部数据库与外部通信服务间的解耦)
    • 集群化问题:扩展性问题(纵向与横向)与许可费问题,大数据是一个巨大推动
  • NoSQL的定义:开源分布式的非关系型数据库
    • 开源
    • 分布式
    • 非关系型(无模式)
  • 使用NoSQL的主要原因:(其他情况下,请依然使用关系型数据库)
    • 数据量大,访问效率要求高
    • 要解决“阻抗失谐”的问题

二、聚合数据模型

  • NoSQL的主要分类

    • 面向聚合(aggregate oriented):来自于DDD

      • 键值模型(key-value):聚合对数据库不透明,只能整个的读取
      • 文档模型(document):透明的聚合,可以看到数据结构,可以读取其部分(以结构的限制换取更好的访问性)
      • 列族模型(column family):“两级映射”——两级聚合结构。因此其既“面向行”也“面向列”
    • 非面相聚合:图数据库(graph)
  • 聚合的优点:
    • 在集群中,使用聚合操作数据比较简单
    • 聚合也方便应用程序操作数据结构(对程序员更为友好)
    • 以聚合为单位的原子操作
    • 降低了数据采集时的需要节点数
  • 聚合的缺点:
    • 多个聚合的操作原子性需要应用代码来维护,而这常常比较复杂

三、数据模型详解

  • 关系型:如果待处理的数据中存在大量关系,那么这就意味着需要选用关系型数据库(但其实图数据库在这方面更强)
  • 聚合型:操作单个聚合很方便,但是操作多个聚合时就很笨拙
  • 图数据库:
    • 以包含节点和边的图构成;
    • 节点简单,互连结构丰富
    • 图数据库中遍历关系非常迅速,但是关系型数据库较差
    • 通常运行在单一的服务器上
  • 无模式的数据库:
    • 其实总包含“隐含模式”
    • 本质上说,无模式数据库把模式交由访问其数据的应用程序代码来处理
    • 如果你发现存储的数据类型不统一,那么应优选无模式数据库
    • 无模式的灵活性仅限于聚合内部
    • 数据迁移对有无模式的数据库而言都是难点
  • 物化视图
    • 作用:使基本数据和派生数据对客户端透明
    • 计算生成物化视图比较复杂耗时
    • 方式:
      • 一旦有数据变化,立即更新
      • 定期通过批处理操作更新(一般通过Map-Reduce)
    • 可以将物化视图在聚合内使用,以便在原子操作内更新

四、分布式模型

  • 横向扩展易于纵向扩展
  • 数据分布:
    • 复制(replication)

      • 主从式(master-salve)
      • 对等式(peer-to-peer)
    • 分片(sharding)
    • 这两种方式正交,可以同时使用
  • 单一服务器
    • 单一服务器即可以SQL也可以NoSQL
    • 在不需分布数据时,应总是选择“单一服务器”方案
  • 分片
    • 将不同的数据放在不同的数据库服务器上
    • 读、写性能都可以提升
    • 会降低数据库的错误恢复能力(因为需要维护更多的数据库服务器了)
    • 优化方式:
      • 地理空间上应将数据库靠近访问者
      • 负载均衡
      • 自动分片技术(大部分NoSQL提供,其将应用代码与数据库分片功能解耦)
  • 主从复制
    • 可以将系统视为带有“即时备份”功能的“单服务器存储方案”
    • 优点:
      • 通过新增从节点可以方便的进行水平扩展,可以处理更多的读请求,并保证读请求都被引导至从节点
      • 可以增强读操作的故障恢复能力
        • 主节点出错了,从节点依然可以提供读服务
        • 拥有与主节点相同内容的从节点可以很快的被指派为新的主节点,代替故障的原主节点
      • 减少了写操作的冲突概率
    • 缺点:
      • 数据的不一致性
      • 主节点是性能瓶颈
  • 对等复制
    • 优点

      • 所有的节点都可以读写
      • 易于扩展
      • 不存在性能瓶颈节点
    • 缺点:
      • 数据一致性问题
  • 解决写入操作冲突的两种极端解决思路:
    • 总是去协调节点间的关系,确保不发生冲突,只需保证各大部分副本的一致性,
    • 允许节点间的冲突,但尝试合并这些冲突的写入操作
  • 分片+复制
    • 对等复制+分片
    • 将分片存放在一定数量(复制因子)的对等节点中

五、一致性

  • 需要理解并权衡

    • 强一致性(strong consistency):时时一致
    • 最终一致性(eventual consistency):有不一致的时间窗,但最后一致
  • 更新一致性
    • 问题:写冲突(write-write conflict)
    • 常用解决方式:
      • 先决条件:处理更新操作的顺序必须一致

        • 顺序一致性(sequential consistency)
      • 悲观方式:避免发生冲突
        • 写入锁
        • 会大幅降低系统的响应能力
        • 容易产生死锁
      • 乐观方式:发生冲突,再解决冲突
        • 条件更新
        • 保存所有的更新,标注出冲突,并合并冲突
  • 读取一致性
    • 问题:读写冲突(read-write conflict)/读取不一致(logical consistency)
    • NoSQL对事物的支持:
      • 面向聚合:支持“原子更新”,但不支持多个聚合构成的事物
      • 图数据库:支持
    • 不一致窗口:数据逻辑不一致的时间长度
    • 复制一致性:不同副本中数据的一致性
    • 通常可以指定单个请求所需的一致性级别,合理地降低部分请求的一致性级别可以提高性能
    • 照原样读出所写内容的一致性(read-your-writes consistency)
      • 会话一致性

        • 黏性会话

          • 将读写绑定至某一个节点
          • 会降低负载均衡器的效能
        • 版本戳
  • 放宽“一致性”约束
    • 制定合理的隔离级别,合理地放宽一致性要求
    • CAP理论
      • 一致性(Consistency)
      • 可用性(Availability)
      • 分区耐受性(Partition tolerance)
      • 常见错误理解:
        • 我们只能同时满足其中两个方面
        • 实际上:当系统可能会遇到“分区”状况时,我们需要在“一致性”和“可用性”之间进行权衡;这并不是一个二选一问题。
    • 有时可以适当放宽一致性,允许冲突的发生,并通过领域知识指导下的应用程序代码来解决冲突,以换取更好的并发能力。
    • NoSQL倡导的BASE理论:
      • 基本可用(Basically Available)
      • 柔性状态(Soft State)
      • 最终一致性(Eventual consistency)
      • 本质上大多是一致性与时延的取舍
  • 放宽“持久性”约束
    • 非持久性写入操作

      • 例如,Redis先写入内存,然后再定期的写入硬盘
    • 复制持久性
      • 在复制过程中,写节点失效,就会造成数据的丢失
      • 需要权衡对复制质量的保证还是数据库的响应速度
  • 仲裁(避免冲突的方式)
    • 写入仲裁

      • 在对等式分布模型下:

        • W>N/2
        • W:写节点数
        • N:复制因子
      • 在主从式分布模型下:
        • 从主节点
    • 读取仲裁
      • 在对等式分布模型下:

        • R+W>N
        • R:读节点数
      • 在主从式分布模型下:
        • 从主节点
    • 还是需要根据实际情况来确定具体的仲裁方式

六、版本戳

  • 商业事务vs系统事务

    • 商业事务:针对用户而言从,整个交互流程
    • 系统事务:用户提交后,对系统而言的事务
    • 问题:商业事务和系统事务之间,存在较大的时间窗
    • 解决方式:离线并发技术
      • 乐观离线锁(条件更新的一种):compare-and-set(CAS操作)
      • 通过比较商业事务开始执行时的版本戳与系统事务开始执行时的版本戳,来检验信息是否发生了变化,以确定是否需要进行更新操作
  • 常见的版本戳类型:
    • 计数器

      • 易于比较
      • 但是需要一个主服务器用来生成并保证不同版本的计数器值不会重复
    • GUID(Globally Unique Identifier),全局唯一标识符:
      • 任何人都可以生成
      • 但是数值较大,而且难以直接比较
    • 根据资源内容生成Hash码
      • 足够大时,可以唯一标识
      • 任何人都可以生成
      • Hash值是确定的
      • 但是冗长且无法直接比较
    • 上一次更新的时间戳
      • 短小,易于生成
      • 可以直接比较
      • 但是不同服务器之间的时钟必须同步,否则很容易造成数据损毁
      • 且时间戳的精度很难确定:过低,无法区分;过高,需要频繁的更新
    • 复合版本戳(composite stamp)
      • 运用多种手法
  • 在多节点环境中生成版本戳
    • 单服务器或主从式复制模型:

      • 基本的版本戳方案就足够了:计数器
      • 时间戳也可以,但不如计数器好
    • 多个主节点时:
      • 每个节点维护一份版本戳记录(version stamp history)
      • 通过判断“祖先”记录来确定新旧关系;如互不为祖先,则检测为冲突
    • 对等式复制模型
      • 数组式版本戳(vector stamp)
      • 维护一个数组记录所有节点的版本,例如[server01:1, server02:4, server03:5]
      • 如缺失某些值,则视为0,例如视server04:0
      • 这样便于新增节点
  • 版本戳仅能检测冲突,而不能解决冲突,冲突的解决依赖于领域知识

七、Map-Reduce

  • 分散-聚集(Scatter-Gather)模式的一种形式
  • 将部分计算逻辑放于数据库服务器上
  • 输入值是某个集合,输出值是键值对的集合
  • 主要包括以下函数
    • Mapper
    • Combiner
    • Reducer
  • 通常会要求Mapper Combinable,既Mapper同时作为Combiner使用
  • 通常会使用管道及过滤器(Pipes-and-filters)来组合处理
  • 增量式Map-Reduce: 通常需要保存部分中间结果,以备下次使用
  • 经典实现:Hadoop
    • Pig:专用语言
    • Hive:类SQL语言

八、常见NoSQL实现

  • 键值

    • Memcached
    • Redis
    • Riak
  • 文档
    • CouchDB
    • MongoDB
  • 列族
    • HBase
    • Cassandra
    • Amazon SimpleDB
    • Neo4J
    • HyperGraphDB
时间: 2025-01-05 14:44:41

《NoSQL精粹》读书摘要的相关文章

《地质灾害防治这一年2013》读书摘要

最近把这本部里每年都印的当年的总结材料看了一下,摘录一些内容: 要求:防灾部署科学有序.督促检查及时有效.部门协作紧密到位.应急处置迅急有力.防治能力建设取得了更加显著的成效,调查评价取得了显著进展.监测预警得到了有效落实.资金投入力度不断加大.应急体系更加完善. 2014年工作要求:1.深入贯彻落实<决定>,2.推进高标准十有县建设,3.落实汛期各项防灾措施,4.做好应急处置工作. 地质灾害防治工作关系到人民群众生命财产安全,也是维护社会公共安全,维护地质环境安全的基础性工作,是生态文明建设

地质灾害防治工作的经验和体会

最近写材料的时候,总结了一下地灾防治工作中一些经验和体会.如下: (一)领导重视是地质灾害防治工作的前提和保障. 国土资源部.省委和省政府对地质灾害防治工作的高度重视,为我省地质灾害防治工作指明了方向,是我省地质灾害防治工作的组织保障.特别是今年省政府将地质灾害防治工作纳入省政府“十件民生实事”,将地质灾害防治工作的重要程度提升到了新的高度,各地级以上市政府纷纷加大了地质灾害隐患点搬迁和治理经费投入,大大推进了全省的地质灾害防治工作. (二)群专结合是做好地质灾害防治工作的关键. 群测群防体系的

读书摘要

点击查看[读书摘要] 原文地址:https://www.cnblogs.com/allearner/p/11459730.html

《Effective C++》读书摘要

转:http://www.cnblogs.com/fanzhidongyzby/archive/2012/11/18/2775603.html 最近刚读完侯捷的<Effective C++>,相对来说,这本书的内容比较贴近基础,对于刚掌握C++基础的人会有不少的提高.不过书中还是涉及了不少C++的高级特性,阅读起来需要查阅相关的资料.书中给出了大量的示例和代码来说明具体规则的原理,我按照书中给出的标题将每个条目的关键内容整理如下.一方面是保留一份读书笔记,另一方面也是为了方便日后查阅方便.当然

读书摘要:第七章 闩Suan锁和自旋锁

摘要: 1.闩锁就像是内存上的锁,随着越来越多的线程参与进来,他们争相访问同一块内存,导致堵塞.2.自旋锁就是闩锁,不同之处是如果访问的内存不可用,它将继续检查轮询一段时间.3.拴锁和自旋锁是我们无法控制的,由sqlserver自动维护,但是我们应积极寻找避免他们发生堵塞的方法.4.id作为聚集索引时,当数据量增加时最后一个数据页将成为热点,征用就会发生.避免有经常行数据插入操作的表使用自增ID,改为guid.5.队列操作的数据表也应该避免ID的聚集索引问题.6.无论何时将数据插入到没有聚集索引

JAVA设计模式(DESIGN PATTERNS IN JAVA)读书摘要 第1部分接口型模式——第3章 适配器(Adapter)模式

客户端代码提供接口来写具体实现类时,要利用已经实现接口功能的现有类,但是接口的方法名和现有类的方法名不一致,则需要使用适配器模式. 接口适配 如图所示, RequiredInterface接口声明了Client类所要调用的requiredMethod()方法,ExistingClass的usefulMethod()提供了此方法的具体实现,但是这两个方法的名字不同,这要对ExistingClass进行适配.适配类NewClass继承ExistingClass类,实现了RequiredInterfa

&lt;Effective C++&gt;读书摘要--Resource Management&lt;一&gt;

1.除了内存资源以外,Other common resources include file descriptors, mutex locks, fonts and brushes in graphical user interfaces (GUIs), database connections, and network sockets. Regardless of the resource, it's important that it be released when you're fini

HeadFirst SQL 读书摘要

数据库都是用 圆柱形表示的. 数据库中包含表 表中包含行和列 行又叫记录record,  列又叫 字段field 创建数据库 create database mypipe_l; 选择数据库 use mypipe_l; 创建表 create table doughnut( name VARCHAR(10), type VARCHAR(6) ); 查看表 desc doughnut; 删除表 drop table doughnut; 插入数据 insert into doughnut (name,

&lt;Effective C++&gt;读书摘要--Designs and Declarations&lt;三&gt;

<Item 22> Declare data members private 1.使数据成员private,保持了语法的一致性,client不会为访问一个数据成员是否需要使用括号进行函数调度,还是不使用括号直接访问成员而纠结. 2.使数据成员private,if you use functions to get or set its value, you can implement no access, read-only access, and read-write access. Heck

Java设计模式(Design Patterns In Java)读书摘要——第1章 绪论

为何需要模式 模式是做事的方法,是实现目标,研磨技术的方法.通俗点说,模式是为了解决某个行业的某个问题的有效的方法或技艺. 为何需要设计模式 为了提升代码的水准,是代码变得简洁而易用.模式是一种思想,而不是具体的实现. 为何选择Java 集大成,流行,发展前景好 UML 一种统一建模语言 挑战 多思考,多练习 本书的组织 1.接口型模式 2.职责型模式 3.构造型模式 4.操作型模式 5.扩张型模式 模式的分类具有主观色彩,你也可以根据自己的见解提出不同的分类. 欢迎来到Oozinoz 本书的挑