传统的关系型数据库性能上的缺陷:
- 无法满足海量数据的管理需求
- 无法满足高并发的需求
- 无法满足高可扩展性和高可用性的需求
主从实现读写负载服务器分离(MySQL集群)
分库:复杂,延迟,扩容问题(增加新机器,对整个数据集重新分区),重新负载均衡
Web2.0通常是不要求严格数据库事务
Web2.0不要求严格的读写实时性
Web2.0不包含复杂的SQL查询
关系型数据库:很难实现横向扩展,纵向扩展也很难,大数据量大效率下降,ACID事务,数据完整性,强大的技术和商业支持,管理员维护
NoSQL:扩展容易,复杂查询能力差,没有完整性,数据模型非常灵活,水平扩展好,具有非常好的可用性,能够在短时间内迅速返回所需的结果,未形成统一的标准,无基础维护较复杂
NoSQL四大类型:
- 键值数据库:就是一堆的键值对(频繁读写,内容缓存,扩展性好,灵活性好,大量的写操作性能高,不能回滚) Redis,DynamoDB,云中的Simple DB
- 列族数据库:行键水平划分,列族垂直划分 Hbase(Master slave 一主多从结构) BigTable (查找速度快,可扩展性强,容易进行分布式扩展,复杂性低,不适用ACID事务)
- 文档数据库:可看作键值数据库,值是文档而非标量 MongoDB
- 图数据库:以图结构方式存储相关信息 Neo4j
NoSQL数据库的三大理论基石:
- CAP
- BASE
- 最终一致性
1、CAP理论:(只能三者取其二,不可能都实现)
- C 一致性(任何一个读操作总能读到之前完成的写操作的结果)
- A 可用性(快速获取数据,可以确定的时间内返回操作结果,保证每个请求不管成功或者失败都有响应)
- P 分区容忍性(当出现网络分区的情况时(系统中一部分节点无法和其他节点进行通信),分离的系统也能正常运行)
放弃P,选择CA 一般的关系型数据库
放弃A,选择CP NoSQL数据库
放弃C,选择AP Dynamo,Cassandra,Voldemort数据库
2、BASE:ACID是关系数据库中的事务的四个性质,在NoSQL数据库中BASE(碱)和ACID(酸)是对应关系
- 基本可用:节点出错,仍然可用
- 软状态:可以有一段时间不同步,具有一定的滞后性
3、最终一致性(弱一致性的特例):强一致性(总能读到最新的数据)和弱一致性,主要区别在于高并发的数据访问操作下,后续操作是否能够获取最新的数据,最后总能读到正确的数据
如何实现各种类型的一致性:
N 数据冗余的份数
W 更新数据时需要保证写完成的节点数
R 读取数据的时候需要读取的节点数
W+R>N : 写节点和读节点重叠,一主一备同步复制的关系型数据库,当N=2,W=2,R=1,则不管读的是主库还是备库的数据,都是一致。至少要 W + R = N + 1
W+R<=N : 对于一主一备异步复制的关系型数据库,N =2 ,W = 1,R = 1 ,则如果读的是备份的数据库,就可能无法读取主库已经更新过的数据。
对于HBase,HBase是借助底层的HDFS来实现其数据冗余备份,HDFS采用强一致性保证,在数据未完全同步到N个节点前,写操作不会成功返回也就是说当W=N,而读操作只需要读到一个值即可也就说R=1.
NewSQL数据库(关系型)-- SQL Azure(底层仍然是SQL server一些的基础) ,Amazon RDS
NewSQL 分析型应用(非常好的水平可扩展性,强一致性,事务一致性,支持SQL查询,支持海量的数据存储)
NoSQL 互联网应用