IBM
2003 年 7 月
不管您会怎么想,MPP 不一定代表“大规模的采购价格”。您可以通过在单个便携式电脑上使用 DB2 for Linux 来探究大规模并行处理(MPP)数据库技术。本文描述了如何设置模拟的 MPP 环境以及如何创建分区表。
请阅读本文,或者直接跳到下面的 安装指示信息。
什么是 MPP,我应该怎么用 Linux 计算机来构成 MPP?
大规模并行处理(massively parallel processing,MPP)是使许多廉价计算机在一起工作以解决大问题的关键。某些类别的问题是很难分成小块然后转交给机器群集来处理的,幸运的是,关系数据库适用于并行化。
分区和群集是数据库可伸缩性的关键。现在,您可以先从低成本技术来着手实现,这反驳了 “MPP 等于大规模的采购价格(massive purchase price)”的观点。本文将向您演示如何在您的便携式电脑上使 DB2® Extended Enterprise Edition(EEE)V7.2 在 Linux 上运行起来。然后,我们将探究如何在单个计算机上设置两个数据库分区(称为多个逻辑节点)以及如何在这些节点之间创建分区表。
虽然本文使用的环境是 DB2 EEE V7.2,但是对于使用 DB2 V8 企业版的用户也有借鉴作用,基本过程没有太大差别。
以上就是花费数百万美元构成的计算机群集处理 DB2 EEE 中数据的方式。但是,单个 CPU 机器也可以运行多个节点,并模拟构成计算机群集。
并行群集多重处理是计算领域一项非常激动人心的领域,现在学习分区和群集知识是为将来使用做好准备的主要方法。
并行数据库的历史和技术
MPP 数据库技术的完全简史并行数据库的最初成功设计之一要回溯到 1986 年,请参阅[ Dewitt 1986]。经历了一段时间之后,直到二十世纪九十年代中期这些数据库才成为商业实体 — UNIX® 平台上的产品。MPP 数据库与 Linux 的结合在 2001 年首次战胜了商业数据仓库基准程序。基于低成本 Intel 的硬件、IBM 的 DB2 EEE 和 Linux 的结合被用于完成 TPC-H 数据仓库基准程序。
并行数据库是如何工作的?使多台计算机同时处理同一问题的方法主要有两种。
- 无共享并行体系结构
- 分布式锁(共享磁盘)并行体系结构
无共享并行体系结构
“无共享(shared nothing)”体系结构意味着每台计算机都有它自己的 CPU、内存和磁盘。计算机通过高速互连被连接在一起,如 图 1 所示。当处理查询时,每个节点处理其本地表中的行,然后将节点的部分结果回传给协调程序节点。协调程序将来自所有节点的所有结果合并成最终结果集。节点不一定是独立的计算机 — 在单个计算机上可以存在多个分区。
图 1. 无共享体系结构
高速互连对于任何计算机群集(不管是不是数据库的)性能都至关重要。请参阅有关该主题的 我的前一篇 DB2 开发者园地文章,以了解当从 100 兆位交换器更改为 10 兆位集线器时对群集关系数据库产生的性能影响。目前的互连技术 Infiniband 要比 100 兆位快得多,它所提供的性能在 500 MB/秒到 6 GB/秒之间,这样的带宽绰绰有余。
分布式锁(共享磁盘)并行体系结构
共享磁盘体系结构( 图 2)使用锁管理器在计算机之间作出仲裁,这些计算机都访问一个公共磁盘池。这种体系结构在原理上是有缺陷的,因为当节点数增加时,群集会沉溺于锁请求中。速度较快的硬件隐藏了大量的错误,但即使在每个节点上使用锁高速缓存,该方法也不能违背物理规律,并且如果没有特定硬件来完成在 DB2 for z/OS™ 上使用 Parallel Sysplex® 技术实现的作业,它将无法伸缩。
图 2:运用锁管理器的共享磁盘方法无法伸缩该环境中的数据库访问要求每个节点都在共享磁盘上请求一块数据。如果另一个节点已经锁定该数据准备更新,那么正在请求的节点必须等待正在更新的节点完成。这种环境容易发生“死锁”的锁情况。节点 1 锁定资源 A 并请求资源 B。节点 2 锁定资源 B 并请求对资源 A 的锁定。这两个节点都不释放它们的锁,所以它们一直等待下去。
无共享环境中的数据分区您已经知道群集中的每个节点都处理它的本地数据,然后将其结果回传给查询协调程序节点。但是,每个节点如何分配到关系表中的数据子集呢?这就是 散列分区在 MPP 群集中所做的事情。
要在多个节点之间分布表,选择分区键。如果存在主键,那么这是分区键的一个非常好的选项。基数非常低的列(例如,只有两个值“M”和“F”的性别)是糟糕的分区键。
在 CREATE TABLE 语句中指定表分区。下面是一个示例:
CREATE TABLE marty (
foo INTEGER
)
PARTITIONING KEY(foo) USING HASHING;
根据对名为 foo 的列计算散列值,“marty”表将被散布于 MPP 群集(或虚拟群集)中的所有节点中。计算散列值时,数据库计算哪个节点(在虚拟群集中是分区)拥有该特定散列值的行并将这些行存储在适当的计算机上。您或许已经确定了散列算法必须非常快。
基数低的列对于分区表是一个糟糕选项,因为它产生极少的唯一值。如果 MPP 群集中有 10 个节点,而分区列中仅有 5 个唯一值,那么只有 5 个节点将有数据,可能会更少!但是,不必担心,可以将多个列用于分区键。
让我们试一下!逐步安装指南
让我们尝试在单个计算机上使用 DB2 EEE(一种无共享关系数据库)来模拟无共享方法。单处理器的计算机能够提供一种完全模拟无共享群集的测试环境。
下面的每个安装步骤都以描述性信息的链接开始,这些信息可在后面的逐步注释一节中找到。(逐步注释开始处的相应链接可让您返回到安装步骤。)如果您遇到问题,请参阅 故障排除。安装完 DB2 之后,可以在数据库服务器中的两个分区(模拟节点)之间进行数据分区。如果您想要快速且方便地开始,可以使用 模式与程序来填充表。
- 在 Intel 体系结构机器上安装 Linux。它可以是便携式电脑或任何其它 PC。本文的测试在 SuSE 7.2 和 Red Hat 7.0、7.1 以及 7.2 上运行。
- 更改 inetd/xinetd 以接受 rsh。
- 在 SuSE 上,编辑 /etc/inetd.conf,取消 rsh 行的注释。确保在更改配置文件之后重新启动 inetd。
- 在 Red Hat 上,编辑文件 /etc/xinetd.d/rsh,将“disable = yes”更改成“disable = no”。
作为 root 用户,使用下列命令序列来重新启动 xinetd(确切的文件名可能会有所不同):
# /etc/rc.d/rc3.d/S56xinetd stop# /etc/rc.d/rc3.d/S56xinetd start
- 在 SuSE 上,编辑 /etc/inetd.conf,取消 rsh 行的注释。确保在更改配置文件之后重新启动 inetd。
- 如下更改 SuSE 7.2 或 Red Hat 7.1 和 7.2 的内核参数:
sysctl -w kernel.shmmax=10737418>24sysctl -w kernel.msgmni=1024
sysctl -w fs.file-max=8192
sysctl -w kernel.sem=?50 32000 32 1024?
- 安装公共域 ksh(pdksh):
rpm -i pdksh-5.1.14-8.i386.rpm您的 pdksh 发行版可能会不同。
- 安装 DB2 EEE V7.2。您可以从 www.ibm.com/software/data/db2/udb/downloads.html#eeelinux 下载 DB2 EEE for Linux 的试用版。
- 以 root 用户身份登录,使用下列命令安装 DB2 EEE V7.2 产品:
./db2setup - 选择选项以创建样本数据库和管理服务器。使用用户标识的缺省值,
- 以 root 用户身份登录,使用下列命令安装 DB2 EEE V7.2 产品:






