1. Overview
前面介绍的都是基于单个Worker(如进程、线程)的查询树执行方式,本节主要介绍查询树的并发执行(线程).
并发执行查询树可以降低延时(因为单个任务的处理时间变少了),降低系统响应时长,提高吞吐率和可用性.
并行数据库与分布式数据库有许多相似之处,资源都不是集中的,区别在于资源的可靠性和通信的成本不同,分布式数据库的资源之间跨越不同物理机器,由于经过网络传输的原因,资源可靠性低且网络开销大.
本节首先介绍几种并行处理模型,然后包括执行并行和I/O并行的问题.
2. Process Model
并行处理模型有以下三种方式:Worker/进程,Worker/进程池,Worker/线程池.
Worker/进程指一个进程单独处理负责一个Worker的任务.
Worker/进程模型中,对于每个Worker,调度器(Dispatcher)都fork一个单独的进程处理. 这种方式出现在早期多线程技术不成熟的年代. 进程之间通过共享内存实现资源共享,相比线程间的调度这种方式不灵活而且资源开销大.
Worker/进程池模型每个任务由进程池负责处理,进程池中的进程可以协调共同处理任务(例如任务数目很多或者计算量很大),但进程的管理需要依赖操作系统,灵活性较差.
Worker/线程池模型任务由线程池内的线程处理,DBMS自己负责线程的调度,更加灵活且轻量.
多线程并发相比多进程并发上下文切换代价低,线程间共享资源也相比进程间共享资源要方便.
3. Execution Parallelism
执行并行类型分为 Inter 和 Intra ,Inter 指的是多个Query间的并发,用于提高系统整体吞吐。Intra 指的是单个Query内的并发,用于提高单个查询的性能.
若Inter并发的多个Query都是只读操作,那么并发不需要特殊处理.
Intra 类型并发基于生产者-消费者模型实现单个Query内不同算子之间的并发(主要通过流水线).
下图所示的是一种 Inter 类型并发的例子,由于Hash函数的特性,编号相同的bucket之间可以并发处理Grace Hash Join.
相应地,Query内 Intra 并发也有三种方式,即(Intra)水平、(Inter)垂直和Bushy(和水平相似)
通过将数据分成多个fragment(片),每个片上运行相同的算子实现类似Intra类型的并发,最后通过一个exchange汇总所有的执行结果.
例如下面的例子中,exchange汇总在三个片上并行执行的结果.
这里面可以套上前一节介绍的查询处理模型(例如火山模型),上层调用Next()后下面在不同分片上并发执行.
exchange支持以下三种模式,上面的例子是简单地将数据搜集起来(Gather)
更复杂的一个水平并发的例子(注意现在为止不同算子之间的处理依然是阻塞的):
为避免一个算子的阻塞导致下一个算子空闲,Query内的Inter类型并发是让不同算子之间进行流水线处理数据.
Bushy模式和Intra模式类似,不同片上的多个子Query之间的并行.
4. I/O Parallelism
I/O瓶颈也是决定系统性能的一个重要因素,因此需要避免多线程并发读写时的I/O墙.
常用的方法根据执行内容对磁盘进行相应的分区或者冗余存储(这些对于DBMS而言是透明的,磁盘知道Page和物理地址相应的映射关系),提高磁盘的整体存取性能.
RAID 0 设计是具有所有RAID级别中最高的存储性能,把连续的数据分散到多个磁盘上存取,片之间无数据冗余,系统有数据请求就可以被多个磁盘并行的执行,每个磁盘执行属于它自己的那部分数据请求。这种数据上的并行操作可以充分利用总线的带宽,显著提高磁盘整体存取性能。
RAID 1 通过磁盘数据镜像实现数据冗余,在成对的独立磁盘上产生互为备份的数据。当原始数据分片繁忙时,可直接从镜像拷贝中读取数据,因此RAID 1可以提高读取性能。RAID 1是磁盘阵列中单位成本最高的,但提供了很高的数据安全性和可用性。当一个磁盘失效时,系统可以自动切换到镜像磁盘上读写,而不需要重组失效的数据。
从DBMS层面也有数据分片方案,再DBMS中我们对数据进行逻辑划分,例如一些数据库支持通过软/硬连接将数据映射到磁盘空间上.
逻辑划分后的不同子表存储在不同物理分片上,然而这对于应用层而言又是透明的.
划分方式包括垂直划分和水平划分两种,垂直划分好处例如属性相同的列可以压缩存储,可以利用列式存储优势等.
水平划分是最常见的划分方式,以tuple为单位对表进行划分.
5. 总结
关注我的微信订阅号,交流数据管理与分布式系统相关技术:
|