基础理论
CAP 理论
- C(Consistency)一致性。一致性是指更新操作成功并返回客户端完成后,所有的节点在同一时间的数据完全一致,与ACID 的 C 完全不同。
- A (Availability)可用性。可用性是指服务一直可用,而且是正常响应时间
- P(Partition tolerance)分区容错性。分区容错性是指分布式系统在遇到某节点或网络区分故障的时候,仍然能够对外提供满足一致性和可用性的服务。
- CA:优先保证一致性和可用性,放弃分区容错性。
- 缺点:不再是分布式系统
- CP:优先保证一致性和分区容错性,放弃可用性。
- 缺点:牺牲用户体验
- AP:优先保证可用性和分区容错性,放弃一致性。
- 全局数据的不一致性
BASE 理论
- 基本可用(Basically Available):指分布式系统在出现不可预知故障的时候,允许牺牲部分可用性。允许分区失败的情形出现
- 软状态(soft state)
- 硬状态:数据库状态一直保持数据库一致性
- 软状态:状态可以有一段时间不同步
- 最终一致性(Eventuallyconsistent):系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。
NOSQL 特点
NOSQL 数据库的主要特点包括:易拓展、高性能处理大数据量的数据、灵活的数据模型、高可用
- 易拓展:去掉了关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。
- 大数据量,高性能:NoSQL 数据库都具有非常高的读写性能,尤其在大数据量下。这得益于它的无关系性,数据库的结构简单。
- 灵活的数据模型:NoSQL 无须事先为要存储的数据建立字段,随时可以存储自定义的数据格式
- 高可用:NoSQL 在不太影响性能的情况下,就可以方便的实现高可用的架构,有些产品通过复制模型也能实现高可用。
NOSQL与SQL 比较
特征 | SQL 数据库 | NOSQL 数据库 |
数据类型 | 结构化 | 非结构化 |
数据一致性 | 强一致性 | 弱一致性 |
事务 | 高事务性 | 弱事务性 |
拓展性 | 一般 | 好 |
数据容量 | 有限数据 | 海量数据 |
标准化 | 是 | 否 |
技术支持 | 高 | 低 |
可维护性 | 复杂 | 复杂 |
NOSQL 体系框架
- NOSQL 分为 4层,分别是数据持久层、数据分布层、数据逻辑模型层、接口层
- 数据持久层:定义了数据的存储形式
- 内存:最快,但可能造成数据丢失
- 硬盘:保存很久,但存取慢于内存
- 内存和硬盘接口
- 定制可插拔:保证了数据存取具有较高的灵活性
- 数据分布层:定义了数据是如何分布的
- CAP 支持,可用于水平拓展
- 多数据中心支持,可以保证在横跨多数据中心时也能够平稳运行
- 动态部署支持,可以在运行着的集群中动态地添加或删除节点
- 数据逻辑模型层:数据的逻辑表现形式
- 接口层:为上层应用提供了方便的数据调用接口
- Rest:一种软件架构风格,它定义了一组用于分布式系统的架构原则
- Thrift:一个由Apache开发的跨语言的服务部署框架
- Map/Reduce:一种编程模型,用于大规模数据集(大规模数据集)的并行运算
- Get/Put:Get/Put 是一种简单的键值存储操作接口,其中"Get"用于检索数据,"Put"用于存储数据
- 特定语言API:许多NoSQL数据库为特定编程语言提供了专用的API
NOSQL 适用场景
- 数据模型比较简单
- 需要灵活性更强的IT 系统
- 对数据库性能要求较高
- 不需要高度的数据一致性
- 对于给定key,比较容易映射复杂值的环境
NOSQL 数据库分类
NOSQL 数据库主要分为4类,分别是:键值对数据库、列式存储数据库、文档型数据库、图数据库
键值对数据库
- 键值存储的典型数据结构一般为数据链表:先通过Hash 算法得出 Hashcode,找到数组的某一个位置,然后插入链表。
- 这类数据库主要会用到一个哈希表,表中有一个特定的键和一个指针指向特定的数据。
- Key-Value 模型对于IT 系统来说,其优势在于简单、易部署。但是如果数据库管理员只对部分值进行查询或更新的时候,Key-Value 就显得效率低下了。
- 典型应用
- 涉及频繁读写、拥有简单数据模型的应用
- 内容缓存、比如会话配置文件、参数、购物车等
- 存储配置和用户信息的移动应用
- 优点:拓展性好、灵活性好、大量写操作时性能高
- 缺点:无法存储结构化信息,条件查询效率较低
- 相关产品:redis、Memcached
列式存储数据库
- 列式数据库是按数据库记录的列来组织和存储数据的,数据库中每个表由一组页链的集合组成,每条页链对应表中的一个存储列。
- 这类数据库通常用来应对分布式存储的海量数据。键仍然存在,但是他们的特点是指向了多个列。这些列是由列家族来安排的。
- 典型应用
- 数据分析:列式数据库非常适合进行数据分析和数据仓库应用,尤其是涉及大量聚合操作的场景。
- 大数据处理:用于处理大规模分布式数据集,如日志分析、用户行为分析等。
- 实时查询:在需要快速响应的实时分析系统中,列式数据库可以提供高效的查询性能。
- 分布式存储:在需要高可用性和容错能力的分布式系统中,列式数据库因其设计而具有优势。
- 优点:
- 查询性能:对于读取大量数据中的少数几列的场景,列式数据库可以显著提高查询性能,因为它只需要读取相关的列而不是整行数据。
- 压缩率高:由于同一列的数据类型相同,列式数据库通常可以实现更高的数据压缩率,从而减少存储空间和I/O操作。
- 可扩展性:列式数据库通常设计为分布式系统,易于水平扩展,可以处理不断增长的数据量。
- 容错性:许多列式数据库支持数据复制和分区,提高了系统的容错能力和可用性。
- 缺点:
- 写入性能:由于数据是按列存储的,对于涉及多列的写入操作,列式数据库可能不如行式数据库高效。
- 事务支持:大多数列式数据库不支持复杂的事务操作,这对于需要强事务一致性的应用来说可能是一个限制。
- 数据更新:对于频繁的数据更新操作,列式数据库可能不如行式数据库高效,因为更新操作可能需要重写整列数据。
- 复杂查询:虽然列式数据库在聚合查询方面表现优异,但对于涉及多表连接的复杂查询,其性能可能不如行式数据库。
- 相关产品:Apache Cassandra、Apache HBase、Google Bigtable
文档型数据库
- 该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可以看作是键值数据库的升级版,允许嵌套键值,在处理网页等复杂数据时,文档型数据库比传统键值数据库的查询效率更高。
- 典型应用:存储、索引并管理面向文档的数据或者类似的半结构化数据。比如用于后台具有大量读写操作的网站、使用JSON 数据结构的应用、使用嵌套结构等非规范化数据的应用程序
- 优点:
- 性能好(高并发)、灵活性高、复杂度低、数据结构灵活
- 提供嵌入式文档功能,将经常查询的数据存储在同一个文档中。既可以根据键来构建索引,也可以根据内容构建索引
- 缺点:缺乏统一的查询语法
- 相关产品:MongoDB、Lucene、Elasticserach
图数据库
- 图形结构的数据库同其他采用行列以及刚性结构的SQL 数据库不同,它使用灵活的图形模型,并且能够拓展到多个服务器上。
- NOSQL 没有标准的查询语言,因此进行数据库查询需要指定数据模型。
-
许多NoSQL 数据库都有REST 式的数据接口或者查询API。适合存储通过图进行建模的数据,列如社交网络数据、生物信息网络数据、交通网络数据等。
-
典型应用:专门用于处理具有高度相互关联关系的数据,比较适合于社交网络、模式识别、依赖分析、推荐系统以及路径寻找等问题
-
优点:灵活性高、支持复杂的图形算法、可用于构建复杂的关系图谱
-
缺点:复杂度高、只能支持一定的数据规模
-
相关产品:Neo4J、InfoGrid、Infinite Graph