上一篇: 《NoSQL 入门和概述》
NoSQL 数据模型简介
对比
以一个电商客户、订单、订购、地址模型来对比关系型数据库和非关系型数据库
-
设计传统的关系型数据库: ER图 (1:1 / 1:N / N:N,主外键等)
-
设计 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"} } ] }, } }
-
两者对比,问题和难点
为什么上述的情况可以用聚合模型来处理?
高并发的操作不太建议关联查询,互联网公司用冗余数据来避免关联查询
分布式事务是支持不了太多的并发的
如果按照 BSON ,高并发、分布式事务会变得快捷无比
聚合模型
- KV 键值对
- BSON
-
列簇
列族是按列存储数据的。最大的特点是方便存储结构化和半结构化数据,方便做数据压缩。对针对某一列或者某几列的查询有非常大的 IO 优势
-
图形
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,和现实世界中的交易很类似,它有如下四个特性:
-
A (Atomicity)原子性
事务里的所有操作要么全部做完,要么都不做,事务成功的条件是事务里的所有操作都成功,只要有一个操作失败,整个事务就失败,需要回滚。
-
C (Consistency)一致性
数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束
-
I (Isolation)独立性
事务之间不会相互影响,如果一个事务要访问的数据正在被另一个事务修改,只要另一个事务未提交,它所访问的数据就不受未提交事务的影响
-
D (Durability)持久性
一旦事务提交后,它所做的修改将会永久的保存在数据库上,即使出现宕机也不会丢失
CAP
- C (Consistency)强一致性
- A (Availability)可用性
- P (Partition tolerance)分区容错性
CAP 三进二
CAP 理论就是说在分布式存储系统中,最多只能实现上面的两点
而由于当前的网络硬件肯定会出现延迟丢包等问题,所以分区容错性是我们必须需要实现的
因此,我们只能在 一致性 和 可用性 之间进行权衡,没有 NoSQL 系统能同时保证这三点
1
2
3
CA: 传统 Oracle 数据库
AP: 大多数网站架构的选择 (大数据高并发情况下先保证可用性,网站不崩溃)
CP: Redis、MongoDB
一致性和可用性之间取一个平衡,大多数 WEB 应用其实并不需要强一致性
因此牺牲 C 换取 P 达到 AP,这是目前分布式数据库产品的方向
一致性与可用性的抉择
对于 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 就是解决这个问题的方法
分布式 + 集群简介
分布式系统是由多台计算机和通信的软件组件通过计算机网络连接 (本地网络或广域网)组成。
分布式系统是建立在网络上的软件系统。正是因为软件的特性,分布式系统具有高度的内聚性和透明性。
因此,网络和分布式系统之间的区别更多的在于高层软件 (特别是操作系统),而不是硬件。可以应用在不同的平台上,如: PC、工作站、局域网、广域网等
通俗来讲:
-
分布式: 不同的多台服务器上面部署不同的服务模块 (工程),它们之间通过 RPC/RMI 通信和调用,对外提供服务和组内协作
-
集群: 不同的多台服务器上面部署相同的服务模块,通过分布式调度软件进行统一调度,对外提供服务和访问
本文由
Oscaner
创作, 采用
知识共享署名4.0
国际许可协议进行许可
本站文章除注明转载/出处外, 均为本站原创或翻译, 转载前请务必署名