NoSql入门和概述
背景
对于以前采用数据存储的业务数据大多数采用的是MySQL,而对于作伪数据多样性,及并发上,就出现性能瓶颈。
而互联网需要数据海量性、多样性、实时性,需求需要高性能、高可扩、高性能。
所以就出现了非关系数据库(NoSQL),因为一些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
特性
易扩展
NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。
数据之间无关系,这样就非常容易扩展。也无形之间,在架构的层面上带来了可扩展的能力。
大数据量高性能
NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,这得益于它的无关系性,数据库的结构简单。
一般MySQL使用Query Cache,每次表的更新Cache就失效,是一种大粒度的Cache,在针对web2.0的交互频繁的应用,Cache性能不高。而NoSQL的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上来说就要性能高很多了。
多样灵活的数据模型
NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。
RDBMS vs NoSQL
RDBMS
- 高度组织化结构化数据
- 结构化查询语言(SQL)
- 数据和关系都存储在单独的表中。
- 数据操纵语言,数据定义语言
- 严格的一致性
- 基础事务
NoSQL
- 代表着不仅仅是SQL
- 没有声明性查询语言
- 没有预定义的模式
-键 - 值对存储,列存储,文档存储,图形数据库 - 最终一致性,而非ACID属性
- 非结构化和不可预知的数据
- CAP定理
- 高性能,高可用性和可伸缩性
NoSQL数据模型(聚合类型)
KV键值
存储的是key和value对应的数据。
BSON
一种类json的一种二进制形式的存储格式,简称 Binary JSON,和JSON一样支持内嵌的文档对象和数组。
列簇
顾名思义,是按列存储数据的。最大的特点是方便存储结构化和半结构化数据,方便做数据压缩,对针对某一列或者某几列的查询有非常大的IO优势。
图形
数据库的四大分类
KV键值
例如:
新浪:BerkeleyDB+redis
美团:redis+tair
阿里、百度:memcache+redis
文档型数据库(bson格式比较多)
例如:
CouchDB,MongoDB
列存储数据库
例如:
Cassandra, HBase
分布式文件系统
图关系数据库
(1)它不是放图形的,放的是关系比如:朋友圈社交网络、广告推荐系统
(2)社交网络,推荐系统等。专注于构建关系图谱
例如:
Neo4J,InfoGrid
CAP原理(CAP+BASE)
传统的ACID
A(Atomicity)原子性
C(Consistency)一致性
I(Isolation)独立性
D(Durability)持久性
CAP
C:Consistency(强一致性)
A:Availability(可用性)
P:Partition tolerance(分区容错性)
CAP的3进2
一个分布式系统不可能同时很好地满足一致性,可用性和分区容错性,最多只能同时较好的满足两个。分区容错性是我们必须实现的,所以只能在一致性和可用性之间权衡。
例如:
CA: 传统Oracle数据库
AP: 大多数网站架构的选择
CP:Redis、Mongodb
分布式架构的时候必须做出取舍。一致性和可用性之间取一个平衡。多余大多数web应用,其实并不需要强一致性。因此牺牲C换取P,这是目前分布式数据库产品的方向。
CAP理论的核心是:
一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。
因此,根据 CAP 原理将 NoSQL 数据库分成了满足 CA 原则、满足 CP 原则和满足 AP 原则三 大类:
CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。
CP - 满足一致性,分区容忍必的系统,通常性能不是特别高。
AP - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。
BASE
BASE就是为了解决关系数据库强一致性引起的问题而引起的可用性降低而提出的解决方案。
BASE其实是下面三个术语的缩写:
基本可用(Basically Available)
软状态(Soft state)
最终一致(Eventually consistent)
它的思想是通过让系统放松对某一时刻数据一致性的要求来换取系统整体伸缩性和性能上改观。大型系统往往由于地域分布和极高性能的要求,不可能采用分布式事务来完成这些指标,要想获得这些指标,我们必须采用另外一种方式来完成,这里BASE就是解决这个问题的办法