数据库系统由用户、数据库应用程序、数据库管理系统(DataBase Management System,DBMS)(如MySQL,SQL Server)和数据库(Database,DB)组成。
数据库根据不同的逻辑模型分为3种:层次型、网状型和关系型。
NoSQL主要存储的是非结构化和半结构化的数据。其主要特点为:
- 灵活的数据模型:可以存储各种各样的数据类型。
- 可伸缩性强:NoSQL数据库是分布式的、横向扩展的,当数据库服务器无法满足数据存储和数据访问的需求时,可增加多台服务器,将用户请求分散到多台服务器上,减少单台服务器的性能瓶颈出现的可能性。
- 自动分片。NoSQL数据库支持自动分片,自动在多台服务器上分发数据,不需要应用程序增加额外的操作。
- 自动复制。NoSQL数据库支持自动复制。在NoSQL数据库分布式集群中,服务器会自动对数据进行备份,将一份数据复制到多台服务器上。因此,当用户访问同一数据时,可以将用户请求分散到多台服务器上。同时,若某台服务器出现故障,其他服务器的数据可以提供备份,即NoSQL数据库的分布式集群具有高可用性与灾备恢复能力。
CAP定理(CAP theorem),它指出对于一个 分布式计算系统 来说,不可能同时满足以下三点:
- Consistency(一致性): 所有节点在同一时间具有相同的数据。
- Availability(可用性):保证每个请求不管成功或者失败都有响应(也就是只要收到用户的请求,服务器都要在合理的时间内给出合理的响应)。
- Partition tolerance(分区容错):系统中任意信息的丢失或失败不会影响系统的继续运作(也就是分布式系统遇到任何网络分区故障时,仍然可以对外提供一致性、可用性的服务)。
因此,根据CAP原理将NoSQL数据库分成了满足CA原则、满足CP原则和满足AP原则三大类:
- CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。比如传统的Oracle数据库。
- CP - 满足一致性,分区容错性的系统,通常性能不是特别高。比如Redis、MongoDB。
- AP - 满足可用性,分区容错性的系统,通常可能对一致性的要求低一些,满足最终一致性即可。大多数网站架构的选择。
Consistency 和 Availability 的矛盾 一致性和可用性,为什么不可能同时成立?答案很简单,因为可能通信失败(即出现分区容错)。
假设数据库一和数据库二同时为客户端服务,这两个库的数据是一致的。
如果保证 数据库二 的一致性,那么数据库一必须在写操作时,锁定 数据库二 的读操作和写操作。只有数据同步后,才能重新开放读写。锁定期间,数据库二 不能读写,没有可用性不。如果保证 数据库二 的可用性,那么势必不能锁定 数据库二,所以一致性不成立。综上所述,数据库二 无法同时做到一致性和可用性。系统设计时只能选择一个目标。如果追求一致性,那么无法保证所有节点的可用性;如果追求所有节点的可用性,那就没法做到一致性。
综上所述,由于网络的原因,肯定会出现延迟和丢包等问题,所以:分区容错性(Partition tolerance)是我们必须要实现的。所以只能在一致性和可用性之间进行权衡,没有NoSQL系统能同时保证这三点。
事务在英文中是 transaction,和现实世界中的交易很类似,它有如下四个特性:
- A(Atomicity)原子性 原子性很容易理解,也就是说事务里的所有操作要么全部做完,要么都不做,事务成功的条件是事务里的所有操作都成功,只要有一个操作失败,整个事务就失败,需要回滚。比如银行转账,从A账户转100元至B账户,分为两个步骤:1)从A账户取100元:2)存入100元至B账户。这两步要么一起完成,要么一起不完成,如果只完成第一步,第二步失败,钱会莫名其妙少了100元。
- C(Consistency)一致性 一致性也比较容易理解,也就是说数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束。
- I(Isolation)独立性 所谓的独立性是指并发的事务之间不会互相影响。如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务未提交,它所访问的数据就不受未提交事务的影响。比如现有有个交易是从A账户转100元至B账户,在这个交易还未完成的情况下,如果此时B查询自己的账户,是看不到新增加的100元的。
- D(Durability)持久性 持久性是指一旦事务提交后,它所做的修改将会永久的保存在数据库上,即使出现岩机也不会丢失。
BASE是Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)三个短语的简写。BASE是对CAP中一致性和可用性权衡的结果,是基于CAP定理逐步演化而来的,其核心思想是即使无法做到强一致性,但每个应用都可以根据自身的业务特点,采用适当的方法来使系统达到最终一致性。BASE中的三要素如下:
基本可用 基本可用是指分布式系统在出现不可预知故障的时候,允许损失部分可用性但仍然基本可用。例如:
-
响应时间上的损失:正常情况下,一个在线搜索引擎需要在0.5秒之内返回给用户相应的查询结果,但由于出现故障(比如系统部分机房发生断电或断网故障),查询结果的响应时间增加到了1-2秒。
-
功能上的损失:正常情况下,在电商平台上购物,消费者完全能够顺利地完成每一笔订单。但在双十一期间,由于消费者的购物行为激增,为了保护系统核心功能的可用性,通常会采取服务降级的策略,比如关闭评论等非核心功能。
软状态 软状态是指允许系统中的数据存在中间状态,但不会影响系统的整体可用性,即允许不同节点副本之间存在暂时的不一致的情况。
最终一致性 强调系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性。
最终一致性是一种特殊的弱一致性:系统能够保证在没有其他新的更新操作的情况下,数据最终一定能够达到一致的状态,因此所有客户端对系统的数据访问都能够获取到最新的值。同时,在没有发生故障的前提下,数据到达一致状态的时间延迟,取决于网络延迟、系统负载和数据复制方案设计等因素。
BASE理论面向的是大型高可用可扩展的分布式系统,和传统事务的ACID特性使相反的,它完全不同于ACID的强一致性模型,而是提出通过牺牲强一致性来获得可用性,并允许数据在一段时间内是不一致的,但最终达到一致状态。但同时,在实际的分布式场景中,不同业务单元和组件对数据一致性的要求是不同的,因此在具体的分布式系统架构设计过程中,ACID特性与BASE理论往往又会结合在一起使用。
分类 | 相关产品 | 应用场景 | 数据模型 | 优点 | 缺点 |
---|---|---|---|---|---|
键值数 据库 | Redis、Memcached、Riak | 内容缓存,如会话、配 置文件、参数等;频繁读写、拥有简单数据模型的应用 | <key,value>键值对,通过散列表来实现 | 扩展性好,灵活性好,大量操作 时性能高 | 数据无结构化,通常 只被当作字符串或者二进制数据,只能通过键来查询值 |
列族数 据库 | Bigtable、 HBase | 分布式数据存储与管理 | 以列族式存储,将同一列数据存在一起 | 可扩展性强,查找速度快,复杂 性低 | 功能局限,不支持事 务的强一致性 |
文档数 据库 | MongoDB、CouchDB | Web应用,存储面向文 档或类似半结构化的数 据 | <key,value> value是JSON结构 的文档 | 数据结构灵活,可以根据value构建索引 | 缺乏统一查询语法 |
图数据库 | Neo4j、InfoGrid | 社交网络、推荐系统, 专注构建关系图谱 | 图结构 | 支持复杂的图形算法 | 复杂性高,只能支持 一定的数据规模 |
《NoSQL数据库原理与应用》王爱国 许桂秋主编