NoSQL 数据库简介
in SQL with 0 comment, Views is 50

NoSQL 数据库简介

in SQL with 0 comment, Views is 50

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

NoSQL 数据模型简介

对比

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

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

7.png

设计 NoSQL:BSON

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

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

{
    "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"}
                }
            ]
        ],
    }
}

两者对比,问题和难点

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

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

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

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

聚合模型

1、KV 键值对

2、BSON

3、列簇

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

8.png

4、图形

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、MongoDBWEB 应用(与 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 系统能同时保证这三点

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 原则三大类:

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

10.png

BASE

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

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

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

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

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

分布式 + 集群简介

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

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

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

通俗来讲:

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

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

Responses
选择表情