《NoSQL精粹》读书笔记
第一部分:概念
1、为什么使用NoSQL
阻抗失谐:关系数据库的关系模型和内存中的数据结构之间存在的差异。
集成数据库:通常由不同团队所开发 的多个应用程序,将其数据存储在一个公用的数据库中。
应用程序数据库:其内容只能有一个应用程序的代码库直接访问,而这份代码库是由一个团队来维护的。
选用NoSQL原因:一是待处理数据量很大,或对数据访问的效率要求很高,从而必须将数据放在集群上;二是想采用一种更为方便的数据交互方式来提高应用程序开发效率。
NoSQL数据库共同特性:
- 不使用关系模型
- 在集群中运行良好
- 开源
- 适用于21世纪的互联网公司
- 无模式
2、聚合数据类型
聚合:把一组相互关联的对象视为一个整体单元来操作,该单元为聚合。
面向聚合数据库:键值数据库、文档数据库、列族数据库。
聚合无知:关系型数据库的数据模型中没有“聚合”概念,因此称之为“聚合无知”。
数据交互大多在同意聚合内执行,则使用面向聚合的数据库;若交互操作需要使用多种不同格式的数据,则用“聚合无知式数据库”。
3、数据模型详解
图数据库:将数据组织成一张由节点和变所组成的图,适合处理关系复杂的数据结构。
隐含模式:指在编写数据操作代码时,对数据结构所做的一系列假设。
物化视图:面向聚合数据库用不同的方式重组聚合的数据得出。(通常以映射化简来计算)
4、分布式模型
数据分布方式:
分片:将不同的数据分片存放在多个服务器中,每一个数据子集都专门由一台服务器负责。
复制:将数据复制到多个服务器上,每份数据都能在多个节点中找到。
复制方式:
主从复制:将其中一个节点当做权威数据源,并负责写入操作;其他从节点都要和主节点保持同步,他们可以负责读取操作。
对等复制:任何节点均可写入,节点间互相协调以同步其数据。
主从复制减少更新数据时的冲突几率,但它却会让主节点成为写入操作的瓶颈,对等复制则避免了这一点。
5、一致性
写入冲突与读写冲突: 当两个客户端试图修改同一份数据时会发生“写入冲突”;当某客户端在另一客户的执行写入操作的过程中读取数据时,会发生“读写冲突”。
更新一致性:悲观方式以锁定数据记录来避免冲突,乐观方式则在事后检测冲突并将其修复。
最终一致性:写入操作已经传播至所有节点。
CAP定理:一致性、可用性、分区耐受性这三个属性只能同时满足两个。当有可能发生“网络分区”现象时,必须在数据的“可用性”和“一致性”间权衡。
仲裁:在采用“复制”技术的分布式模型中执行数据库操作时,无需联系所有副本,只要足够多的副本所认可,就能保持“强一致性”了。
6、版本戳
版本戳:用来检测并发冲突。读取并更新某份数据后,可检测其版本戳,以确保在读取和写入操作之间,没有其他人更新过此数据。
版本戳实现方式:计数器、UUID、内容哈希码、时间戳等。
数组式版本戳:检测不同节点之间是否发生了“相互冲突的更新操作”。
7、映射-化简
映射-化简模式:一种安排数据处理流程的手段,可以利用及集群中的多台计算机,同时又能将某台计算机所需的数据及处理工作尽量放在本机执行。一种在集群上执行并发计算所用的模式。
映射:从聚合中读出数据,将之缩减为相关键值对。映射操作每次只能读取一条记录,所以可以在存放记录的节点上并发执行。
映射和化简:映射任务会生成许多具备同一关键字的值,而化简任务则将他们简化为单一的输出值。每个化简函数只操作单个键相关的映射结果,所以多个化简函数可以依据关键字执行并发化简。
”管道”:输入数据与输出数据形式相同的多个化简函数可归并为管道,以提高并发执行能力,减少所需传输的数据量。
如要广泛使用映射-化简计算的结果,可将其存储为物化视图。可用增量式映射-化简操作更新物化视图。
第二部分:实现
8、键值数据库
键值数据库:一张简单的哈希表,主要用在所有数据库访问均通过逐渐来操作的情况。(Riak、Redis、Memcached DB、Berkeley DB、HamsterDB、Amazon DynamoDB、Project Voldmort)
适用案例:
存放会话信息
用户配置信息
购物车数据
不适用场合:
数据间关系
含有多项操作的事务
操作关键字集合
9、文档数据库
文档数据库:可存放并获取文档,格式可是XML、JSON、BSON等。(MongoDB、CouchDB、Terrastore、OrientDB、RevenDB)
适用案例:
事件记录
内容管理系统及博客平台
网站分析与实时分析
电子商务应用程序
不适用场合:
包含多项操作的复杂事务
查询持续变化的聚合结构
10、列族数据库
列族数据库:可存储关键字及其映射值,可把值分成多个列族,让每个列族代表一张数据映射表。(Cassandra、HBase、Hypertable、Amazon SimpleDB)
适用案例:
事件记录
内容管理系统与博客平台
计数器
限期适用
不适用场合:
需ACID事务操作读写的系统
早期原型开发或试探技术方案时
11、图数据库
图数据库:存放实体及实体间关系。(Neo4J、Infinite Graph、OrientDB、FlockDB)
适用案例:
互联数据
安排运输路线、分派货物和基于位置的服务
推荐引擎
不适用场合:
需要更新全部或某子集内的实体。
12、模式迁移
迁移关系型数据库等强模式数据库,可将历次模式变更及数据迁移操作保存于 保本控制序列。
无模式数据迁移可用强模式迁移技术,也可用增量迁移,注意无模式的“隐含模式”。
13、混合持久化
混合持久化:使用不同数据库计数处理多种数据存储需求。
将数据访问封装为服务,可减少数据库变动对系统其他部分的影响。
新增数据库技术会让编程及操作更复杂,需要权衡候选数据库带来的好处是否抵得过其引入的复杂度。
14、超越NoSQL
文件系统:存放数量相对较少而且需要按大块处理的大文件。
事件溯源:将某个持续状态所发生的全部变更都持久化,而非仅仅持久化当前应用程序自身的状态。
内存映像:将应用程序状态放内存中。
版本控制:基于文件系统,最常使用的溯源系统。可让团队成员间协同修改复杂的互联系统。
XML数据库、对象数据库。。。
15、选择合适的数据库
选用NoSQL原因:
使用更符合应用程序需求的数据库来改善程序员工作效率
以能处理大量数据、降低延迟且增进数据吞吐量的某种技术组合来改善数据访问性能。
决定使用某个NoSQL技术前,一定要测试其是否如预期般改进了程序员工作效率及数据访问性能。
服务封装数据库:能在需求变更或技术成熟后改换其所封装的数据库技术。可将应用程序各部分规划到不同服务中,以便为既有程序引入NoSQL数据库。
大部分应用程序,尤其是“非战略性的”应用程序,应该继续使用关系型数据库技术,至少在NoSQL技术环境尚未成熟前。