NoSQL 数据库介绍

Posted by Oscaner on November 11, 2018

上一篇: 《NoSQL 入门和概述》

NoSQL 数据模型简介

对比

以一个电商客户、订单、订购、地址模型来对比关系型数据库和非关系型数据库

  1. 设计传统的关系型数据库: ER图 (1:1 / 1:N / N:N,主外键等)

    7.png

  2. 设计 NoSQL: BSON

    BSON() 是一种类 json 的一种二进制形式的存储格式,简称 Binary JSON

    它和 JSON 一样,支持内嵌的文档对象和数组对象

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    
     {
       "customer": {
         "id": 1136,
         "name": "Z3",
         "billingAddress": [
           {"city": "beijing"}
         ],
         "order": {
           "id": 17,
           "customerId": 1136,
           "orderItems": [
             {"productId": 27, "price": 77.5, "productName": "thinking in php"}
           ],
           "shippingAddress": [
             {"city": "beijing"}
           ],
           "orderPayment": [
             {
               "ccinfo": "111-222-33",
               "txnid": "asdfasdf111",
               "billingAddress": {"city": "beijing"}
             }
           ]
         },
       }
     }
    
  3. 两者对比,问题和难点

    为什么上述的情况可以用聚合模型来处理?

    高并发的操作不太建议关联查询,互联网公司用冗余数据来避免关联查询

    分布式事务是支持不了太多的并发的

    如果按照 BSON ,高并发、分布式事务会变得快捷无比

聚合模型

  • KV 键值对
  • BSON
  • 列簇

    列族是按列存储数据的。最大的特点是方便存储结构化和半结构化数据,方便做数据压缩。对针对某一列或者某几列的查询有非常大的 IO 优势

    8.png

  • 图形

    9.png

NoSQL 数据库的四大分类

KV 键值对

新浪: BerkeleyDB + Redis

美团: Redis + Tair

阿里、百度: Memcached + Redis

文档型数据库

BSON 格式居多: CouchDB、MongoDB

MongoDB 是一个基于分布式文件存储的数据库,由 C++ 语言编写,为 WEB 应用提供可扩展的高性能存储解决方案。

是一个介于关系型数据库和非关系型数据库之间的产品,是非关系型数据库中功能最丰富、最像关系型数据库的一款数据库。

列存储数据库

Cassandra、HBase、分布式文件系统

图关系数据库

专注于构建关系图谱,如: 朋友圈社交网络、广告推荐系统、社交网络、推荐系统等

Neo4J、InfoGrid

四者对比

分类 Examples 典型应用场景 数据模型 优点 缺点
键值对 (KV) Tokyo、Cabinet/Tyrant、Redis、Voldemort、Oracle BDB 内容缓存,主要用于处理大数据的高并发负载,也用于一些日志系统等等 Key 指向 Value 的键值对,通常用 hash table 来实现 查找速度快 数据无结构化,通常只被当作字符串或者二进制数据
列存储数据库 Cassandra、HBase、Riak 分布式的文件系统 以列簇式存储,将同一列数据存在一起 查找速度快,可扩展性强,更容易进行分布式扩展 功能相对局限
文档型数据库 CouchDB、MongoDB WEB 应用 (与 Key-Value 类似,Value 是结构化的,不同的是数据库能够了解 Value 的内容 Key-Value 对应的键值对,Value 为结构化数据 数据结构要求不严格,表结构可变,不需要像关系型数据库一样需要预先定义表结构 查询性能不高,而且缺乏统一的查询语法
图形数据库 Neo4J、InfoGrid、Infinite Graph 社交网络,推荐系统等,专注于构建关系图谱 图结构 利用图结构相关算法,比如最短路径寻址,N度关系查找等 很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式的集群方案

CAP + BASE

传统的 ACID

关系型数据库遵循 ACID 原则

事务在英文中是 transaction,和现实世界中的交易很类似,它有如下四个特性:

  1. A (Atomicity)原子性

    事务里的所有操作要么全部做完,要么都不做,事务成功的条件是事务里的所有操作都成功,只要有一个操作失败,整个事务就失败,需要回滚。

  2. C (Consistency)一致性

    数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束

  3. I (Isolation)独立性

    事务之间不会相互影响,如果一个事务要访问的数据正在被另一个事务修改,只要另一个事务未提交,它所访问的数据就不受未提交事务的影响

  4. D (Durability)持久性

    一旦事务提交后,它所做的修改将会永久的保存在数据库上,即使出现宕机也不会丢失

CAP

  1. C (Consistency)强一致性
  2. A (Availability)可用性
  3. P (Partition tolerance)分区容错性

CAP 三进二

CAP 理论就是说在分布式存储系统中,最多只能实现上面的两点

而由于当前的网络硬件肯定会出现延迟丢包等问题,所以分区容错性是我们必须需要实现的

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

1
2
3
CA: 传统 Oracle 数据库
AP: 大多数网站架构的选择 (大数据高并发情况下先保证可用性,网站不崩溃)
CP: Redis、MongoDB

一致性和可用性之间取一个平衡,大多数 WEB 应用其实并不需要强一致性

因此牺牲 C 换取 P 达到 AP,这是目前分布式数据库产品的方向

一致性与可用性的抉择

对于 WEB2.0 网站来说,关系数据库的很多主要特性却往往无用武之地

  1. 数据库事务一致性需求

    很多 WEB 实时系统并不要求严格的数据库事务,对读一致性的要求很低,有些场合对写一致性要求并不高,允许实现最终一致性

  2. 数据库的写实时性和读实时性需求

    对关系数据库来说,插入一条数据之后立即查询,是肯定可以读出这条数据的

    但是对于很多 WEB 应用来说,并不要求这么高的实时性,比如发一条消息之后,过几秒乃至十几秒,订阅者才看到这条动态,这是完全可以接受的

  3. 对复杂的 SQL 查询,特别是多表关联查询的需求

    任何大数据量的 WEB 系统,都非常忌讳多个大表的关联查询,以及复杂的数据分析类型的报表查询,特别是 SNS 类型的网站

    从需求以及产品设计角度,为了避免这种情况的产生,往往只是单表的主键查询,以及单表的简单条件分页查询,SQL 的功能被极大的弱化

经典 CAP 图

CAP 理论的核心是: 一个分布式系统不可能同时很好的满足一致性、可用性和分区容错性这三个需求,最多只能同时较好的满足两个

因此,根据 CAP 原理将 NoSQL 数据库分成了满足 CA 原则、满足 CP 原则和满足 AP 原则三大类:

  1. CA: 单点集群,满足一致性、可用性的系统,通常在可扩展性上不太强大
  2. CP: 满足一致性、分区容错性的系统,通常性能不是特别高
  3. AP: 满足可用性、分区容错性的系统,通常对一致性要求低一些

10.png

BASE

BASE 就是为了解决由于关系数据库强一致性引发问题,从而引起可用性降低而提出的解决方案

BASE 其实是下面三个术语的缩写:

  1. 基本可用 (Basically Available)
  2. 软状态 (Soft state)
  3. 最终一致 (Eventually consistent)

它的原理是通过让系统放松对某一时刻数据一致性的要求,来换取系统整体伸缩性和性能上的改观

大型系统往往由于地域分布和极高性能的要求,不可能采用分布式事务来完成这些指标,要想获得这些指标,就必须采用另一种方式来完成,这里的 BASE 就是解决这个问题的方法

分布式 + 集群简介

分布式系统是由多台计算机和通信的软件组件通过计算机网络连接 (本地网络或广域网)组成。

分布式系统是建立在网络上的软件系统。正是因为软件的特性,分布式系统具有高度的内聚性和透明性。

因此,网络和分布式系统之间的区别更多的在于高层软件 (特别是操作系统),而不是硬件。可以应用在不同的平台上,如: PC、工作站、局域网、广域网等

通俗来讲:

  1. 分布式: 不同的多台服务器上面部署不同的服务模块 (工程),它们之间通过 RPC/RMI 通信和调用,对外提供服务和组内协作

  2. 集群: 不同的多台服务器上面部署相同的服务模块,通过分布式调度软件进行统一调度,对外提供服务和访问


本文由 Oscaner 创作, 采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外, 均为本站原创或翻译, 转载前请务必署名