学习前言:NoSQL理解
1. 基于MySQL系统架构
1.1 单机MySQL的美好时代
在90年代,网站的访问量一般都会很少,用单个数据库完全可以轻松应付。
在那个年代,主要都是静态网页,动态交互类型的不多。
我们来看看以上架构有什么瓶颈?
DAL 1:Data Access Layer。
-
当存储的数据量变的越来越庞大,一个机器将会放不下。
-
数据量变的越来越庞大,数据的索引(B+Tree)一个机器的内存放不下。
-
访问量过大(读写混合),一个实例不能承受。
当发生了以上三个的其中一个,只能对数据库进行重构了。
1.2 MySQL+垂直拆分(分库分表)
随着后来个人电脑的飞速发展,使得互联网也迅速普及,互联网的访问量及数据量不断增大,几乎大部分使用mysql数据架构的网站都出现了性能问题,web程序员不仅仅只是专注于功能上的开发,同时还要追求性能上的优化。程序员们开始大量优化数据的索引、sql语句,到最后这些优化都无法再进一步提升性能时,就发展到了分表分库;把系统的数据库按照不同的业务,划分出多个数据库。
互联网随着时间慢慢不仅不断增加访问量、数据量,而且互联网交互复杂度也开始变高,开始出现很多图片、小文件等多样性流数据频繁传输;由于小文件的传输变的非常频繁,而且文件数量往往非常的多,数据库的io性能也迎来了瓶颈,这个时候缓存技术应运而生,也迎来了,Memcached时代。
1.3 Memcached + Mysql + 垂直拆分
为了解决大量小文件读写,带来的io性能压力问题,在原来的分库分表的基础上,加入了memcached缓存技术,通过缓存文件来解决数据库压力,使得性能有了非常高的提升。
由于互联网的发展速度实在是太快了,后来的单Memcached也开始无法支撑这庞大数据量、访问量的压力;由于Memcached是独立于web之外部署的,为多个web提供了共享同一个高性能的缓存服务,在Memcached的服务器上,又发展出根据hash算法来进行多台Memcached缓存服务的扩展,然后又带来了一致性hash来解决新增或减少缓存服务器导致重新hash带来的大量缓存失效的弊端。
1.4 MySQL主从复制读写分离
由于数据的写入压力不断增大,Memcached只能缓解数据库的读取压力。由于读写操作都集中在一个库中,让数据库不堪重负,大部分网站开始使用主从复制技术,来打到读写分离。MySQL的master-slave模式这个时候成为了大部分网站的标配。
即写入数据的时候操作主库,读取数据的时候,操作缓存或读库。在写入数据库的时候,同时也加入到缓冲,每次请求查询数据时,先去查询缓存,如果缓存中查找不到,则直接查询读库,查询成功后把数据重新保存到缓存。
1.5 分库分表+水平拆分+集群
由于数据量的猛增,MySQL的MyISAM由于写的时候锁表,在高并发的情况下,会出现严重的性能问题,所以在MySQL5.6之后的版本都使用了InnoDB引擎,写的时候只会锁行。同时,开始流行使用分表分库来缓解数据库的写压力。这个时候分表分库在一时间成了热门的技术问题,与此同时,MySQL还推出了不太成熟的分表分区,这也给实力一般的小型公司带来了希望,虽然最终还是没有发展起来。
在Memcached的高速缓存,mysql的主从复制,读写分离的基础上,这时mysql主库的写压力也达到了瓶颈,MySQL推出了Cluster集群,在高可用上,带来了很好的保证,使得性能得到了进一步的提升。但应对如今的大型网站的海量数据,和高度的交互复杂,也显得非常吃力。
1.6 MySQL的扩展瓶颈
MySQL数据库也经常存储一些大文本字段,当数据量多的时候,导致数据库非常的大,在数据量大的时候,对增删查改的性能影响不可忽视。而且数据库做迁移、恢复等操作也非常的慢。虽然关系型数据库很强大,但它不适应于当前的大数据环境。数据量大的情况下,数据库的扩展性、表结构更改等,将变的异常的困难。
1.7 现在的架构(微服务时代)
上述1.6的基础上,app做了微服务2拆分,即:根据业务,把原来的一个项目拆分为多个项目,然后根据不同的模块建立不同的表数据,然后做读写分离、集群、缓存等,再引入一些其他的微服务组件。有兴趣去自行了解微服务相关知识。
2. 为什么用NoSQL
2.1 什么是NoSQL
NoSQL不是字面所理解的意思,并非“不是SQL”,而是不仅仅是SQL的意思,也就是说它可以做到sql不能做到的事。它主要能做到哪些sql不能做到的事呢?最主要是指 大数据量的读写处理。就拿Redis来做一个比较,redis可以做到1秒,写81000次,读110000次。就这一点来说,关系型数据库,是不可能做到的。
随着互联网web2.0的兴起,传统的关系型数据库在应付web2.0网站,特别是超大规模的SNS3类型的web2.0动态网站显得力不从心,暴露了很多难以克服的问题,而非关系型数据库由于自身基于内存速度非常快等特点,得到了非常迅速的发展。
NoSQL是指非关系型的数据库。nosql有时也称作not only sql的缩写,是对不同于传统关系型数据库的数据库管理系统的统称。NoSQL用于超大规模数据的存储。如腾讯、阿里云等,每天需要为他们的用户收集N亿的数据。这些类型的数据存储不需要固定的存储,也无需多余的操作就可以横向扩展。
2.2 为什么使用NoSQL
关系型数据库遵循ACID规则
-
原子性
原子性很容易理解,就是以事务为单位,事务内的操作要么全部成功,要么失败。(只有事务内的全部操作都执行成功才提交事务;只要有一个操作失败,事务就会回滚) -
一致性
事务提交时,需要保证数据的一致性,则必须遵守数据的逻辑约束。比如a + b=10,如果a改变了,那么b也必须要改变,以满足约束规则。 -
独立性
独立性指的事,并发时事务之间互不影响;比如有a和b两个事务,a是修改数据事务,b是读取事务,当a事务修改了数据,但未提交时,b事务读取到的数据,依然是原来还未被改变的数据。 -
持久性
持久性是指,事务一旦提交后,它所做的修改就会永久保存到数据库,即使宕机也不会消失。
为什么使用NoSQL
今天我们可以通过第三方平台(google、facebook、微信、淘宝等)可以很容易的访问和捉取用户数据。用户的个人信息,社交网络,地理位置,用户生成的数据和用户的操作日志已经成倍的增加。我们如果要对这些用户数据进行挖掘,那么SQL数据库已经不适合这些应用了,NoSQL发展却能很好的处理这些数据。
RDBMS vs NoSQL
RDBMS
- 高度组织结构化数据
- 结构化查询语言(SQL)
- 数据和关系都存储在独立的表中
- 数据操纵语言,数据定义语言
- 严格的一致性
- 基础事务
NoSQL
- 代表着不仅仅是SQL
- 没有声明性查询语言
- 没有预定义的模式
- 键-值对存储,列存储,文档存储,图形数据库
- 非结构化和不可预知的数据
- CAP定理(CA,CP,AP)
- 高性能,高可用性和高伸缩性
CAP定理(CAP theorem)
CAP定理,又称做 布鲁尔定理,它指出对于一个分布式系统来说,不可能同时满足以下三点:
- 一致性(Consistency) 所有节点在同一时间具有相同的数据
- 可用性(Availability) 保证每个请求不管是成功还是失败都有响应
- 分区容错(Partition tolerance) 系统任意数据丢失或失败不会影响系统的继续运作
CAP的核心理论是:一个分布式系统不能同时很好的满足一致性、可用性、分区容错 这三个需求,最多只能较好的满足其中两个。因此,根据CAP原理将NoSQL数据库分成了满足CA原则、满足CP原则和满足AP原则 三大类:
- CA - 单点集群,满足一致性,可用性的系统,通常在在可扩展性上不会太强大。
- CP - 满足一致性,分区容忍性的系统,通常性能不是特别高。
- AP - 满足可用性,和分区容忍性的系统,通常可能对数据的一致性要求低一些。
NoSQL的优/缺点
优点
- 高可扩展性
- 分布式计算
- 低成本
- 架构的灵活性,半结构化数据
- 没有复杂的关系
缺点
- 没有标准化
- 有限的查询功能(到目前为止)
- 最终一致是不直观的程序
附录: