NoSQL 简单介绍

来源:互联网 发布:linux exp continue 编辑:程序博客网 时间:2024/05/22 05:15
1.入门概述:
(1) 互联网时代背景下大机遇,为什么用NoSQL (NoSQL 缘由)。
     ① 单机MySQL 的美好年代,数据量的大小,数据的索引内存,访问量等任一不能承受。
     ② Memcached( 缓存服务器)+MySQL+ 垂直拆分
     ③ Mysql 主从读写分离<主从复制 读写分离>
     ④ 分表分库 + 水平拆分+mysql 集群
     ⑤ MySQL 的扩展性瓶颈
      MySQL数据库也经常存储一些大文本字段,导致数据库表非常的大,在做数据库恢复的时候就导致非常的慢,不容易快速恢复数据库。比如1000万4KB大小的文本就接近40GB的大小,如果能把这些数据从MySQL省去,MySQL将变得非常的小。关系数据库很强大,但是它并不能很好的应付所有的应用场景。MySQL的扩展性差(需要复杂的技术来实现),大数据下IO压力大,表结构更改困难,正是当前使用MySQL的开发人员面临的问题。
     ⑥ 为什么使用NoSQL?
      今天我们可以通过第三方平台(如:Google,Facebook等)可以很容易的访问和抓取数据。用户的个人信息,社交网络,地理位置,用户生成的数据和用户操作日志已经成倍的增加。我们如果要对这些用户数据进行挖掘,那SQL数据库已经不适合这些应用了, NoSQL数据库的发展也却能很好的处理这些大的数据。

(2) 是什么NoSQL?
     NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,
     泛指非关系型的数据库NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题,包括超大规模数据的存储,这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。

(3) NoSQL 能干嘛?
     ① 易扩展:去掉关系数据库的关系型特性,数据之间无关系,这样就非常容易扩展。
     ② 大数据量高性能:NoSQL数据库具有非常高的读写性能,尤其在大数据量下,同样表现优秀,这得益于它的无关系性,数据库的结构简单。
     ③ 多样灵活的数据模型:NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式,而在关系数据库里,增删字段是一件非常麻烦的事情.
      ④ 传统RDBMS VS NOSQL
RDBMS/关系型数据库NoSQL/非关系型数据库
高度组织化结构化数据
结构化查询语言(SQL)
数据和关系都存储在单独的表中。
数据操纵语言,数据定义语言
严格的一致性
基础事务
代表着不仅仅是SQL
没有声明性查询语言
没有预定义的模式
键 - 值对存储,列存储,文档存储,图形数据库
最终一致性,而非ACID(事务)属性
非结构化和不可预知的数据
CAP定理(分布式设计的一些理念)
高性能,高可用性和可伸缩性

2.3V+3高
大数据时代的3V互联网需求的3高
海量Volume
多样Variety
实时Velocity
高并发
高可扩
高性能

3.当下的NoSQL经典应用:
     当下的应用是SQL和NoSQL一起使用,1688的中文网站就是nosql的经典应用。

4.NoSQL数据模型简介
     以一个电商客户、订单、订购、地址模型来对比下关系型数据库和非关系型数据库。
(1) 传统的关系型数据库:

(2) 非关系型数据库:
          ① 什么是BSON:BSON() 是一种类json的一种二进制形式的存储格式,简称Binary JSON,它和JSON一样,支持内嵌的文档对象和数组对象。
          ② 用BSON 画出构建的数据模型
{ "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】 特点
聚合数据模型的特点就是把经常访问的数据放在一起(聚合在一块); 
这样带来的好处很明显,对于某个查询请求,能够在与数据库一次交互中将所有数据都取出来; 
当然,以这种方式存储不可避免的会有重复,重复是为了更少的交互;
     【3】缺点
          聚合结构对某些交互有利,却阻碍另一些交互; 
         比如:以学生学号聚合学生信息(含学生姓名、班级、年龄、等信息,甚至英语学科成绩),通过学号查询时,能够在一次交互中查询出该学生的所有信息,但如果想通过学生姓名来查询,就很困难;
          不支持跨越多个聚合的ACID事务 
         聚合结构在事务方面的支持有限;有一些NOSQL产品实现了简单的事务支持,但对于跨越多个聚合结构的事务并不完善;
     【4】聚合模型:KV键值  Bson  列族 图形

5.NoSQL数据库的四大分类
(1) KV 键值:典型介绍
     新浪: BerkeleyDB+redis
     美团: redis+tair
     阿里、百度: memcache+redis
(2) 文档型数据库 (bson 格式比较多) :典型介绍
     CouchDB
     MongoDB
     MongoDB 是一个基于分布式文件存储的数据库 ,是一个介于关系数据库和非关系     数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
(3) 列存储数据库:分布式文件系统:Cassandra, HBase
(4) 图关系数据库:它不是放图形的,放的是关系:朋友圈社交网络、广告推荐系统社交网络,推荐系统等,专注于构建关系图谱:Neo4J, InfoGrid
(5) 四者对比:


6.在分布式数据库中CAP原理CAP+BASE:
(1) 传统的ACID分别是什么
A (Atomicity) 原子性
C (Consistency) 一致性
I (Isolation) 独立性
D (Durability) 持久性
(2) CAP
C:Consistency(强一致性)
A:Availability(高可用性)
P:Partition tolerance(分区容错,容忍性)
(3) CAP的3进2
     CAP就是说在分布式存储系统中,最多只能实现上面的两点,而由于当前的网络硬件肯定会出现延迟丢包等问题,所以分区容忍性是我们必须需要实现的,所以我们只能在一致性和可用性之间进行权衡,没有NoSQL系统能同时保证这三点。
     C:强一致性  A:高可用性  P:分布式容忍性
     CA :传统Oracle数据库
     AP :大多数网站架构的选择
     CP : Redis、Mongodb
     注意:分布式架构的时候必须做出取舍,一致性和可用性之间取一个平衡。多余大多数web应用,其实并不需要强一致性,因此牺牲C换取A,这是目前分布式数据库产品的方向。
(4) 经典CAP图:
     CAP理论的核心:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个,因此,根据 CAP 原理将 NoSQL 数据库分成了满足 CA 原则、CP 原则 和 AP 原则三 大类:
     CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。
     CP - 满足一致性,分区容忍必的系统,通常性能不是特别高。
     AP - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。

(5) BASE:BASE就是为了解决关系数据库强一致性引起的问题而引起的可用性降低而提出的解决方案。典型应用:阿里11.11,京东6.18。
     BASE其实是下面三个术语的缩写:
     基本可用(Basically Available)
     软状态(Soft state)
     最终一致(Eventually consistent)
     它的思想是通过让系统放松对某一时刻数据一致性的要求来换取系统整体伸缩性和性能上改观。为什么这么说呢,缘由就在于大型系统往往由于地域分布和极高性能的要求,不可能采用分布式事务来完成这些指标,要想获得这些指标,我们必须采用另外一种方式来完成,这里BASE就是解决这个问题的办法。

7.集群,分布式,负载均衡 简单理解:
(1) 集群和分布式的理解:
     分布式:不同的多台服务器上面部署不同的服务模块,他们之间通过Rpc/Rmi之间通信和调用,对外提供服务和组内协作(一个业务分拆多个子业务,部署在不同的服务器上)。
     集群:不同的多台服务器上面部署相同的服务模块,通过分布式调度软件进行统一的调度,对外提供服务和访问(同一个业务,部署在多个服务器上)。
    说明1:分布式是指将不同的业务分布在不同的地方。 而集群指的是将几台服务器集中在一起,实现同一业务。
              分布式中的每一个节点,都可以做集群。 而集群并不一定就是分布式的。
    举例1:
             就比如新浪网,访问的人多了,他可以做一个群集,前面放一个响应服务器,后面几台服务器完成同一业务,如果有业务访问的时候,响应服务器看哪台服务器的负载不是很重,就将给哪一台去完成;而分布式,从窄意上理解,也跟集群差不多, 但是它的组织比较松散,不像集群,有一个组织性,一台服务器垮了,其它的服务器可以顶上来;分布式的每一个节点,都完成不同的业务,一个节点垮了,哪这个业务就不可访问了。
    说明2:简单说,分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率。
    举例2:
             如果一个任务由10个子任务组成,每个子任务单独执行需1小时,则在一台服务器上执行该任务需10小时,采用分布式方案,提供10台服务器,每台服务器只负责处理一个子任务,不考虑子任务间的依赖关系,执行完这个任务只需一个小时。(这种工作模式的一个典型代表就是Hadoop的Map/Reduce分布式计算模型)
             而采用集群方案,同样提供10台服务器,每台服务器都能独立处理这个任务。假设有10个任务同时到达,10个服务器将同时工作,1小时后,10个任务同时完成,这样,整身来看,还是1小时内完成一个任务!
(2) 集群和负载均衡的理解:
     集群就是在多个应用服务(如:Tomcat)前端设一个前端控制器,负责请求的接收和转发,多数是起到一个分流的作用,把压力分散到每一个应用服务上
     负载均衡就是在集群的基础上前端控制器尽量可以做到对每一个应用服务的请求平衡,负载均衡,顾名思义,就是尽量把压力平均分配到每一个应用服务 ,其实对于分散压力的应用,可以理解为一个概念,做集群的目的就是分流,如果不平均也没有起到一个好的分流效果,如果做了集群,而负载不均衡,所有的压力还是在其中一个服务上,这样也是没有起到分散压力的效果。
(3) 几点说明:
     ① 负载均衡不一定是平均将压力分流到所有服务器,有可能会根据这些服务器的承受能力分担不同的压力。
     ② 集群也不是只会用Apache。Apache通常是作为应用服务器的集群的前端。而集群并不局限于Web服务器。很多应用都可以做集群,如数据库、缓存服务器、消息队列等等。