做者 : Stanley 罗昊java
NoSQL(NoSQL - Not Only SQL),意“不只仅是SQL”;mysql
泛指非关系型的数据库;web
随着互联网web2.0网站的兴起,传统的关系数据库在应对web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站以及显得力不从心,暴露了不少难以克服的问题,而非关系型的数据库则因为其自己的特色获得了很是迅速的发展;面试
NoSQL数据库的产生就是为了解决大规模数据集合,多重复数据种类带来的挑战,尤为是大数据应用难题,包括大规模数据的存储。sql
(例如谷歌或Facebook天天为澳门的用户手机万亿比特的数据),这些类型的数据存储不须要固定的模式,无需多余操做就能够横向扩展;数据库
在最先的项目研发时期,是单机MySQL的美好年代,无非就是三层架构,dao层直接访问数据库获取数据后响应给客户便可,很是简单;缓存
可是随着时代的改变,以及互联网用户愈来愈多,大规模的互联网公司兴起,数据量急剧增长,再用最先的开发模式,已经彻底知足不了如今时代的需求了;tomcat
因此就nosql(非关系型数据库)横空出世,来解决大数据量状况下提升数据库读取效率,从而提高系统性能以及客户体验;服务器
在早期的系统,dao层直接访问数据库获取数据,可是如今时代的变迁,这样的方式在数据量大的状况下,效率很是很是的查,你不管怎么优化都是徒劳;网络
nosql出现后,犹如在数据库前面加了一堵墙,dao层先访问Redis,Redis再访问数据库;
数据库读出来的数据先存入Redis,获取数据的时候,直接从Redis中获取便可,不用再经过数据库从内存中读写;
今天咱们能够经过第三方平台(如:Google,Facebook等)能够很容易的访问和抓取数据,用户的我的信息,社交网络,地理位置,用户产生的数据和用户操做日志以及成倍的增长;
咱们若是要对这些用户数据进行挖掘,MySQL数据库以及不合适这些应用了,NoSQL数据库发展却能很好的出列这些大数据;
在最先的javaweb开发应用程序中,无非就是JSP跳JSP,一个JSP处理用户而且响应,另一个JSP发出请求,请求别的JSP,再日后,JSP跳Serclet,Serclet掉业务逻辑层的方法,业务逻辑掉数据访问层,数据访问层去请求数据库发起事物;
在90年代,一个网站的访问量都不大,用单个数据库彻底能够轻松应付;
在那个时候,更多的都是静态网页,动态交互类型的网站很少;
在那个时候程序的划分也很是简单:
随着时代的变迁,数据的总量总有一天会撑破这个机器,数据库读取也就是查询效率讲会变得很是很是低;
创建索引也是会占用磁盘空间的,数据量越大,你索引越多,时间久了机器就是受不了你这样折腾了;
还有一个访问量(读写混合)一个数据库是受不了的,你读取跟插入数据都是在同一个数据库,这样数据库也是承受不了的(数据量大的状况下);
因此,问题已经列出来了,咱们就要解决,要去优化这些问题,提升性能;
在以上这种开发模式,数据量在小于1w是能够知足的,本身用用,或访问量不大的状况下是没有问题的,本身作练习什么的均可以,可是进入企业,就不能够再这么用了;
随着数据量大,读写都是在同一台机器上,扛不住了之后呢,项目架构也就进行了改变:
跟上一张图标对比,是只有一个MySQL数据库,而且如今咱们还在MySQL前面档了一层Cache(这里理解成Redis【缓存】),换句话说,以前是DAO层直接去访问数据库,如今DAO层直接去Redis里面;
是否是有点像替数据库挡了一层,你们都指定,对数据库伤害比较大的就是频繁的查询,若是频繁查询的恰好仍是一些固定的顺序,咱们是否是能够把他摘出来放到缓存里面(Redis);
mysql还有一个垂直拆分,言下之意就是,你一个数据装不住了,你拆开了之后,例如,买家跟卖家被分红两个库,这样的话,数据库的压力就被分担了一些;
举个例子,如今是一台机器一个数据库,我如今要求一台机器变成五个数据库,那么,其中的一台数据库做为主库,另外四台做为从库,我插入一条数据是给主库,主库这个时候须要同步另外四个从库,好比我主库里面有 a b c,这个时候我向里面查一个d,这个时候主库就须要向另外四个从库也添加一个d来保持同步;
也能够理解为主从复制,主表里面有什么东西,我从表须要迅速的复制粘贴进来;
读写分离,顾名思义,读就是查询,写就是增 删 改,在咱们本身作练习的时候,增删改查一直都是同一台机器或同一个数据库,可是在实际开发当中,这种状况是不容许的,由于很是影响效率;
因此又有一个数据库是只作查询,另一个数据库是只作增 删 改,这就是读写分离,因此就形成了下面这张图:
因为数据库的写入压力增长,Redis只能缓解数据库的读取压力,读写集中在一个数据库上让数据库不堪重负,大部分网站开始使用主从赋值技术来达到读写分离,提升读写性能和读库的可扩展性;
以前是光在mysql前面档了一个缓存,如今,在缓存背后又出现了数据库的拆分,变成了读写分离了,M表明主表,S表明从表;
什么概念呢?
就是,对于一个数据库的信息,写的操做都放到M(主)库了,读的操做都去从库去度,这样的话,存载的数据被分割之后,就能够大大的缓解数据库的压力;
通过前几回的拆分,改变,读写分离,日后发现又扛不住了,这个时候,集群就出来了;
在Redis的高速缓存,MySQL的主从复制,读写分离的基础上,这时,MySQL主库的读写压力开始出现瓶颈,而数据量的持续猛增,因为MyISAM使用表锁,在高并发下会出现严重的锁问题,大量的高并发MySQL应用开始使用InnoDB引擎代替MyISAM;
同时,开始流行使用分表分库来缓解写压力和数据库增加的扩展问题,这个时候,分表分库就成了一个热门的技术,是面试的热门问题也是业界讨论的热门技术问题;
也就是在这个时候MySQL推出了还不太稳定的表分区,这也给技术实力通常的公司带来了但愿,虽然MySQL推出MySQL Cluster集群,但性能也不能很好知足互联网的需求,只是在高可靠性上提供很是大的保障;
咱们能够发现,以上图就用了数据库的集群,三个数据库各司其职,每一个数据库存放的是整个项目数据的3分之1,频繁查询的数据库单独列出一个库,常常不用的数据也独立出来放在一个数据库中;
首先,三个蓝色的小人人就点客户,经过企业防火墙Linux,日后就是负载均衡的主备Nginx,作这个负载均衡、反向代理的一个;
因此说在真正的项目研发的时候,你是不可能先通过服务器的,而是先通过Nginx;
后面就是一大堆应用服务器的集群,也能够理解为tomcat的集群,一只猫带不动这个项目,那么就一群猫来带,这样就实现了高可用,负载均衡以及服务器的集群;
再日后,就是数据库的集群了;
今日感悟:
当一我的能够轻松作一件事情的时候,你本身也这么认为本身也能够;
那么你就大错特错了