- CAP-------nosql数据管理系统构建的基础
C consistency 强一致性 在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本) A availability 可用性 在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性) P Pattision Tolerance 分区容错性 以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。
传统的关系型数据库在功能支持上通常很宽泛,从简单的键值查询,到复杂的多表联合查询再到事务机制的支持。而与之不同的是,NoSQL系统通常注重性能和扩展性,而非事务机制(事务就是强一致性的体现)
传统的SQL数据库的事务通常都是支持ACID的强事务机制。A代表原子性,即在事务中执行多个操作是原子性的,要么事务中的操作全部执行,要么一个都不执行;C代表一致性,即保证进行事务的过程中整个数据加的状态是一致的,不会出现数据花掉的情况;I代表隔离性,即两个事务不会相互影响,覆盖彼此数据等;D表示持久化,即事务一旦完成,那么数据应该是被写到安全的,持久化存储的设备上(比如磁盘)。
NoSQL系统仅提供对行级别的原子性保证,也就是说同时对同一个Key下的数据进行的两个操作,在实际执行的时候是会串行的执行,保证了每一个Key-Value对不会被破坏
与BASE的关系
BASE就是为了解决关系数据库强一致性引起的问题而引起的可用性降低而提出的解决方案。 - 目前最快的KV数据库,10W次/S, 满足了高可用性。
- Redis的k-v上的v可以是普通的值(基本操作:get/set/del) v可以是数值(除了基本操作之外还可以支持数值的计算) v可以是数据结构比如基于链表存储的双向循环list(除了基本操作之外还可以支持数值的计算,可以实现list的二头pop,push)。如果v是list,可以使用redis实现一个消息队列。如果v是set,可以基于redis实现一个tag系统。与mongodb不同的地方是后者的v可以支持文档,比如按照json的结构存储。redis也可以对存入的Key-Value设置expire时间。
- Redis的v的最大远远超过memcache。这也是实现消息队列的一个前提。
cap理论告诉我们强一致性,可用性,分区容错性不能同时满足,在进行系统设计的时候必须在三者间权衡。
2 noSQL 在互联网行业,通常需要高并发,高性能,高可用性的的数据库系统,传统的关系型数据库系统主要以表的形式存储数据,无法应对非结构化的数据的挑战,比如表连接运算的性能瓶颈,表数据底层存储导致的I/O瓶颈,表的模式定义带来的设计问题等,所以我们要从数据模型的根源入手,解决性能问题
从数据模型角度看,Nosql主要划分为四个基本数据类型 A 键值数据模型 实例 DYnamo,Redis,Voldemort 应用场景 内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统 数据模型 key与value间建立的键值映射,,通常用哈希表实现 优点 查找迅速 缺点 数据无结构化,通常只被当作字符串和二进制数据
B 列式数据模型 实例 bigtable ,Cassandra,Hbase 应用场景 分布式文件系统 数据模型 以列存储,将同一数据存在一起 优点 查找迅速,可扩展性强,更容易进行分布式扩展 缺点 功能相对有限
C 文档数据模型 实例 CouchDB, MongoDB 应用场景 web应用 数据模型 与键值类似 优点 数据要求不严格,无须预先定义结构 缺点 查询性能不高
D 图形数据模型
实例 Neo4J 应用场景 社交网络,推荐系统,关系图谱 数据模型 图结构 优点 利用图结构相关算法提高性能 缺点 功能相对有限
Cassandra 和Hbase 的数据模型都借鉴于google的Bigtable,每一行数据的各项被存储在不同的列中,这些列的集合称为簇,而每一列中的每一个数据都包含一个时间戳属性,这样列中的同一个数据项的多个版本就能保存下来
·Key-Value模型是最简单,也是最方便使用的数据模型,它支持简单的key对value的键值存储和提取
·Key-Value模型的一个大问题是它通常是由HashTable实现的,所以无法进行范围查询,所以有序Key-Value模型就出现了,有序Key-Value可以支持范围查询
·虽然有序Key-Value模型能够解决范围查询和问题,但是其Value值依然是无结构的二进制码或纯字符串,通常我们只能在应用层去解析相应的结构。而类BigTable的数据模型,能够支持结构化的数据,包括列,列簇,时间戳以及版本控制等元数据的存储。
·而文档型存储相对到类BigTable存储又有两个大的提升。一是其Value值支持复杂的结构定义,二是支持数据库索引的定义。
·全文索引模型与文档型存储的主要区别在于文档型存储的索引主要是按照字段名来组织的,而全文索引模型是按字段的具体值来组织的。
·图数据库模型也可以看作是从Key-Value模型发展出来的一个分支,不同的是它的数据之间有着广泛的关联,并且这种模型支持一些图结构的算法。
目前简单将NoSQL几个分类的代表产品列举如下:
·Key-Value 存储: Oracle Coherence, Redis, Kyoto Cabinet
·类BigTable存储: Apache HBase, Apache Cassandra
·文档数据库: MongoDB, CouchDB
·全文索引: Apache Lucene, Apache Solr
·图数据库: neo4j, FlockDB
传统的SQL数据库的事务通常都是支持ACID的强事务机制。A代表原子性,即在事务中执行多个操作是原子性的,要么事务中的操作全部执行,要么一个都不执行;C代表一致性,即保证进行事务的过程中整个数据加的状态是一致的,不会出现数据花掉的情况;I代表隔离性,即两个事务不会相互影响,覆盖彼此数据等;D表示持久化,即事务一旦完成,那么数据应该是被写到安全的,持久化存储的设备上(比如磁盘)。
NoSQL系统仅提供对行级别的原子性保证,也就是说同时对同一个Key下的数据进行的两个操作,在实际执行的时候是会串行的执行,保证了每一个Key-Value对不会被破坏
与BASE的关系
BASE就是为了解决关系数据库强一致性引起的问题而引起的可用性降低而提出的解决方案。
- 目前最快的KV数据库,10W次/S, 满足了高可用性。
- Redis的k-v上的v可以是普通的值(基本操作:get/set/del) v可以是数值(除了基本操作之外还可以支持数值的计算) v可以是数据结构比如基于链表存储的双向循环list(除了基本操作之外还可以支持数值的计算,可以实现list的二头pop,push)。如果v是list,可以使用redis实现一个消息队列。如果v是set,可以基于redis实现一个tag系统。与mongodb不同的地方是后者的v可以支持文档,比如按照json的结构存储。redis也可以对存入的Key-Value设置expire时间。
- Redis的v的最大远远超过memcache。这也是实现消息队列的一个前提。
实例 bigtable ,Cassandra,Hbase 应用场景 分布式文件系统 数据模型 以列存储,将同一数据存在一起 优点 查找迅速,可扩展性强,更容易进行分布式扩展 缺点 功能相对有限
实例 CouchDB, MongoDB 应用场景 web应用 数据模型 与键值类似 优点 数据要求不严格,无须预先定义结构 缺点 查询性能不高
实例 Neo4J 应用场景 社交网络,推荐系统,关系图谱 数据模型 图结构 优点 利用图结构相关算法提高性能 缺点 功能相对有限
·Key-Value模型是最简单,也是最方便使用的数据模型,它支持简单的key对value的键值存储和提取
·Key-Value模型的一个大问题是它通常是由HashTable实现的,所以无法进行范围查询,所以有序Key-Value模型就出现了,有序Key-Value可以支持范围查询
·虽然有序Key-Value模型能够解决范围查询和问题,但是其Value值依然是无结构的二进制码或纯字符串,通常我们只能在应用层去解析相应的结构。而类BigTable的数据模型,能够支持结构化的数据,包括列,列簇,时间戳以及版本控制等元数据的存储。
·而文档型存储相对到类BigTable存储又有两个大的提升。一是其Value值支持复杂的结构定义,二是支持数据库索引的定义。
·全文索引模型与文档型存储的主要区别在于文档型存储的索引主要是按照字段名来组织的,而全文索引模型是按字段的具体值来组织的。
·图数据库模型也可以看作是从Key-Value模型发展出来的一个分支,不同的是它的数据之间有着广泛的关联,并且这种模型支持一些图结构的算法。
目前简单将NoSQL几个分类的代表产品列举如下:
·Key-Value 存储: Oracle Coherence, Redis, Kyoto Cabinet
·类BigTable存储: Apache HBase, Apache Cassandra
·文档数据库: MongoDB, CouchDB
·全文索引: Apache Lucene, Apache Solr
·图数据库: neo4j, FlockDB