Nosql

单机MySQL的美好时代
  • 在90年代,一个网站的访问量通常都不大,用单个数据库彻底能够轻松应付。
    在那个时候,更多的都是静态网页,动态交互类型的网站很少
  •                                                                   初期架构 | centerhtml

  • DAL,(Data Access Layer)。其功能主要是负责数据库的访问。简单地说就是实现对数据表的Select(查询)、Insert(插入)、Update(更新)、Delete(删除)等操做。
  • 上述架构下,咱们来看看数据存储的瓶颈是什么?
    • 一、数据量的总大小 一个机器放不下时。(表要占空间,表的索引要占空间)
    • 二、数据的索引(B+ Tree树)一个机器的内存放不下时库
    • 三、访问量(读写混合)一个实例不能承受,(读写一个库)                                  真正意义上的库应该是主从复制,读写分离,而mysql等数据库只能本身从本身的库中读与写,也就是本身和本身玩。

           若是知足了上述1 or 3个,则须要进化..java

Memcached(缓存,java上还有一个ehcache)+MySQL+垂直拆分

后来,随着访问量的上升,几乎大部分使用MySQL架构的网站在数据库上都开始出现了性能问题,web程序再也不仅仅专一在功能上,同时也在追求性能。程序员们开始大量的使用缓存技术来缓解数据库的压力,优化数据库的结构和索引。开始比较流行的是经过文件缓存来缓解数据库压力,可是当访问量继续增大的时候,多台web机器经过文件缓存不能共享,大量的小文件缓存也带了了比较高的IO压力。mysql

在这个时候,Memcached就天然的成为一个很是时尚的技术产品。nginx

Memcached做为一个独立的分布式的缓存服务器,为多个web服务器提供了一个共享的高性能缓存服务,在Memcached服务器上,又发展了根据 hash算法来进行多台 Memcached缓存服务的扩展,而后又出现了 一致性hash来解决增长或减小缓存服务器致使从新 hash带来的大量缓存失效的弊端
Memcached做为一个独立的分布式的缓存服务器,为多个web服务器提供了一个共享的高性能缓存服务,在Memcached服务器上,又发展了根据 hash算法来进行多台 Memcached缓存服务的扩展,而后又出现了 一致性hash来解决增长或减小缓存服务器致使从新 hash带来的大量缓存失效的弊端
Mysql主从读写分离
  • 因为数据库的写入压力增长,Memcached只能缓解数据库的读取压力。读写集中在一个数据库上让数据库不堪重负,大部分网站开始使用主从复制技术来达到读写分离,以提升读写性能和读库的可扩展性。Mysqlmaster-slave模式成为这个时候的网站标配了。            为了容灾备份,为了混存数据,主从复制:主库插一条数据,从库也立刻插一条,读写分离:
分表分库+水平拆分+mysql集群
  • Memcached的高速缓存,MySQL的主从复制,读写分离的基础之上,这时MySQL主库的写压力开始出现瓶颈,而数据量的持续猛增,因为MyISAM使用表锁,在高并发下会出现严重的锁问题,大量的高并发MySQL应用开始使用InnoDB引擎代替MyISAM。程序员

  • 什么是表锁和行锁,表锁就是当一个事件在用这个表的时候,其余的表候着,等于说把这个表锁住了。就像去上卫生间把门先锁上,行锁也是这样理解,表中有不少行,我使用的那个行,被我锁住,其余的事件不能用这个行。innodb就是使用的行锁,而myISAM使用的是表锁。行锁相对于表锁,限制少,因此行锁的高并发高,因此用了inonodb
  • 同时,开始流行使用分表分库(就是尽量的紧耦合把业务相关的分在一块儿,好比说用户的身份证号码。注册信息都是长期补变的,这些数据都是一些趋于冷的冷数据,因此通常状况下这些长期不变的数据放在一块儿库,而一些高度活跃的数据放在一个库,分表指的是一部分表和分库是同样的原理)来缓解写压力和数据增加的扩展问题。这个时候,分表分库成了一个热门技术,是面试的热门问题也是业界讨论的热门技术问题。也就在这个时候,MySQL推出了还不太稳定的表分区,这也给技术实力通常的公司带来了但愿。虽然MySQL推出了MySQL Cluster(这个单词就是集群的意思)集群,但性能也不能很好知足互联网的要求,只是在高可靠性上提供了很是大的保证web

 

MySQL的扩展性瓶颈
  • MySQL数据库也常常存储一些大文本字段,致使数据库表很是的大,在作数据库恢复的时候就致使很是的慢,不容易快速恢复数据库。好比10004KB大小的文本就接近40GB的大小,若是能把这些数据从MySQL省去,MySQL将变得很是的小。关系数据库很强大,可是它并不能很好的应付全部的应用场景。MySQL的扩展性差(须要复杂的技术来实现),大数据下IO压力大,表结构更改困难,正是当前使用MySQL的开发人员面临的问题。
今天是什么样子

 

这张图最开始是用户,第二个是防火墙,第三个是nginx,表示反向代理服务器(反向代理就是根据客户端的要求从本身关联的一组或者多组服务器获取资源进而反馈给客户端,反向代理就是充当了服务端的代理,正常的代理服务器都是从客户端到服务端,代理的是客户端,隐藏真实的客户,为客户端收发请求,使真实客户端对服务器不可见,这而反向的代理的是服务端,获取服务器ip的时候获取的是反向代理服务器的IP,),用来处理负载均衡(负载均衡就是将请求分发到各个服务器)。
 
nginx 这个轻量级、高性能的 web server 主要能够干两件事情:

  〉直接做为http server(代替apache,对PHP须要FastCGI处理器支持);
  〉另一个功能就是做为 反向代理服务器实现负载均衡

  由于nginx在处理并发方面的优点,如今这个应用很是常见。固然了Apache的 mod_proxy和mod_cache结合使用也能够实现对多台app server的 反向代理和负载均衡,可是在并发处理方面apache仍是没有 nginx擅长。
 
 
为何用NOSQL,
今天用户生成的数据和用户操做日志已经成倍的增长,传统的SQl数据库已经难觉得继
 
 NoSQL是什么
  NoSQL(NoSQL = Not Only SQL ),意即“不只仅是SQL”, 泛指非关系型的数据库。随着互联网 web2.0网站的兴起,传统的关系数据库在应付 web2.0网站,特别是超大规模和高并发的 SNS类型的 web2.0纯动态网站已经显得力不从心,暴露了不少难以克服的问题,而非关系型的数据库则因为其自己的特色获得了很是迅速的发展。 NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤为是大数据应用难题。
例如谷歌天天处理上万亿的比特的数据,这些类型的数据存储不须要固定的模式,无需多余的操做就能够横向扩展。
 
 
NoSQL能干什么
NoSQL,有三大重要的特性:
易扩展
大数据量高性能
多样灵活的数据模型

易扩展: NoSQL数据库种类繁多,可是一个 共同的特色都是去掉关系数据库的关系型特性数据之间无关系,这样就很是容易扩展
也无形之间,在架构的层面上带来了可扩展的能力。

 大数据量高性能:NoSQL数据库都具备很是高的读写性能(有一个数据是一秒钟读8万,写10万),尤为在大数据量下,一样表现优秀。这得益于它的无关系性,数据库的结构简单。通常MySQL使用Query Cache(查询缓存)每次表的更新Cache就失效,是一种大粒度的Cache,在针对web2.0的交互频繁的应用,Cache性能不高。而NoSQLCache是记录级的,是一种细粒度的Cache,因此NoSQL在这个层面上来讲就要性能高不少了面试

多样灵活的数据模型:NoSQL无需事先为要存储的数据创建字段,随时能够存储自定义的数据格式。而在关系数据库里,增删字段是一件很是麻烦的事情()。若是是很是大数据量的表,增长字段简直就是一个噩梦,字段就是表的索引,由于在mysql中是表结构,而Nosql是字典结构。redis


NoSQL的3V+3高(这个怎么记忆,v描述的是数据多,高描述的是性能好,)想像一下的如今的数据是 类型多,数量大,实时性高(实时性不太容易想起来),性能表示的是高并发,高扩展,高性能。海量数据的应用(淘宝,微信,等等)
  • 大数据时代的3V:算法

    • 海量Volume
    • 多样Variety
    • 实时Velocity
  • Volume、Variety、Velocity。这3V代表大数据的三方面特质:量大、多样、实时。对,不光是数据量大了。对TB、PB数据级的处理,已经成为基本配置。还能处理多样性的数据类型,结构化数据和非结构化数据,能处理Web数据,能处理语音数据甚至是图像、视频数据。实时。之前的决策支持时代,能够用批量处理的方式,隔夜处理数据,等决策者次日上班,能够看到昨天的经营数据。但如今的互联网时代,业务在24小时不间断运营,决策已经不是次日上班才作出,而是在客户每次浏览页面,每次下订单的过程当中都存在,都会须要对用户进行实时的推荐,决策已经变得实时。sql


  • 互联网需求的3高
    • 高并发
    • 高可扩
    • 高性能
当下Nosql的应用
当下是sql和Nosql一块儿使用,阿里巴巴中文网站的商品信息如何存放。

讲一下ali巴巴的网站的演变过程:
1》架构发展过程

 

 

5代开发的缘由:为了开放,让用户参与进来

 

 淘宝的数据架构的日益复杂性:

 

NoSQL数据模型简介
  • NoSQL聚合模型 和 NoSQL数据库的四大分类:
    • NoSQL聚合模型
      • KV键值
      • Bson(与java中的json(java程序与mysql等数据库链接的中间桥梁)相似的一种二进制形式的存储格式,简称binary JSon)
      • 列族
      • 图形
  • NoSQL数据库的四大分类:
    • KV键值:这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来讲的优点在于简单、易部署。可是若是DBA只对部分值进行查询或更新的时候,Key/value就显得效率低下了。 举例如:Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB.
    • 文档型数据库(bson格式比较多):文档型数据库的灵感是来自于Lotus Notes办公软件的,并且它同第一种键值存储相相似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,好比JSON。文档型数据库可 以看做是键值数据库的升级版,容许之间嵌套键值。并且文档型数据库比键值数据库的查询效率更高。如:CouchDB, MongoDb. 国内也有文档型数据库SequoiaDB,已经开源。
    • 列存储数据库:这部分数据库一般是用来应对分布式存储的海量数据。键仍然存在,可是它们的特色是指向了多个列。这些列是由列家族来安排的。如:Cassandra, HBase, Riak.
    • 图关系数据库:图形结构的数据库同其余行列以及刚性结构的SQL数据库不一样,它是使用灵活的图形模型,而且可以扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),所以进行数据库查询须要制定数据模型。许多NoSQL数据库都有REST式的数据接口或者查询API。如:Neo4J, InfoGrid, Infinite Graph.

四大分类的典型介绍:
KV键值:典型介绍
新浪:BerkeleyDB+redis
美团:redis+tair
阿里、百度:memcache+redis
文档型数据库:典型介绍CouchDB MongoDB
列存储数据库 Cassandra, HBase
分布式文件系统
图关系数据库 它不是放图形的,放的是关系好比:朋友圈社交网络,广告推荐系统 社交网络,推荐系统等。专一于构建关系图谱 Neo4J, InfoGrid

 

 
若是只想高速缓存就是memcached,而若是还想兼顾其余,数据类型丰富,redis和tair更加出色
  • 什么状况下能够用聚合模型来处理:
    • 高并发的操做是不太建议有关联查询的,互联网公司用冗余数据来避免关联查询。
    • 分布式事务是支持不了太多的并发的
在分布式数据库中CAP原理CAP+BASE
SQL 和 NoSQL
SQL和NOSQL特性 | center
  • SQL特性介绍

    • A:(Atomicity)原子性:
      • 整个事务中的全部操做,要么所有完成,要么所有不完成,不可能停滞在中间某个环节。事务在执行过程当中发生错误,会被回滚(Rollback到事务开始前的状态,就像这个事务历来没有执行过同样。
    • C:(Consistency)一致性
      • 一个事务能够封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,无论在任何给定的时间并发事务有多少。
      • 也就是说:若是事务是并发多个,系统也必须如同串行事务同样操做。其主要特征是保护性和不变性(Preserving an Invariant)
        • 以转帐案例为例,假设有五个帐户,每一个帐户余额是100元,那么五个帐户总额是500元,若是在这个5个帐户之间同时发生多个转帐,不管并发多少个,好比在A与B帐户之间转帐5元,在C与D帐户之间转帐10元,在B与E之间转帐15元,五个帐户总额也应该仍是500元,这就是保护性和不变性
    • I:(Isolation)隔离性
      • 隔离状态执行事务,使它们好像是系统在给定时间内执行的惟一操做。若是有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操做间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据
    • D:(Durability)持久性
      • 在事务完成之后,该事务对数据库所做的更改便持久的保存在数据库之中,并不会被回滚
 acid怎么记忆:给原子写个故事,原子一致,持久隔离(咱们原子都是一致的,是持久的隔离开的,化学中,原子在化学反应中不可分割,因此根据化学的方法来记忆)
  • NoSQL特性介绍

    • C:(Consistency)强一致性
      • 任何一个读操做老是能读取到以前完成的写操做结果,也就是在分布式环境中,多点的数据是一致的;
    • A:(Availability)高可用性
      • 每个操做老是可以在肯定的时间内返回,也就是系统随时都是可用的。
    • P:(Partition tolerance)分布式容忍性
      • 在出现网络分区(好比断网)的状况下,分离的系统也能正常运行。
  • CAP的3进2

    • CAP理论就是说在分布式存储系统中,最多只能实现上面的两点。
      而因为当前的网络硬件确定会出现延迟丢包等问题,因此分区容忍性是咱们必须须要实现的。(这个是Nosql必须具有的)

    • 因此咱们只能在一致性和可用性之间进行权衡,没有NoSQL系统能同时保证这三点

      • C:强一致性 A:高可用性 P:分布式容忍性
        • CA 传统Oracle数据库
        • AP 大多数网站架构的选择
        • CP Redis、Mongodb
    • 注:分布式架构的时候必须作出取舍。一致性和可用性之间取一个平衡。多余大多数web应用,其实并不须要强一致性。 所以牺牲C换取P,这是目前分布式数据库产品的方向。

    • 好比双十一的时候,基于用户的大数据,访问量的巨大,为了保证网站不崩掉,通常都选择,实现AP,而数据的一致性,在网站崩掉面前显得微不足道,固然不是不保证一致性,而是弱一致性加AP,这个弱一致性能够由关系型数据库实现,而AP由非关系数据库实现
    • 为啥只能三选2,而不能都选,这是由于他们之间有冲突,具体见 http://www.d1net.com/bigdata/solution/240330.html
  • 一致性与可用性的决择

    • 对于web2.0网站来讲,关系数据库的不少主要特性却每每无用武之地
    • **数据库事务一致性需求 **
      • 不少web实时系统并不要求严格的数据库事务,对读一致性的要求很低, 有些场合对写一致性要求并不高。容许实现最终一致性。
    • 数据库的写实时性和读实时性需求
       * 对关系数据库来讲,插入一条数据以后马上查询,是确定能够读出来这条数据的,可是对于不少web应用来讲,并不要求这么高的实时性,比方说发一条消息之 后,过几秒乃至十几秒以后,个人订阅者才看到这条动态是彻底能够接受的。
    • *对复杂的SQL查询,特别是多表关联查询的需求 **
       
      任何大数据量的web系统,都很是忌讳多个大表的关联查询,以及复杂的数据分析类型的报表查询,特别是SNS类型的网站,从需求以及产品设计角 度,就避免了这种状况的产生。每每更多的只是单表的主键查询,以及单表的简单条件分页查询,SQL的功能被极大的弱化了。
  • 经典CAP图

    • CAP理论的核心是:一个分布式系统不可能同时很好的知足一致性,可用性和分区容错性这三个需求,
    • 最多只能同时较好的知足两个。
    • 所以,根据 CAP 原理将 NoSQL 数据库分红了知足 CA 原则、知足 CP 原则和知足 AP 原则三大类:
      • CA - 单点集群,知足一致性,可用性的系统,一般在可扩展性上不太强大。
      • CP - 知足一致性,分区容忍必的系统,一般性能不是特别高。
      • AP - 知足可用性,分区容忍性的系统,一般可能对一致性要求低一些


  • BASE理论

    • BASE就是为了解决关系数据库强一致性引发的问题而引发的可用性下降而提出的解决方案。
    • BASE实际上是下面三个术语的缩写:
      • 基本可用(Basically Available)
      • 软状态(Soft state)
      • 最终一致(Eventually consistent)
    • 它的思想是经过让系统放松对某一时刻数据一致性的要求来换取系统总体伸缩性和性能上改观。为何这么说呢,原因就在于大型系统每每因为地域分布和极高性能的要求不可能采用分布式事务来完成这些指标,要想得到这些指标,咱们必须采用另一种方式来完成,这里BASE就是解决这个问题的办法,BASE的最终一致性是最重要的一句话,好比说双十一的时候,咱们只须要保证基本可用的一致性(称为弱一致性),A(高可用性)P(分区容错)后面这两个必须保证,然会保证AP,在双十一完了以后,开发程序员还须要去统计数据的精准,这个就是实现最终一致。

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

扩起来的这些话来自 百度百科或者是维基百科,忘了

最终一致性根据更新数据后各进程访问到数据的时间和方式的不一样,又能够区分为:

  • 因果一致性。若是进程A通知进程B它已更新了一个数据项,那么进程B的后续访问将返回更新后的值,且一次写入将保证取代前一次写入。与进程A无因果关系的进程C的访问遵照通常的最终一致性规则。
  • “读己之所写(read-your-writes)”一致性。当进程A本身更新一个数据项以后,它老是访问到更新过的值,毫不会看到旧值。这是因果一致性模型的一个特例。
  • 会话(Session)一致性。这是上一个模型的实用版本,它把访问存储系统的进程放到会话的上下文中。只要会话还存在,系统就保证“读己之所写”一致性。若是因为某些失败情形令会话终止,就要创建新的会话,并且系统的保证不会延续到新的会话。
  • 单调(Monotonic)读一致性。若是进程已经看到过数据对象的某个值,那么任何后续访问都不会返回在那个值以前的值。
  • 单调写一致性。系统保证来自同一个进程的写操做顺序执行。要是系统不能保证这种程度的一致性,就很是难以编程了。

上述最终一致性的不一样方式能够进行组合,例如单调读一致性和读己之所写一致性就能够组合实现。而且从实践的角度来看,这二者的组合,读取本身更新的数据,和一旦读取到最新的版本不会再读取旧版本,对于此架构上的程序开发来讲,会少不少额外的烦恼。

从服务端角度,如何尽快将更新后的数据分布到整个系统,下降达到最终一致性的时间窗口,是提升系统的可用度和用户体验很是重要的方面。对于分布式数据系统:

  • N — 数据复制的份数
  • W — 更新数据是须要保证写完成的节点数
  • R — 读取数据的时候须要读取的节点数

若是W+R>N,写的节点和读的节点重叠,则是强一致性。例如对于典型的一主一备同步复制的关系型数据库,N=2,W=2,R=1,则无论读的是主库仍是备库的数据,都是一致的。

若是W+R<=N,则是弱一致性。例如对于一主一备异步复制的关系型数据库,N=2,W=1,R=1,则若是读的是备库,就可能没法读取主库已经更新过的数据,因此是弱一致性。

对于分布式系统,为了保证高可用性,通常设置N>=3。不一样的N,W,R组合,是在可用性和一致性之间取一个平衡,以适应不一样的应用场景。

  • 若是N=W,R=1,任何一个写节点失效,都会致使写失败,所以可用性会下降,可是因为数据分布的N个节点是同步写入的,所以能够保证强一致性。
  • 若是N=R,W=1,只须要一个节点写入成功便可,写性能和可用性都比较高。可是读取其余节点的进程可能不能获取更新后的数据,所以是弱一致性。这种状况下,若是W<(N+1)/2,而且写入的节点不重叠的话,则会存在写冲突 

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  • 分布式+集群简介

    • 分布式:不一样的多台服务器上面部署不一样的服务模块(工程),他们之间经过Rpc/Rmi之间通讯和调用,对外提供服务和组内协做。
    • 集群:不一样的多台服务器上面部署相同的服务模块,经过分布式调度软件进行统一的调度,对外体统服务和访问。
RDBMS vs Nosql
RDBMS:
高度结构化组织化的数据
结构化的查询语言
数据和关系都存储在单独的表里,
数据操做语言,数据定义语言。
严格的一致性。
基础事务
 
Nosql:
表明的不只仅是sql(not only sql)
没有声明性的查询语言
没有预约义的模式
键值存储,列存储,文档存储,图形数据库
最终一致性,非ACID
非结构化和不可预知的数据
CAP定理
高性能,高可用强大的伸缩扩展性。
 
 
面试的时候人家会问谈谈你对redis的理解:
1》他是什么
2》用来干什么
其实就是KV cache persistence 摘抄自周阳的尚硅谷笔记
相关文章
相关标签/搜索