一、引入
- 关系型数据库架构演进
架构 | 说明 |
---|---|
单机MySQL | 在90年代,一个网站的访问量一般不大,用单个数据库实例完全可以轻松应付; 大部分都是静态网页,动态交互性的网站不多 该架构的数据存储的瓶颈在于: (1)数据量的总大小累积到一台主机放不下 (2)数据的索引(B+ Tree)累积到一台主机放不下 (3)读写混合式访问量超出一个库实例的承受能力 |
Memcached缓存+MySQL+垂直拆分多实例 | 后来,随着访问量的上升,几乎大部分使用MySql单例架构的网站都出现了性能问题。程序员们开始大量使用缓存技术来缓解数据库访问的压力,优化数据库的结构和索引。 开始比较流行的是通过文件缓存来缓解数据库压力,但当访问量继续增大时,多台Web主机通过文件缓存不能共享,大量的小文件带来了较高的IO压力。这是,Memcached就自然的成为了一个非常时尚的技术产品。 |
MySql主从复制+读写分离 | 由于Memcached只能缓解数据库的“读”压力,当数据库的写入压力增加时,读写集中在一个数据库实例上使其不堪重负,大部分网站开始使用“主从复制”技术来达到读写分离, 以提高读写性能和读库的可扩展性。此时,MySql的Master-Slave模式成为网站标配。 |
分库分表+水平拆分+MySql集群 | 在Memcached的高速缓存,MySql的主从复制,读写分离的基础上,此时MySQL主库的写压力开始出现瓶颈,而数据量仍持续猛增。由于MyISAM使用表锁,在高并发下会出现严重的锁问题,大量的高并发MySQL应用开始使用InnoDB引擎 |
如今架构 |
扩展性瓶颈
MySql的扩展性差(需要复杂的技术实现)
大数据环境下IO压力大
表结构更改困难
- 什么是NoSQL
NoSQL=Not Only SQL,即“不仅仅是SQL”,泛指非关系型的数据库。
随着互联网Web2.0的兴起,传统关系型数据库在应付Web2.0网站,特别是超大规模和高并发的SNS( Social Networking Services )类型的纯动态网站已经力不从心,暴露了很多难以克服的问题,而非关系型数据库则由于其本身的特点得到了非常迅速的发展,NoSQL数据库的产生就是为了应对大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题,包括超大规模的数据存储。这些类型的数据存储不需要固定的模式,无需多余操作便可横向扩展。
- NoSQL优势
优势 | 说明 |
---|---|
易扩展 | NoSQL数据库种类繁多,但一个共同的特点便是去掉关系型数据库的关系特性。记录之间无关系,非常容易扩展。无形之间,在架构层面上带来了可扩展的能力 |
大数据量下的高性能 | NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,表现同样优秀。这得益于它的无关系型特性,数据库的结构简单。 一般MySQL使用Query Cache,每次表更新后Cache就失效,是一种大粒度的Cache。在Web2.0的交互频繁的场景中,Cache性能并不高。 而NoSQL的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上性能就会高很多。 |
多样灵活的数据模型 | NoSQL无需事先为存储的数据确定字段,随时可以存储自定义的数据格式。而在关系数据库里,面对非常大数据量的表,增加字段 (再见!- -|||) |
总结:RDBMS 与NoSQL对比
RDBMS | NoSQL |
---|---|
*高度组织结构化数据 *结构化查询语言SQL *数据和关系都存储在单独的表中 *数据定义/操纵语言 *严格的一致性ACID *基础事务 |
*“不仅仅是SQL” *没有声明性查询语言 *没有预定义的字段模式 *键值对存储,列存储,文档存储,图形数据库 *最终一致性,非ACID *CAP定理 *高性能,高可用,可伸缩 |
二、3V->3高
大数据时代-3V | 互联网需求-3高 |
---|---|
海量Volume | 高并发 |
多样Variety | 高可扩 |
实时Velocity | 高可用 |
推荐阅读:尽在双11 阿里巴巴技术演进与超越
大型互联网应用(大数据、高并发、多样数据类型)的难点和解决方案:
- 难点
(1)数据类型多样
(2)数据源多样性和变化重构
(3)数据源改造而数据服务平台不需要大面积重构- 解决方案:EAI(Enterprise Application Integration,企业应用集成),阿里封装了UDSL(统一数据平台服务层)
三、NoSQL数据模型简介
1. NoSQL-聚合模型
(1) KV键值对
(2) BSON
(3) 列族
(4) 图(Graph,图论概念,不是图片)
什么是BSON?
BSON(Binary JSON)是一种类JSON的二进制形式的存储格式。与JSON一样,支持内嵌的文档对象和数组对象。这种结构便于“合/拆”,优于多张关系型数据表的关联查询。 示例如下
{
"customer":{
"id":1136,
"name":"Z3",
"billingAddress":[{"city":"beijing"}],
"orders":[
{
"id":17,
"customerId":1136,
"orderItems":[{"productId":27,"price":77.5,"productName":"thinking in java"}],
"shippingAddress":[{"city":"beijing"}]
"orderPayment":[{"ccinfo":"111-222-333","txnid":"asdfadcd334","billingAddress":{"city":"beijing"}}],
}
]
}
}
- 为什么使用NoSQL聚合模型?
(1)高并发操作分库分表不建议有关联查询,现如今互联网公司都是用冗余数据来避免关联查询。
(2)分布式事务无法支持太多并发量。
四、NoSQL数据库的四大分类
类型 | 典型介绍 |
---|---|
KV键值数据库 | 新浪:BerkeleyDB+Redis 美团:Redis+Tair 阿里、百度:MemCache+Redis |
文档数据库(BSON格式较多) | MongoDB 一个基于分布式文件存储的数据库,是非关系数据库当中功能最丰富,最像关系数据库的产品。 |
列族数据库 | Cassandra,HBase |
图数据库 | Neo4J, InfoGrid |
五、分布式数据库的CAP+BASE
-
CAP
(1)描述
CAP=Consistency(强一致性)+Availability(可用性)+PartitionTolerance(分区容错性)
(2)“3选2”(CAP理论的核心)
一个分布式系统不可能同时很好地满足一致性C,可用性A和分区容错性P这三个需求,最多只能同时较好地满足其中两个。
因此,将NoSQL数据库分成满足CA,CP,AP三大类原则 说明 CA 单点集群,满足一致性、可用性的系统,通常可扩展性不太强 CP 满足一致性,分区容忍性的系统,通常性能不是特别高 AP 满足可用性,分区容忍性的系统,通常对一致性要求低一些 (3) 由于当前的网络硬件肯定会出现延迟丢包等问题,所以分区容忍性P是我们必须实现的。 因此只能在一致性C和可用性A之间权衡,没有NoSQL系统能同时保证这三点。
CA-传统关系型数据库
AP-大多数网站架构的选择
CP-Redis、MongoDB一致性C与可用性A的抉择
对于Web2.0网站来说,关系型数据库的很多主要特性往往无用武之地。- 数据库事务一致性需求
很多Web实时系统并不要求严格的数据库事务,对读一致性的要求很低,有些场景对写一致性要求并不高。允许实现最终一致性。 - 数据库的写实时型和读实时性需求
对关系数据库来说,插入一条数据之后立刻查询,肯定可以读出该条数据,但对于很多Web应用来说,并不要求这么高的实时性,比如发一条消息之后,过几秒乃至十几秒之后,订阅者才看到这条动态是完全可以接受的。 - 对复杂的SQL查询,特别是多表关联查询的需求
任何大数据量的Web系统,都非常忌讳多个大表的关联查询以及复杂的数据分析类型的报表查询,特别是SNS类型的网站,从需求以及产品设计角度,就避免了这种情况的产生。往往只是单表的主键查询以及单表的简单条件分页查询,SQL的功能被极大的弱化。
- 数据库事务一致性需求
-
BASE(为了解决数据库强一致性而引起的可用性降低而提出的解决方案。)
(1)BASE=Basically Available(基本可用)+Soft State(软状态)+Eventually Consistent(最终一致)
(2)其思想是通过让系统放松对某一时刻数据一致性的要求来换取系统整体伸缩性和性能上的改观。
简单的说,大型系统往往由于地域分布和极高的性能要求,不可能采用分布式事务来完成这些指标,要想获得这些指标,必须采用另外一种方式来完成,BASE就是解决这个问题的办法。 -
分布式+集群简介
(1)分布式:不同的多台服务器上面部署不同的服务模块,它们之间通过RPC/RMI进行通信和调用,对外提供服务和组内协作。
(2)集群:不同的多态服务器上面部署相同的服务模块,通过分布式调度软件进行统一的调度,对外提供服务和访问。