NoSQL复习
第一章 NoSQL数据库概述
关系数据库的不足
- 大量数据的写入处理
- 表结构变更及建立索引
- 字段不固定的应用
- 对简单查询需要快速返回结果的处理
NoSQL数据库的优势
- 易于数据的分散
- 提升性能和增大规模
- 模式灵活
- 扩展性好
NoSQL数据库的种类
存储类型 | 代表解决方案 | 特点 |
---|---|---|
列存储 | Hbase, Cassandra, Hypertable | 按列存储,适用于数据压缩,对一个或几个字段进行查询的效率很高。 |
文档存储 | MongoDB, CouchDB, riak | 保证海量数据存储的同时,具有良好的查询性能。用类JSON格式进行存储。 |
key-value 存储 | Dynamo, Redis, Tokyo Cabinet, MemcacheDB | 具有极高的并发读写性能。通过key迅速查找到value,但只能通过key查询。 |
图数据库 | Neo4j, HyperGraphDB | 图形关系的最佳存储模式。 |
对象数据库 | db4o, Versant | 类似面向对象语言的语法操作数据库,通过对象的方式存取数据。 |
XML数据库 | Berkerey DB XML, BaseX | 高效存储XML数据,并支持XML的内部查询语法。 |
数据一致性理论
CAP理论
- C: Consistency 一致性
- 在分布式系统完成某写操作后任何读操作,都应该获取到该写操作写入的那个最新的值
- 相当于要求分布式系统中的各节点时时刻刻保持数据的一致性
- A: Availability 可用性
- 一直可以正常的做读写操作。简单而言就是客户端一直可以正常访问并得到系统的正常响应
- 用户角度来看就是不会出现系统操作失败或者访问超时等问题
- P: Tolerance of network Partition 分区容错性
- 指的分布式系统中的某个节点或者网络出现了故障的时候,整个系统仍然能对外提供满足一致性和可用性的服务,也就是说部分故障不影响整体使用
- 一个分布式系统不可能满足一致性,可用性和分区容错性这三个需求,最多只能同时满足两个
- 选择CA,放弃P
- 关系型数据库
- 选择CP,放弃A
- 分布式数据库
- 选择AP,放弃C
- 保证最终一致性,如BASE
数据一致性
- 强一致性:在任何时刻,所有节点的数据都保持一致。每次读操作都能返回最新的写操作结果,确保用户看到的是最新的数据。
- 最终一致性:在经历一段时间后,所有节点的数据会达到一致状态。虽然短期内可能不一致,但系统保证最终一致。是一种弱一致性特例
- 弱一致性:没有保证数据在任何时间点的一致性,可能在长时间内保持不一致。
- 因果一致性
- 如果Process A通知Process B它已经更新了数据,那么Process B的后续读取操作则读取A写入的最新值,而与A没有因果关系的C则可以最终一致性
- 读自写一致性
- 用户在写入数据后,立即进行读取操作时,能够读取到自己刚刚写入的数据。
- 用户在社交媒体上发布了一条状态,随后立即查看自己的个人主页,能够看到这条状态。
- 会话一致性
- 此种一致性要求客户端和存储系统交互的整个会话阶段保证读自写一致性
- 单调读一致性
- 如果一个读操作在某个时间点发生在另一个读操作之后,那么第二个读操作的结果不会比第一个读操作的结果更旧。
- 单调写一致性
- 如果一个写操作在某个时间点发生在另一个写操作之后,那么第一个写操作的结果会在第二个写操作之前生效。
BASE模型
Basically Availble –基本可用
- 分布式系统在出现不可预知故障的时候,允许损失部分可用性——但请注意,这绝不等价于系统不可用
Soft-state –软状态/柔性事务
- 是指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时
Eventual Consistency –最终一致性
- 最终一致性强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性
NWR模型————数据一致性实现技术
- N: 复制的节点数量,即副本数
- R: 成功读操作的最小节点数
- W: 成功写操作的最小节点数
- 只需W + R > N,就可以保证强一致性,因为读取数据的节点和被同步写入的节点是有重叠的
N=3,W=2, R=2 ,那么表示系统中数据有3个不同的副本,当进行写操作时,需要等待至少有2个副本完成了该写操作系统才会返回执行成功的状态,对于读操作,系统有同样的特性
- 如果R+W>N,那么分布式系统就会提供强一致性的保证,因为读取数据的节点和被同步写入的节点有重叠
- 如果R+ W≤N,这时读取和写入操作是不重叠的,系统只能保证最终一致性, 而副本达到一致的时间则依赖于系统异步更新的实现方式
两阶段提交协议
- 两阶段提交协议是很常见的解决分布式事务的方式,可以保证分布式事务中,要么所有参与的进程都提交事务成功,要么都取消事务,这样做可以在分布式环境中保持ACID中A(原子性)
- 优点
- 实现简单
- 缺点
- 同步阻塞问题:所有结点因为在执行事务,任何其他结点的访问都阻塞
- 单点故障:一旦协调者发生故障,参与者会一直阻塞下去。
- 数据不一致:若只有一部分参与者收到了提交请求,导致
- 协调者再发出commit消息之后宕机,而唯一接收到这条消息的参与者同时也宕机了。此时事务不知道执行与否
第三章 文档型数据库
文档型数据库和关系数据库区别
文档型数据库特性
- 一致性:开发者可以根据应用程序需要和业务需求,为每次操作指定数据库的“一致性”强度
- 事务:支持单文档级别的事务,也可以使用NWR协议来实现事务功能
- 可用性:文档数据库视图用主从数据复制技术来增强可用性
- 查询:可以使用视图查询,可用物化视图
- 可扩展性:可用“分片”技术
MongoDB语句
- or:
1
db.col.find({$or:[{"by":"菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty()
QQ空间设计
空间刷新算法
- 获取用户的好友列表:
- 从用户集合中获取当前用户的好友列表。
- 获取好友的最新动态:
- 从日志集合、说说集合和相册照片集合中获取好友的最新动态,按时间戳排序。
- 合并动态:
- 将不同集合中的动态合并成一个列表,并按时间戳排序。
- 分页加载:
- 为了提高性能,可以采用分页加载的方式,每次加载一定数量的动态,用户滚动到页面底部时再加载更多。
MongoDB怎样实现分页
- 在MongoDB中,可以通过使用skip和limit方法来实现分页。
- 例如,要查询第二页的数据(每页10条),可以使用以下代码:
- db.collection.find().skip(10).limit(10)
- 这里的skip方法用于跳过前10条数据,limit方法用于限制返回的文档数。
- 如果要查询第三页的数据,可以使用以下代码:
- db.collection.find().skip(20).limit(10)
- 以此类推,可以通过调整skip和limit方法的参数来实现分页查询。
第四章 列存储数据库
HBase表机构
HLog
预写日志(WAL,Write Ahead Log)是HBase中用于保证数据一致性的机制。
原理是在对数据进行修改操作之前,先将修改操作的信息写入WAL中,然后再进行实际的数据修改。如果在数据修改过程中发生错误,可以通过WAL中记录的信息来恢复数据。
预写日志在HBase中有如下作用:
(1)保证数据一致性:在数据修改过程中,如果发生错误,可以通过WAL中记录的信息来恢复数据,保证数据的一致性。
(2)支持数据恢复:如果HBase服务器意外崩溃,可以通过WAL中记录的信息来恢复数据。
(3)支持多种数据修改操作:WAL支持多种数据修改操作,包括插入、更新和删除操作。
(4)加速数据修改:由于WAL的写入是异步的,因此可以在写入WAL的同时进行数据修改,从而加速数据修改的速度。
(5)保证最终一致性:WAL可以保证最终一致。
热点
- 热点发生在大量的client直接访问集群的一个或极少数个节点(访问可能是读,写或者其他操作)
- 大量访问会使热点数据块所在的单个机器超出自身承受能力,引起性能下降甚至数据块不可用,这也会影响同一个节点上的其他数据块,由于主机无法服务其他数据块的请求
第五章 键值数据库
Redis设计示例(文章网站后端)
- 通过这两个有序集合,网站既可根据文章发布的先后顺序来展示文章,又可根据文章评分的高低来展示文章
第六章 图数据库
Neo4J数据模型
图数据库转Mongo示例
将Neo4j转换到MongoDB数据库中,写明设计思路和逻辑结构,以及两种数据库如何进行图书平均评分Top k的查找。
逻辑结构
1.books集合
1 |
|
2.readers集合
1 |
|
3.reviews集合
1 |
|
查找图书平均评分Top k
1.Neo4j
1 |
|
2.Mongo
1 |
|
聚合管道
常用管道命令
- $group: 将集合中的⽂档分组, 可⽤于统计结果
- $match: 过滤数据, 只输出符合条件的⽂档
- $project: 修改输⼊⽂档的结构, 如重命名、 增加、 删除字段、 创建计算结果
- $sort: 将输⼊⽂档排序后输出
- $limit: 限制聚合管道返回的⽂档数
- $lookup: 关联其他表查询
- from: 关联的表名
- localField:本表的属性
- foreignField:from表的属性
- as:命名为
{ $arrayElemAt: [ <array>, <index> ] }
:用于从数组中获取指定索引位置的元素- <array>: 要从中获取元素的数组表达式。
- <index>: 要获取的元素的索引位置。索引从0开始计数。
描述RDB数据库、NoSQL数据库和NewSQL数据库的区别和特点
(1)RDB数据库是将复杂的数据结构以行和列的形式进行存储及展示,对数据的操作几乎都是建立在一个或多个关系表的基础上。通过表的关系来实现数据库的管理。典型的关系型数据库有Oracle、MySql、SQL Server等。
RDBMS优势:
(通用性和高性能)保持数据的一致性(事务处理)、最小冗余、复杂查询如join、成熟的技术关系。
RDBMS不足:
大量数据的写入处理;表结构变更及建立索引;字段不固定的应用;对简单查询需要快速返回结果的处理。
(2)NoSQL指的是非关系型的数据库。NoSQL用于超大规模数据的存储。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。常见的有Redis、Hbase、MongoDB等。
NoSQL优势:
易于数据的分散;提升性能和增大规模;模式自由;扩展性好。
NoSQL缺点:
不能保证ACID,采取最终一致性原则。
(3)NewSQL是对各种新的可扩展/高性能数据库的简称,具有NoSQL对海量数据的存储管理能力,保持了传统数据库支持ACID和SQL等特性。
NewSql特点:
支持关系数据模型;使用SQL作为其主要接口