分布式数据库系统,是指将物理上分散存放在计算机网络中多个节点上的数据,在逻辑上作为一个统一的整体进行管理和使用的数据库系统。这个定义里有三个关键词需要拆开理解:物理上分散、逻辑上统一、网络连接。物理分散意味着数据不再像集中式数据库那样存放在一台服务器的一块磁盘里,而是分散在若干台地理位置不同的计算机上;逻辑统一意味着对上层应用和最终用户而言,这若干个节点上的数据仍然表现为一个完整的、一体化的数据库,用户不需要关心数据到底存放在哪一台机器上;网络连接则是维系这两者之间的桥梁,各节点之间依靠计算机网络实现数据交换与协调。
教材对分布式数据库的正式表述通常强调两个基本特征,一是分布性,二是逻辑整体性。分布性回答的是数据存放在哪里的问题,逻辑整体性回答的是用户如何使用这些数据的问题。这两者缺一不可:如果一个系统只是把几台数据库服务器简单堆在一起,各自独立对外服务,彼此之间没有统一的全局视图,那它只能算作多个集中式数据库的物理叠加,并不构成真正意义上的分布式数据库系统。反过来,如果一个系统逻辑上高度统一,但数据只存在一台机器上,那它仍然是集中式数据库。只有同时满足数据分散存储与全局统一视图两个条件,才称得上是分布式数据库。
从考试命题的角度看,分布式数据库系统有四个特征最常被考到,分别是数据独立性、集中与自治相结合的控制结构、适当增加数据冗余度,以及全局的一致性、可串行性和可恢复性。数据独立性是集中式数据库已经具备的性质在分布式环境下的延伸,它要求数据在物理存储上的分布方式、冗余副本的多少,都不影响应用程序的逻辑写法。集中与自治相结合的控制结构,是分布式数据库区别于纯集中式与纯分布式的重要分水岭:系统既要有全局统一的数据字典和事务协调机制,又要允许每个局部站点保留对自己本地数据的一定自主权,这就是后面会反复出现的本地自治性概念的来源。
适当增加数据冗余度这一条,很多考生会感到困惑,因为集中式数据库设计的第一课就是强调减少冗余、避免数据不一致。分布式数据库却反其道而行之,刻意保留一定程度的冗余副本,目的是换取系统的高可用性和查询的局部化。当某个站点发生故障时,其他站点上的冗余副本可以继续提供服务,使系统不至于整体瘫痪,这就是可用性;当用户频繁访问的数据在本地就有副本时,就不必跨网络去远程站点取数,这就是局部化带来的性能收益。当然,冗余的代价是维护副本一致性的开销随之上升,所以教材用的是适当二字。最后一个特征全局的一致性、可串行性和可恢复性,讲的是分布式环境下事务处理必须遵守的底线,它直接引出了两阶段提交协议这个重头戏,本文后半部分会详细展开。
理解分布式数据库,最关键的抓手是它的模式结构。集中式数据库采用外模式、概念模式、内模式三级模式加两级映像的结构,而分布式数据库在这个基础上又增加了若干层级。教材普遍采用的一种划分,是把分布式数据库的模式结构描述为六层,自顶向下依次是全局外模式、全局概念模式、分片模式、分布模式、局部概念模式和局部内模式。
全局外模式是全局应用的用户视图,它是全局概念模式的子集,不同用户看到的是不同的局部视图。全局概念模式是整个分布式数据库中所有数据的全局逻辑结构定义,它把所有站点的数据在逻辑上整合成一个整体,使得用户使用数据时如同数据没有分布一样。这个层级的存在,正是逻辑整体性的具体体现。分片模式定义全局概念模式中的数据如何被分割成若干逻辑片段,以及这些片段与全局关系之间的映射。分布模式则进一步定义每个逻辑片段被分配到哪个物理站点上,即片段与站点的对应关系。局部概念模式描述每个站点本地数据的逻辑结构,局部内模式则描述本地数据的物理存储。
这里有一个考生极容易混淆的点:分片模式和分布模式虽然都带一个分字,但解决的问题不同。分片模式回答的是数据如何被切开,分布模式回答的是切开的每一块放到哪里去。前者是逻辑上的分割,后者是物理上的分配。把它们当成一回事,是历年选择题里最典型的丢分方式。理解这六层结构之后,四种透明性就顺理成章了,因为每一种透明性本质上都是某一层结构对上层应用屏蔽了某一类细节。
数据分片是分布式数据库实现分布性的核心手段。所谓分片,就是把一个全局关系按照某种规则水平地或垂直地切割成若干片段,每个片段可以独立地分配到不同的站点。分片必须满足三个基本条件:完备性、可重构性和不相交性。完备性要求全局关系中的每一条数据都必须属于某一个片段,不能有遗漏;可重构性要求通过这些片段能够重新无损地拼回原来的全局关系,不能有信息丢失;不相交性则针对水平分片而言,要求同一条数据不能被重复分配到多个片段里,除非是刻意为之的冗余。
水平分片是按照元组来切分,把一张表的若干行分到不同站点,相当于把一张大表按行拆成若干小表。垂直分片则是按照属性来切分,把一张表的若干列分到不同站点,相当于把一张宽表按列拆成若干窄表。这两种基本方式还可以组合成混合分片,即先水平分片再对某个片段做垂直分片,或者反过来。此外还有一种导出分片,它不是直接按自身字段来切分,而是依据另一个关系与该关系的关联来推导片段,常用于两个关系之间存在主外键联系的场景。
分片的本质是把全局关系转化为若干可独立存放的片段,而分片透明性就是让上层应用感觉不到这种切割的存在。用户依然像操作一张完整表一样操作全局关系,系统负责在底层把对全局关系的操作自动映射到对各片段的操作上。理解了分片机制,就能理解为什么分片透明性是四种透明性里层次最高、也最难实现的一种。
四种透明性分别是分片透明性、位置透明性、局部数据模型透明性和复制透明性,它们是软考分布式数据库考点中出题频率最高的部分。要彻底掌握这四种透明性,不能死记硬背定义,而要理解它们各自屏蔽的是哪一层细节。
分片透明性位于最高层次,它指用户或应用程序完全不需要知道全局关系是如何被分片的,对用户而言数据就像没有分布一样。用户在写查询语句时,面对的是完整的全局关系,系统内部自动完成从全局关系到片段、再到具体站点的路由。位置透明性比分片透明性低一层,它指用户或应用程序不需要知道数据存放在哪个物理站点上。这里要特别注意分片透明性与位置透明性的区别:位置透明性意味着用户知道数据被分片了、知道有片段这回事,只是不知道片段放在哪里;而分片透明性连分片这件事本身都不让用户知道。分片透明性天然包含了位置透明性,反过来则不成立。
局部数据模型透明性,也叫逻辑透明性,指用户或应用程序不需要知道每个局部站点使用的是哪种数据模型。分布式数据库的各个站点可能采用不同的数据库产品,有的站点是关系模型,有的站点可能是其他模型,局部数据模型透明性就是屏蔽这种异构性,让全局应用统一用关系模型来访问。复制透明性则指用户不需要知道数据的冗余副本存放在哪些站点、副本之间如何保持一致。复制透明性往往与位置透明性配合,因为副本的存放本身也是一种位置问题,但它额外涉及了副本更新的一致性问题,所以单独列为一类。
把四种透明性排个序:分片透明性最高,位置透明性次之,局部数据模型透明性又次之,复制透明性与位置透明性大致相当。这个层次关系在选择题中反复出现,命题人最喜欢把四种透明性打乱顺序,让考生判断哪一种是最高层次的透明性,或者判断某一句描述对应的是哪一种透明性。
从应用角度看,水平分片、垂直分片、混合分片和导出分片各有适用的场景和边界条件。水平分片最常见的场景是按地域、按时间或按业务范围切分,比如一个全国性的信息系统可以按省份把客户数据分到各省的站点上,这样每个省的站点在本地就能完成对本省客户的大部分查询,实现查询的局部化。水平分片的边界条件是分片键的选择,分片键选得好,数据分布均匀、查询局部化程度高;分片键选得差,容易出现数据倾斜,导致某个站点负载过重。
垂直分片适用于表结构很宽、而不同业务只关心其中一部分字段的场景。把经常一起访问的字段放在同一个站点,可以减少跨站点的连接操作。垂直分片的代价是当一次查询需要同时涉及多个片段时,必须做跨站点的连接,而分布式连接的开销远高于本地连接。混合分片结合了
本篇完!