任务描述:认识分布式数据库,掌握分布式数据库与关系数据库之间的区别,了解分布式数据库的发展过程。
在分布式系统的设计中,数据之间的复制同步是一个需要重点考虑的问题。假设客户端C1将系统中的一个值Value由V1更新为V2,此时客户端C2不能立即读取到Value的最新值,而是需要一定的时间之后才能读取到最新值。正是由于数据库复制之间存在时延,所以数据复制所带来的一致性挑战也是每一个系统研发人员不得不面对的。
所谓分布一致性问题,是指在分布式环境中引入数据复制机制之后,不同数据节点之间可能出现的、无法依靠计算机应用程序自身解决的、数据不一致的情况。数据一致性是指在对一个副本数据进行更新的时候,必须确保其他数据副本也能得到更新,否则不同副本的数据将会不一致。
如何解决上述问题?一种思路是既然是由于时延动作引起的问题,那可以先阻塞写入动作,直到数据复制完成后,再完成写入动作。这似乎能解决问题,而且有一些系统的架构也确实直接使用了这个思路,但这个思路在解决一致性问题的同时,又带来了新的问题:写入性能的降低。若应用场景有非常多的写请求,则后续的写请求都将会被阻塞在前一个请求的写操作上,这会导致系统整体性能急剧下降。
总的来说,我们无法找到一种能够满足分布式系统所有属性的分布式一致性问题的解决方案。因此,如何既保证数据的一致性,同时又不影响系统运行的性能,是每一个分布式系统都需要重点考虑和权衡的。
CAP 理论是一个经典的分布式系统理论。CAP 理论的主要思想为:一个分布式系统不可能同时满足一致性(Consistency,C)、可用性(Availability,A)和分区容错性(Partition Tolerance,P)这3个基本需求,最多只能同时满足其中2个需求,如图1-11所示。
图1-11 CAP理论的主要思想
(1)一致性(C)
一致性是指更新操作成功后,所有节点在同一时间的数据完全一致。从客户端角度来看,一致性问题主要指多个用户并发访问时更新的数据如何被其他用户获取的问题。从服务端角度来看,一致性问题指用户在进行数据更新时如何将数据复制到整个系统,以保证数据一致的问题。一致性是在并发读/写时才会出现的问题,因此在理解一致性问题时,一定要注意结合考虑并发读/写的场景。
(2)可用性(A)
可用性是指用户访问数据时,系统是否能在正常响应时间内返回结果。好的可用性主要是指系统能够很好地为用户服务,不出现用户操作失败或者访问超时等用户体验不好的情况。在通常情况下,可用性与分布式数据冗余、负载均衡等有着很大的关联关系。
(3)分区容错性(P)
分区容错性是指分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务。
分区容错性和扩展性紧密相关。在分布式应用中,一些故障(如节点故障或网络故障)可能会导致系统无法正常运行。分区容错性高指在部分节点出现故障或传输中出现丢包的情况下,分布式系统仍然能提供服务,完成数据的访问。分区容错可理解为系统中采用了多副本策略。
(4)CA(CAP 无P)
如果不要求分区容错性,即不允许分区,则强一致性和可用性是可以保证的。其实分区是始终存在的问题,因此满足CA的分布式系统更多的是允许分区后各子系统依然满足CA。
(5)CP(CAP 无A)
不要求可用性相当于每个请求都需要在各服务器之间强一致,而分区容错性会导致同步时间无限延长,在这种情况下,CP 是可以保证的。很多传统数据库的分布式事务属于这种模式。
(6)AP(CAP 无C)
如果要可用性高并允许分区,则需放弃一致性。一旦分区发生,节点之间就可能会失去联系。为了实现高可用性,每个节点只能用本地数据提供服务,而这会导致全局数据的不一致。
具体应用中可根据实际情况进行权衡,或者在软件层面提供不同的配置方式,由用户决定选择哪种CAP模式。CAP理论可用于不同的层面,也可以根据具体情况制订局部模式,例如,在分布式系统中,每个节点自身的数据能够满足CA的,但整个系统上要满足AP或CP。
BASE 是指基本可用(Basically Available)、软状态(Soft State)和最终一致性(Eventually Consistent)。BASE理论是对CAP理论中一致性和可用性进行权衡的结果,是对大规模互联网系统分布式实践的总结。BASE理论的核心思想是:即使无法做到强一致性,每个应用也可以根据自身业务的特点,采用适当的方式来使系统达到最终一致性。接下来我们介绍BASE理论中的三要素。
(1)基本可用
基本可用是指分布式系统在出现不可预知故障的时候,允许损失部分可用性,例如响应时间的损失和系统功能的损失。响应时间的损失指正常情况下一个查询结果需要在0.5 s内响应给用户,但由于出现故障,响应时间可以增加1~2 s。系统功能的损失指正常情况下,电商平台可以完成消费者每一笔订单流程,但是在消费者购物行为激增的高峰日期,为了保护系统的稳定性,部分消费者可能会被引导至一个降级页面。
(2)软状态
软状态指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程存在时延。
(3)最终一致性
最终一致性强调的是所有的数据副本在经过一段时间的同步之后,最终都能够达到一个一致的状态。由此可知,最终一致性的本质是需要系统保证数据最终能够达到一致,而不需要实时保证数据的强一致性。
总的来说,BASE 理论面向的是大型高可用可扩展的分布式系统,这和传统的事物ACID特性是相反的。它完全不同于ACID的强一致性模型,而是通过牺牲强一致性来获得可用性,并允许数据在一段时间内不一致,最终达到一致状态即可。在实际的分布式应用场景中,不同业务单元和组件对数据一致性的要求是不同的,因此在具体的分布式系统架构设计过程中,ACID特性和BASE理论往往又会结合在一起。
关系数据库最大的特点是事务处理,即满足ACID特性,强调数据的可靠性、一致性和可用性,即同一个事务内的所有操作要么执行成功要么执行不成功,所有用户看到的数据完全一致。ACID的含义如下。
原子性(Atomicity):事务中的操作要么都做,要么都不做。
一致性(Consistency):系统必须始终处在强一致状态下。
隔离性(Isolation):一个事务的执行不能被其他事务所干扰。
持续性(Durability):一个已提交的事务对数据库中数据的改变是永久性的。
然而,若CAP中的一致性、可用性、分区容错性不能够同时得到满足,只能够对一致性或可用性进行取舍。分区容错性(P)的特性一定要保留,所以只能在一致性和可用性上考虑。当放弃可用性(A)时,系统需要满足一致性。当数据被别人操作或数据节点出现异常时,系统就必须等待,这时无法满足可用性。当放弃一致性(C)时,系统需要满足比较高的可用性。短时间内系统不需要做到数据的一致性,最终会在其他节点同步完成后使数据保持一致。总的来说,放弃一致性的CAP为BASE模式,放弃可用性的CAP为ACID模式。
大数据需要通过分布式的集群方式来解决存储和访问的问题。本小节将从分布式的角度来介绍数据库的数据管理。分布式系统的核心理念是让多台服务器协同工作,完成单台服务器无法处理的任务,尤其是高并发或者数据量大的任务。分布式数据库是数据库技术与网络技术相结合的产物,通过网络技术将物理上分开的数据库连接在一起,实现逻辑层上的集中管理。在分布式系统中,一个应用程序可以对数据库进行透明操作,数据库中的数据被存储在不同场地的数据库中,由不同机器上的数据库管理系统进行管理。分布式数据库的体系结构如图1-12所示,其中,R 表示一个逻辑上的整体(对外展示的分布式数据库),S表示一个具体的场地(如S1可以理解为一台服务器)。
图1-12 分布式数据库的体系结构
关系数据库起源于1970年代,其基本功能主要有两个:①把数据存储下来;②满足用户对数据的计算需求。在关系数据库发展的早期阶段,这两个功能其实不难实现,而且出现了很多优秀的商业关系数据库产品,如 Oracle、DB2。在1990年之后,开源数据库MySQL和PostgreSQL出现了。这些数据库不断地提升单机实例性能,再加上遵循摩尔定律的硬件性能提升规律,往往能够很好地支撑业务发展。
随着互联网的不断普及,特别是移动互联网的兴起,数据规模呈爆炸式增长,而硬件性能的提升速度却不如以前,人们开始担心摩尔定律会失效。在这种情况下,单机数据库越来越难以满足用户需求,即使是将数据保存下来这个最基本的需求也无法满足。
2005年左右,人们开始探索分布式数据库,掀起了NoSQL数据库这波浪潮。分布式数据库首先要解决的问题是单机上无法保存全部数据,以 HBase、Cassandra、MongoDB为代表的分布式数据库很好地解决了这个问题。为了实现容量的水平扩展,这些数据库往往要放弃事务,或者是只提供简单的 K-V 接口。存储模型的简化为存储系统的开发带来了便利,但是降低了对业务的支撑水平。
分布式数据库处理使用分而治之的办法来解决大规模数据的管理问题,这种方式有以下几个特点。
(1)数据分布的透明管理
在分布式系统中,数据不是存储在同一个场地上,而是存储在计算机网络所覆盖的多个场地上。这些数据在逻辑上是一个整体,被所有用户共享,并由一个数据库管理系统统一管理。用户访问数据时无须指出数据存储在哪里,也无须知道由分布式系统中的哪台服务器来完成相关操作。
(2)复制数据的透明管理
分布式数据库中数据的复制有助于提高性能,易于协调不同而又冲突的用户需求。同时,当某台服务器出现故障时,此服务器上的数据在其他服务器上还有备份,从而提高了系统的可用性。这种多副本的方式对于用户来说是透明的,即不需要用户知道副本的存在,而是由系统进行副本的统一管理、协调和调用。
(3)事务的可靠性
分布式数据处理具有冗余性,因而消除了单点故障的隐患,即系统中一台或多台服务器发生的故障不会使整个系统瘫痪,这提高了系统的可靠性。但是,在分布式系统中,事务是并发的,即不同用户可能在同一时间对同一数据源进行访问,这要求系统支持分布式的并发控制,并能保证系统中数据的一致性。
分布式系统可以解决海量数据的存储和访问问题,但是在分布式环境下,数据库会遇到更为复杂的问题,举例如下。
① 数据在分布式环境下以多个副本的方式进行存储,那么在为用户提供数据访问时,系统如何选择一个副本,或者当用户修改了某一副本的数据时,系统中的其他副本如何得到更新?
② 如果所有副本信息正在更新,某台服务器因网络或硬/软件功能出现问题而发生故障,那么在这种情况下,当故障恢复时,如何确保此服务器上的副本与其他副本一致?
上述问题给分布式数据库管理系统的设计与开发带来了挑战,也是分布式系统固有的复杂性的体现。相对于分布式数据库管理系统的设计与开发,对分布数据的管理、控制数据之间的一致性以及数据访问的安全性更为重要。
NoSQL 数据库并没有统一的模型,常见的包括键值数据库、列族数据库、文档数据库和图数据库。NoSQL数据库的分类和特点如表1-1所示,具体如下。
表1-1 NoSQL数据库的分类和特点
(1)列族数据库
列族数据库通常用于分布式存储所对应的海量数据。键(Key)仍然存在,但是它们的特点是指向了多个列。从图1-13中可以看出,列族数据库中的每一行都有关键字Row Key,并由多个列族组成,即Super Column Family中的Super Column 1和Super Column 2。每个列族由多个列组成。
图1-13 列族数据库示例
(2)文档数据库
文档数据库的灵感来自Lotus Notes办公软件,它与键值数据库类似。该类型的数据模型是版本化的文档,文档以特定的格式(如 JSON)存储。文档数据库可以看作键值数据库的升级版,允许键值之间嵌套键值,如图1-14所示。文档数据库比键值数据库的查询效率更高,因为文档数据库不仅可以根据键创建索引,同时还可以根据文档内容创建索引。
图1-14 文档数据库示例
(3)键值数据库
这一类数据库主要使用散列表,该表中有一个特定的键和一个指针指向特定的数据。对于信息系统来说,键值模型的优势在于简单、易部署。键值数据库可以按照键对数据进行定位,还可以通过对键进行排序和分区来实现更快速的数据定位。键值数据库的详细概念可参照相关内容介绍的Redis进行理解。
(4)图数据库
图数据库来源于图论中的拓扑学,通过节点、边及节点之间的关系来存储复杂网络中的数据,如图1-15所示。这种拓扑结构类似实体联系图(Entity Relationship Diagram, E-R图),在图形模式中,关系和节点本身就是数据。而在E-R图中,关系描述的是一种结构。
图1-15 图数据库示例