跳转至

并发模型

1.简介

数据库的Process Model指的是如何组织Worker并发地处理任务,其中单机意义下的Worker可以指进程或线程、分布式意义下的Worker可以指处理节点。

本节讨论数据库如何利用并发提高任务处理的效率、如何拆分任务、拆分数据以及I/O并发。

2.并发模型

数据库的单机Worker主要有两种,基于进程和基于线程。

在基于进程的Worker下,当数据库收到新的请求时,它可以利用fork或进程池对请求进行处理。

进程的任务分配依赖于操作系统,进程与进程之间利用共享内存等机制进行数据共享,且进程之间具有天然的隔离性。

进程的切换开销较大,且调度依赖于操作系统,因此更常见的方式是基于线程。

更轻量的上下文切换,系统可以自行掌控线程的任务分配方式,同时其天然地共享同一进程的空间,减少了系统调用的开销,都使得基于线程的Worker拥有更高的效率。

我们可以并发地处理多个任务,这称之为Inter-Query。而通过拆分任务然后并发地处理该任务的子任务,称之为Intra-Query。

3.Inter-Query

如果任务进行的操作都是只读的,那么任务之间不会相互影响,只需要顺序执行即可。

然而,一旦涉及写入的操作,那么任务和任务之间就需要进行协调。

这部分内容是事务与并发事务控制的讨论重点。

4.Intra-Query

主要思想是对任务进行拆分,最简单的方式为对任务的输入进行拆分,如利用两个线程同时构建Grace Hash Join的两个哈希表、在顺序扫描时不同的线程扫描其中一部分区域等。

有三种形式的拆分:

  • 水平拆分:将同一操作下的任务拆分为互不相关的片段。

15445-7

  • 垂直拆分:指的Worker并发地处理不同的操作。类似生产者-消费者模型,父节点自旋等待来自子节点的数据,这就会造成一定程度的并发协调开销。

15445-8

  • Bushy Parallelism:垂直拆分的扩展,一个Worker可以同时处理多个不同的操作。

这些拆分并不是互斥的,实际上可对它们进行组合对任务进行处理。

5.并发磁盘I/O

由于木桶效应,磁盘数据库的速度主要取决于磁盘。常见的优化方式是采用多个磁盘,这样就可以从多个磁盘中并发读取数据,从而实现横向扩展。

然而,如果所需的数据都在同一磁盘上,读取速率仍然取决于单个磁盘。因此,需要对数据库进行拆分。

常见的分区方法有:

  • 基于数据库的分区
  • 基于表的分区
  • 基于行的分区
  • 基于列的分区:类似列式存储。

这里的分区讨论的是存储粒度,分配方法又可以利用Hash、Robin Round等算法进行分配。