EagleBear2002 的博客

这里必须根绝一切犹豫,这里任何怯懦都无济于事

CMU 数据库系统-分布式数据库导论

分布式 DBMS

可以使用单节点 DBMS 的构建块来支持分布式环境中的事务处理和查询执行。 设计分布式 DBMS 的一个重要目标是使其具有容错性(即,避免单个节点故障导致整个系统瘫痪)。

并发数据库:

  • 节点在物理上彼此靠近。
  • 节点通过高速 LAN(快速、可靠的通信结构)连接。
  • 假设节点之间的通信成本很小。 因此,在设计内部协议时无需担心节点崩溃或数据包丢失。

分布式数据库:

  • 节点可能彼此远离。
  • 节点可能通过公共网络连接,这可能很慢且不可靠。
  • 通信成本和连接问题不容忽视(即节点可能崩溃,并且包可能会丢失)。

系统架构

DBMS 的系统架构指定 CPU 可以直接访问哪些共享资源。它会影响 CPU 相互协调的方式以及它们在数据库中检索和存储对象的位置。

单节点 DBMS 使用所谓的共享一切架构。该单个节点在具有自己的本地内存地址空间和磁盘的本地 CPU 上执行工作程序。

共享内存

CPU 可以通过快速互连访问公共内存地址空间。 CPU 也共享同一个磁盘。实际上,没有人这样做,因为这是在操作系统/内核级别提供的。它会导致问题,因为每个进程的内存范围是相同的内存地址空间,可以被多个进程修改。每个处理器都有所有内存数据结构的全局视图。处理器上的每个 DBMS 实例都必须“了解”其他实例。

共享磁盘

所有 CPU 都可以通过互连直接读取和写入单个逻辑磁盘,但每个 CPU 都有自己的私有内存。这种方法在基于云的 DBMS 中更为常见。

DBMS 的执行层可以独立于存储层进行扩展。添加新的存储节点或执行节点不会影响其他层中数据的布局或位置。节点必须在它们之间发送消息以了解其他节点的当前状态。也就是说,由于内存是本地的,如果数据被修改,在数据块在其他 CPU 的主内存中的情况下,必须将更改传达给其他 CPU。

节点有自己的缓冲池,被认为是无状态的。节点崩溃不会影响数据库的状态,因为它单独存储在共享磁盘上。存储层在崩溃的情况下保持状态。

无共享

每个节点都有自己的 CPU、内存和磁盘。节点仅通过网络相互通信。

在这种架构中增加容量更加困难,因为 DBMS 必须将数据物理地移动到新节点。确保 DBMS 中所有节点的一致性也很困难,因为节点必须在事务状态上相互协调。然而,优点是无共享 DBMS 可以潜在地实现更好的性能,并且比其他类型的分布式 DBMS 架构更有效。

设计问题

一些需要考虑的设计问题将在以后的讲座中更深入地介绍:

  • 应用程序如何查找数据?
  • 应该如何对分布式数据执行查询?是否应该将查询推送到数据所在的位置?
  • 还是应该将数据集中到一个公共位置以执行查询?
  • DBMS 如何确保正确性?

要做出的另一个设计决策涉及在现代系统中使用的同构节点异构节点之间做出决定:

同构

集群中的每个节点都可以执行相同的任务集(尽管可能在不同的数据分区上),从而很好地适用于无共享架构。这使得配置和故障转移“更容易”。失败的任务分配给可用节点。

异构

节点被分配了特定的任务,因此节点之间必须进行通信才能执行给定的任务。可以允许单个物理节点为专用任务托管多个“虚拟”节点类型。可以独立地从一个节点扩展到另一个节点。

分区方案

跨多个资源拆分数据库,包括磁盘、节点、处理器。这个过程有时在 NoSQL 系统中称为分片。 DBMS 在每个分区上执行查询片段,然后组合结果以生成单个答案。不应要求用户知道数据的物理位置以及表是如何分区或复制的。在单节点 DBMS 上运行的 SQL 查询应该在分布式 DBMS 上同样运行。

我们希望选择一种分区方案,使单节点事务或仅访问包含在一个分区上的数据的事务最大化。这允许 DBMS 不需要协调在其他节点上运行的并发事务的行为。另一方面,分布式事务访问一个或多个分区上的数据。这需要昂贵且困难的协调,将在下一节中讨论。对于逻辑分区节点,特定节点负责从共享磁盘访问特定元组。对于物理分区的节点,每个无共享节点读取和更新它包含在自己本地磁盘上的元组。

实现方式

朴素表分区:每个节点存储一个表,假设给定节点有足够的存储空间。这是每个要实现的,因为查询只是路由到特定的分区。这可能很糟糕,因为它不可扩展。如果经常查询一个表而不使用所有可用节点,则可能会耗尽一个分区的资源。

水平分区:将表的元组拆分为不相交的子集。选择在大小、负载或使用方面平均划分数据库的列,称为分区键。DBMS 可以通过散列分区或范围分区对数据库进行物理分区(无共享)或逻辑分区(共享磁盘)。

分布式并发控制

如果 DBMS 支持多操作和分布式事务,我们需要一种方法来协调它们在系统中的执行。

协调者

这是一种集中式方法,具有协调所有行为的全局“交通警察”。客户端与协调器通信以获取客户端想要访问的分区上的锁。 一旦收到来自协调器的确认,客户端就会将其查询发送到这些分区。

一旦完成对给定事务的所有查询,客户端就会向协调器发送提交请求。 协调器然后与事务中涉及的分区进行通信,以确定是否允许事务提交。

中间件

这与集中式协调器相同,只是所有查询都直接发送到中间件层。

去中心化

在分散的方法中,节点自行组织。 客户端直接向其中一个分区发送查询。 此主分区会将结果发送回客户端。 主分区负责与其他分区进行通信并相应地提交。

在多个客户端尝试获取同一分区上的锁的情况下,集中式方法会成为瓶颈。 它对于分布式 2PL 可能更好,因为它具有锁的中央视图并且可以更快地处理死锁。 这对于分散的方法来说并非易事。