CMU 15-445 -- Introduction to Distributed Databases - 19

CMU 15-445 -- Introduction to Distributed Databases - 19

  • 引言
  • System Architecture
    • Shared Memory
    • Shared Disk
    • Shared Nothing
  • Early Distributed Database Systems
  • Design Issues
    • Homogeneous VS. Heterogeneous
  • Database Partitioning
    • Naive Table Partitioning
    • Horizontal Partitioning
  • Transaction Coordination
    • Centralized Coordinator
      • TP Monitor
      • Middleware
    • Decentralized Coordinator
    • Distributed Concurrency Control
  • Conclusion


引言

本系列为 CMU 15-445 Fall 2022 Database Systems 数据库系统 [卡内基梅隆] 课程重点知识点摘录。


当我们在谈论分布式数据库时,首先要明确什么是分布式系统:如果通信成本和通信的可靠性问题不可忽略,就是分布式系统。这也是区分 Parallel DBMS 和 Distributed DBMS 的依据所在

Parallel DBMSsDistributed DBMSs
不同节点在物理上隔得很近不同节点在物理上可能隔得很远
不同节点通过高速局域网连接不同节点通过普通公共网络相连接
通信成本很小,基本不会产生问题通信成本和通信问题不可忽略

那么如何利用我们在这节课中介绍的单节点 DBMS 的知识,构建支持事务的 Distributed DBMS 呢?之前讨论过的很多话题:

  • Optimization & Planning
  • Concurrency Control
  • Logging & Recovery

在分布式环境下都可能遇到新的挑战。


System Architecture

Distributed DBMS 的系统架构主要指的是在哪一层上共享资源,主要分为以下 4 种:

在这里插入图片描述
实际上 Shared Everything 就没有分布式可言了,因此严格来说,只有 Shared Memory、Shared Disk 和 Shared Nothing 三种。


Shared Memory

在 Shared Memory 架构下,不同的 CPU 通过网络访问同一块内存空间,每个 CPU 中都能看到所有内存数据结构,每个 DBMS 实例都知道其它实例的所有情况。这种架构实际上只出现在一些大型机上,在云原生环境下几乎见不到。


Shared Disk

在 Shared Disk 架构下,不同的 CPU 通过网络访问同一块逻辑磁盘,但各自都有自己的内存空间。这种架构的好处就是计算和存储可以独立扩容,坏处就是 CPU 之间需要通过更多的通信来传递数据和元信息。采用这种架构的数据库有很多,罗列如下图所示:

在这里插入图片描述
主要以云厂商为主,因为它们已经搭建好了稳定、成熟、可伸缩的存储服务,基于此构建 Shared Disk 架构的 Distributed DBMS 符合整体生态和分层设计理念。但 Shared Disk 的坏处在于 DBMS 对存储层没有控制权,无法决定数据的分布,因此在查询数据时无法达到最优的性能。

一个 Shared Disk 的 Distributed DBMS 举例如下:

在这里插入图片描述
假设有两个计算节点,客户端想要获取 Id 为 101 的数据,它可以从任意计算节点访问。如果计算节点不足时,可以按需扩容:
在这里插入图片描述
但如果客户端想要修改某条数据:

在这里插入图片描述
由于其它节点可能正缓存着 Page ABC,更新节点需要通过某种方式通知其它节点 Page ABC 已经被修改。由于既有的统一存储层不会再增加这样一层 Pub/Sub 逻辑,那么这种更新传播的逻辑就必须在计算层实现,且我们无法假设节点间的网络通信是可靠的,这也是 Shared-Disk 架构需要考虑的重要问题。


Shared Nothing

Shared Nothing,顾名思义,每个 CPU 都拥有独立的内存、磁盘,节点之间仅通过网络通信共享消息。这种架构下,扩容和保证一致性的难度将变得很大。扩容时,DBMS 需要在不同节点间迁移、均衡数据,同时要保证服务在线,且数据一致,可以想象其复杂性。但解决这个难题带来的好处也很可观,整个 DBMS 的性能将得到提升,因为数据库可以控制存储层本身,就能够独立根据数据的局部性原理排列数据,从而最大程度上减少每次查询所消耗的通信成本。

使用 Shared Nothing 架构的数据库有很多,罗列如下:

在这里插入图片描述
一个 Shared Nothing 的 Distributed DBMS 需要将数据分片到不同的节点上,每个节点拥有整个数据库的一小部分,如果查询所需的数据只落在一个节点上,就与单节点数据库无二,如下图所示:

在这里插入图片描述
ID 为 1-150 之间的数据落在上面的节点,151-300 之间的数据落在下面的节点。像“哪个节点存储哪些范围的数据”这样的信息会有一个配置中心来存储。如果客户端要查询 Id=200 的数据,那么只需要访问下面的节点即可。如果客户端要同时获取 Id=10 和 Id=200 的数据,事情就会变得更复杂一些:

在这里插入图片描述
如上面的节点接收到请求,那么它要么将请求转发给下面的节点,要么从下面的节点读取响应的数据,然后在内部同时处理两个请求,这里就有一些设计决定需要做。如果 DBMS 的容量不够,就需要做在线扩容:

在这里插入图片描述

这时候需要对外透明地将上下两个节点中的一部分数据迁移到中间节点,平衡所有节点的数据,这里也有许多问题需要解决。


Early Distributed Database Systems

事实上,分布式数据库并不是新概念。早在 1979 年,Andy Pavlo 的导师 Michael Stonebraker 就开发了 Muffin 数据库,即 Ingress 的分布式版本;SDD-1 (1979) 是 Phil Bernstein 在分布式数据库上的原型系统,并没有真正在正式环境中使用,但许多关于分布式事务的观点和论文都是 Phil 基于 SDD-1 提出的;System R* (1984) 是 IBM Research 的内部项目,是 System R 的分布式版本,但并没有进入市场,然而后继者 DB2 实际上有相应的分布式版本;Gamma (1986) 是 Dewitt 实现的高性能分布式数据库;NonStop SQL 是 Jim Gray 基于高容错系统设计的一款分布式数据库系统,也是上述系统中唯一进入商用的系统,现在仍然运行在许多大型金融系统中。

Design Issues

刚才已经提到 Distributed DBMS 的系统架构以及可能遇到的问题,本节就来讨论这些设计问题:

  • 应用如何获取数据?
  • 如何在分布式数据库上执行查询?
    • Push query to data
    • Pull data to query
  • DBMS 如何保证正确性?

Homogeneous VS. Heterogeneous

如果系统中的每个节点角色、权限相同,那就是同质节点 (Homogeneous Node);如果不同,就是异质节点。同质节点方案中,每个节点可以执行的任务集合是相同的,只是持有的数据不同,在处理扩容和故障恢复时比较简单;异质节点方案中,每个节点有各自的节点类型,可以执行的任务不同,允许在一个物理节点运行多个虚拟节点,执行不同任务。

以 MongoDB 为例:

在这里插入图片描述
在 MongoDB 集群中有 3 种角色,Router、Config Server 以及 Shard。所有请求都打到 Router 上,Router 从 Config Server 中获取路由信息,即哪些数据存放在哪些分片上,然后根据这些路由信息将请求发送到对应的分片上执行。

Distributed DBMS 的用户不应该知道数据具体存储的地点,或者数据表本身是如何分片和复制的,对于用户来说,一个 SQL 在 Distributed DBMS 上运行的效果应该和在单节点 DBMS 上运行的效果等价。


Database Partitioning

既然要做 Distributed DBMS,势必要将数据库的资源分布到多个节点上,如磁盘、内存、CPU,这就是广义的分片,Partitioning 或 Sharding。DBMS 需要在各个分片上执行查询的一部分,然后将结果整合后得到最终答案。本节我们来关注数据如何在磁盘上分片。

Naive Table Partitioning

假设单个节点有足够的容量存储单张表,我们可以简单地让每个节点只存储一张表:

在这里插入图片描述
如果只存在单表查询,这种方案是最理想的。但问题也很多,如数据分布不均匀,只能在应用层做 Join 等等。


Horizontal Partitioning

第二种就是我们常用的横向分片,将一张表的数据切分成多个不相交的子集。这种分片方式要求 DBMS 要找到在大小、负载上能均匀分配的键。常用的分片方案如下:

  • Hash Partitioning:计算哈希值后分片
  • Range Partitioning:直接按号段分片

具体的分片案例如下:

在这里插入图片描述
对于这种分片方案,最理想的查询就是按 partitionKey 来点查数据。常用的 Hash Partitioning 算法就是一致性哈希 (Consistent Hashing):
在这里插入图片描述
在 Shared Nothing 架构下,通常是物理分片:

在这里插入图片描述
在 Shared Disk 架构下,通常是逻辑分片:
在这里插入图片描述


Transaction Coordination

对于 Distributed DBMS 来说,如果一个写事务只涉及单个节点上的数据,那 DBMS 无需关心在其它节点上并发执行的事务状态;如果涉及多个节点数据,就需要去协调多个节点上的事务执行方案,即所谓的 Transaction Coordination,后者主要有两种方案:中心化 (Centralized) 和去中心化 (Decentralized)。

Centralized Coordinator

TP Monitor

  • 实现 Centralized Coordinator 的其中一种思路就是构建一个独立的组件负责管理事务,叫 Transaction Processing Monitor,即 TP Monitor。
  • TP Monitor 与其之下运行的单节点 DBMS 无关,DBMS 无需感知 TP Monitor 的存在。
  • 每次应用在发送事务请求时,需要先通过 TP Monitor 确认事务是否可以执行。

举例如下:

  • 假设一个 DBMS 有 4 个分片,应用需要通过一个事务修改 P1、P3、P4 上的数据,首先需要从 Coordinator 上请求 P1、P3、P4 的锁,

在这里插入图片描述

拿到锁后,应用就可以到 P1、P3、P4 上修改数据 (未提交),修改完毕后再向 Coordinator 发送 Commit 请求,Coordinator 询问各个分片刚才的修改是否可以安全地提交,可以就提交,然后 Coordinator 返回 Ack:

在这里插入图片描述
许多数据库厂商也出售类似 TP Monitor 的产品,如 Apache Omid、IBM Transac 等等。


Middleware

实现 Centralized Coordinator 的另一种方案是 Middleware,对于应用来说,Middleware 就是 Distributed Database 本身,Middleware 负责与后面的所有分片交互,协调事务的执行。如下图所示:

在这里插入图片描述
Facebook 运行着世界上最大的 MySQL 集群,采用的就是这种方案。它们的 Middleware 负责处理分布式事务、路由、分片等所有逻辑。


Decentralized Coordinator

Decentralized Coordinator 的基本思路就是,执行某个事务时,会选择一个分片充当 Master,后者负责询问涉及事务的其它分片是否可以执行事务,完成事务的提交或中止:

在这里插入图片描述


Distributed Concurrency Control

分布式并发控制的难度在于:

  • Replication
  • Network Communication Overhead
  • Node Failures
  • Clock Skew

举个例子,假如我们要实现分布式的 2PL:

在这里插入图片描述

A 数据在 Node 1 上,B 数据在 Node 2 上,因为没有中心化的角色存在,一旦发现如上图所示的死锁,双方都不知道是应该中止还是继续等待。从这个例子我们可以看出将并发控制升级到分布式并发控制,有许多问题要解决。


Conclusion

本节我们了解了 Distributed DBMS 的皮毛,也看到了实现它的难度。有一个 Jepsen Project,它设置了一系列分布式事务测试用例,来验证市面上的系统是否真如其声明的那样可靠。即便是 MongoDB、TiDB 这些数据库的一些版本都被验证无法提供它们声明的保证。

本节对应教材PDF

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/68086.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Grafana技术文档--基本安装-docker安装并挂载数据卷-《十分钟搭建》

阿丹: Prometheus技术文档--基本安装-docker安装并挂载数据卷-《十分钟搭建》_一单成的博客-CSDN博客 在正确安装了Prometheus之后开始使用并安装Grafana作为Prometheus的仪表盘。 一、拉取镜像 搜索可拉取版本 docker search Grafana拉取镜像 docker pull gra…

数字万用表测量基础知识--DMM的显示位数

概览 DMM(即数字万用表)是一种电气测试和测量仪器,可测量直流和交流信号的电压、电流和电阻。本文介绍如何正确使用和理解数字万用表(DMM)。 DMM的显示位数 数字万用表(DMM)可用于进行各种测量。在选择DMM或理解所使用的DMM时,首…

Lecoode有序数组的平方977

题目建议: 本题关键在于理解双指针思想 题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 文章讲解:代码随想录 视频讲解: 双指针法经典题目 | LeetCode:977.有序数组的平方_哔哩…

linux配置上网 linux adsl拨号上网设置

Linux里面配置ADSL上网是件很麻烦的事。但配置完成之后就能开机自动拨号上网,可谓十分的方便。支持的系统有Redhat,CentOS,SuSE,FreeBSD,Ubuntu等常见的Linux。 工具/原料 ADSL网络,电信,网通,移动等常见宽带。 Linux系统的安装光…

06-4_Qt 5.9 C++开发指南_MDI应用程序设计

文章目录 1. MDI简介2. 文档窗口类 QFormDoc 的设计3. MDI主窗口设计与子窗口的使用3.1 主窗口界面设计3.2 MDI子窗口的创建与加入3.3 QMdiArea 常用功能函数3.4 MDI的信号 4. 源码4.1 qwmainwindow.h4.2 qwmainwindow.cpp 1. MDI简介 传统的应用程序设计中有多文档界面(Multi…

VBA技术资料MF42:VBA_从Excel中上面的单元格复制公式

【分享成果,随喜正能量】唯有梦想才配让你不安,唯有行动才能解除你的不安.绳锯木断,水滴石穿。也许你现在做的事情很小,只要你能日积月累的坚持下去,才会发现意义非凡。所谓的成功,便是别人失败的时候你还在…

windows永久关闭更新

不要去services.msc 服务里面关闭windowUpdata了,对win11和部分win10根本不管用,下面在教你一招永久关闭(原理不是关闭,只是延长更新时间,时间可以设置百年后,所以和关闭差不多) windows图形化…

手撕数据结构之栈+例题

目录 一、栈的概念及结构 二、栈的头文件及基本框架 三、接口实现 1、对栈的初始化 2、栈的销毁 3、入栈操作 4、出栈操作 5、判断栈是否为空 6、返回栈顶元素 7、遍历栈 四、有效的括号 - 力扣(LeetCode) 题目描述: 思路&#xff…

QT自带PDF库的使用

QT自带PDF库可以方便的打开PDF文件,并将文件解析为QImage,相比网上提供的开源库,QT自带PDF库使用更方便,也更加可靠,然而,QT自带PDF库的使用却不同于其他通用库的使用,具备一定的技巧。 1. 安装…

Session与Cookie的区别(五)

储存状态的方式 小明的故事说完了,该来把上面这一段变成网络的实际案例了。其实在网络世界中问题也是一样的。 前面已经提到过我们会把状态存在 Cookie 里面,让 Request 之间能够变得有关联。 假设我们今天要来做一个会员系统,那我要怎么知道…

UML箭头汇总

参考:http://www.cnblogs.com/damsoft/archive/2016/10/24/5993602.html 1.UML简介 Unified Modeling Language (UML)又称统一建模语言或标准建模语言。 简单说就是以图形方式表现模型,根据不同模型进行分类,在UML 2.0中有13种图&#xff…

青大数据结构【2015】

一、单选 二、简答 5.如果一组关键字,以不同的次序输入后建立起来的二叉排序树是否相同?当中序遍历这些二叉排序树时,其遍历的结果是否相同?为什么? 不同,因为输入次序不同,所放置的位置与上一…

idea打开多个项目需要开多个窗口(恢复询问弹窗)

【版权所有,文章允许转载,但须以链接方式注明源地址,否则追究法律责任】【创作不易,点个赞就是对我最大的支持】 前言 仅作为学习笔记,供大家参考 总结的不错的话,记得点赞收藏关注哦! 使用…

【C++】异常exception

文章目录 1. C语言中传统的处理错误方法2. C中的异常3. 异常的使用3.1 异常的抛出和捕获3.2 异常的重新抛出3.3 异常安全3.4 异常规范 4. 自定义异常体系5. 异常的优缺点 📝 个人主页 :超人不会飞)📑 本文收录专栏:《C的修行之路》…

拥抱创新:用Kotlin开发高效Android应用

拥抱创新:用Kotlin开发高效Android应用 引言 在当今数字时代,移动应用已经成为人们生活中不可或缺的一部分。无论是社交媒体、电子商务还是健康管理,移动应用已经深刻地影响了我们的生活方式。随着移动设备的普及和功能的增强,A…

无涯教程-Perl - endpwent函数

描述 此功能告诉系统您不再希望使用getpwent从密码文件读取条目。在Windows下,使用Win32API::Net函数从域服务器获取信息。 语法 以下是此函数的简单语法- endpwent返回值 此函数不返回任何值。 例 以下是显示其基本用法的示例代码- #!/usr/bin/perlwhile(($name, $pas…

vr虚拟仿真消防模拟演练提升受训者的安全观念和防范技能

纵观多年来的火灾事故教训得知,火灾发生的原因复杂多样,仅采取单一教育形式无法达到预期效果。消防安全重在预防,VR消防模拟演练系统将火灾安全问题,经采集和汇集处理,以可视化的形式在安全培训平台上进行实时展现&…

Elasticsearch同时使用should和must

问题及解决方法 must和should组合查询,should失效。使用must嵌套查询,将should组成的bool查询包含在其中一个must查询中。 SearchRequest request new SearchRequest(); request.indices("function_log");SearchSourceBuilder sourceBuilde…

Linux C 语言 mosquitto 方式 MQTT 发布消息

1 说明 采用 mosquitto 库,实现对主题发布消息。 其中服务器有做限制,需要对应的 cilent id ,cafile 、certfile 、keyfile 等配置 2 开发环境 采用ubuntu 直接编译调试 安装mosquitto 库 sudo apt install libmosquitto-dev sudo apt-ge…

Linux 上安装部署Nacos

标题:在Linux上安装和部署Nacos Nacos是一个开源的分布式服务发现和配置管理平台,它可以帮助开发人员实现微服务架构中的服务注册、发现和动态配置管理。 步骤1:准备工作 在开始安装Nacos之前,确保您已经具备以下条件&#xff1…