Chinaunix首页 | 论坛 | 博客
  • 博客访问: 29308288
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: 数据库开发技术

2010-03-30 20:52:54

大规模并行处理(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 的结合被用于完成 。

并行数据库是如何工作的?

使多台计算机同时处理同一问题的方法主要有两种。

“无共享(shared nothing)”体系结构意味着每台计算机都有它自己的 CPU、内存和磁盘。 计算机通过高速互连被连接在一起,如 图 1 所示。 当处理查询时,每个节点处理其本地表中的行,然后将节点的部分结果回传给协调程序节点。 协调程序将来自所有节点的所有结果合并成最终结果集。节点不一定是独立的计算机 — 在单个计算机上可以存在多个分区。



高速互连

高速互连对于任何计算机群集(不管是不是数据库的)性能都至关重要。 请参阅有关该主题的 ,以了解当从 100 兆位交换器更改为 10 兆位集线器时对群集关系数据库产生的性能影响。 目前的互连技术 要比 100 兆位快得多, 它所提供的性能在 500 MB/秒到 6 GB/秒之间,这样的带宽绰绰有余。

共享磁盘体系结构( 图 2)使用锁管理器在计算机之间作出仲裁, 这些计算机都访问一个公共磁盘池。这种体系结构在原理上是有缺陷的,因为当节点数增加时,群集会沉溺于锁请求中。 速度较快的硬件隐藏了大量的错误,但即使在每个节点上使用锁高速缓存, 该方法也不能违背物理规律,并且如果没有特定硬件来完成在 DB2 for z/OS? 上使用 Parallel Sysplex? 技术实现的作业,它将无法伸缩。



分布式锁定/共享磁盘体系结构

该环境中的数据库访问要求每个节点都在共享磁盘上请求一块数据。 如果另一个节点已经锁定该数据准备更新,那么正在请求的节点必须等待正在更新的节点完成。 这种环境容易发生“死锁”的锁情况。节点 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 之后,可以在数据库服务器中的 两个分区(模拟节点)之间进行数据分区。如果您想要快速且方便地开始, 可以使用 模 式与程序来填充表。

  1. 在 Intel 体系结构机器上安装 Linux。它可以是便携式电脑或任何其它 PC。 本文的测试在 SuSE 7.2 和 Red Hat 7.0、7.1 以及 7.2 上运行。

  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


  3. 如 下更改 SuSE 7.2 或 Red Hat 7.1 和 7.2 的内核参数
    sysctl -w kernel.shmmax=10737418>24


    sysctl -w kernel.msgmni=1024


    sysctl -w fs.file-max=8192


    sysctl -w kernel.sem=?50 32000 32 1024?


  4. 安 装公共域 ksh(pdksh):
    rpm -i pdksh-5.1.14-8.i386.rpm

    您的 pdksh 发行版可能会不同。

  5. 安 装 DB2 EEE V7.2。您可以从 下载 DB2 EEE for Linux 的试用版。

    • 以 root 用户身份登录,使用下列命令安装 DB2 EEE V7.2 产品:
      ./db2setup

    • 选择选项以创建样本数据库和管理服务器。使用用户标识的缺省值,因为这些指示信息都基于缺省 值。 我希望不要使用“auto-start at reboot”选项。

  6. 编 辑 /etc/services 文件,添加下面粗体显示的行:
    DB2_db2inst1????60000/tcp???# Connection port for DB2 instance db2inst1


    # line below added to provide ports for MLN


    DB2_db2inst1_END????60004/tcp???# end of range of MLN ports


    # make sure the next port is greater than the 60004 above


    # no overlaps are allowed


  7. 以 用户 db2inst1 身份登录,设置该用户的 rsh。创建权限为 600 并具有下列项的文件 .rhosts:
    localhost


    your_host_name_here

    使用下列命令测试 rsh 设置:

    db2_all echo hi

    输出将是回显到标准输出(stdout)的字符串“hi”。

  8. 通 过输入下列 DB2 命令序列测试您的安装:
    db2start


    db2 connect to sample


    db2 connect reset


    db2stop


    这些命令启动数据库,将您连接到样本数据库,然后停止数据库。

  9. 数 据库停止后,编辑文件 ./sqllib/db2nodes.cfg 并添加另一个虚拟节点。TCP/IP 名为“mikado”的主机(它有两个逻辑节点)上的文件类似于:
    0 mikado 0


    1 mikado 1


  10. 使 用 db2start 命令启动多个逻辑节点。输出将类似于:
    [db2inst1@mikado db2inst1]$ db2start


    01-01-2002 20:30:38?????1???0???SQL1063N??DB2START processing was successful.


    01-01-2002 20:30:39?????0???0???SQL1063N??DB2START processing was successful.


    SQL1063N??DB2START processing was successful.


    [db2inst1@mikado db2inst1]$


  11. 创 建跨逻辑节点进行分区的表。如果您需要复习分区概念, 请参阅 无 共享环境中的数据分区
    connect to sample;




    CREATE TABLE marty (


    ?????foo INTEGER


    ??????)




    PARTITIONING KEY(foo) USING HASHING;


  12. 将 一些数据插入表中。可以使用 Java? 来完成这一步或者您自己做。

  13. 通 过使用下列 SQL 语句查看分区分布
    select partition ( foo) as Partition_Hash,


    ?????count(*) as Hash_Count


    from marty


    group by??partition ( foo)


    order by count(*) desc


    fetch first 10??rows only ;


  14. 最 后一步。)祝贺您!享受您的选择吧!




回页首


  1. 在 Intel 体系结构机器上安装 Linux
    与先前版本相比,Linux 的安装过程有了很大的改进。我认为它比 Windows? 方便得多,只需要一次重新引导。 在一个过程中安装一个完整的开发环境,而不需要许多附加过程。

    可以挑选 SuSE( )或 Red Hat( )的发行版或者任何一种版 本, 但应遵守它并学习如何好好地管理它。Red Hat V7.2 对 lilo(一种引导管理器)进行了更新,使之可以识别 Windows 2000? 分区以便进行双重引导。这比起使用 Windows 引导管理器来要少很多工作,后者需要占用引导扇区的前 512 个字节并使它成为 boot.ini 文件中的一个选项。Red Hat 7.1 也使用 EEE,但标准分发版中的 PCMCIA 驱动程序会在一台机器上引起内核恐慌。7.1 和 7.2 都具有新的 Linux 内核 V2.4。这有许多重要改进,尽力获得新分发版是值得的。

    我建议使用定制安装选项,该选项允许文件系统分配。它还提供了屏幕来让您选择想要安装的软件包。 打算将 1.3 GB 的空间用于相当全面的 Linux 映象。这包括完整的开发环境、Web 服务器、Perl 和 Python 等。

    我惊喜地发现,在 SuSE 缺省安装时,在 /etc/hosts 文件中有多个 IP V6 项。 当我们在因特网上用完地址时,使人们转向 ipv6 是一件好事情, 因为它提供了多达数个数量级的地址。我还针对 Windows XP 分区测试了 SuSE 的引导管理器,它引导到 Linux 或 Windows,而且不会产生任何问题。

    请访问 , 这上面收集了有关如何处理大多数配置问题的优秀文章。

  2. 更 改 xinetd 以接受 rsh
    当前的 Linux 分发版做了一件好事情,新安装可以进行网络访问。但这意味着您一定要明确地启用您想要使用的功能部件。您可能会认为这太过多疑了,但您错了。 我通过可用的 Telnet 和 ftp 将一台旧的速度缓慢的 486 PC 与有线电视调制解调器连接。 果然,有人闯入了该机器。 甚至连破旧的机器也不能躲过黑客的注意。

    /etc/rc.d/rc3.d 目录包含在运行级别 3 上运行的所有脚本。每个以“S”开头的脚本都是用参数“start”运行的。 您可以浏览这些脚本,以更好地了解所有这些消息在启动和关闭时是如何出现的以及它们的真正含意。

  3. 更 改 SuSE 或 Red Hat 7.1 和 7.2 的内核参数
    这多有趣呀!您可以更改而不必重新编译内核。 疑 难解答一节描述了如果您不作这一更改的话,您将获得的错误消息。 您将能够启动引擎,但如果没有增加参数 msgmni,连接到数据库的尝试将失败。

  4. 安 装公共域 ksh
    db2_all 脚本依赖于公共域 ksh。可以通过链接 bash 可执行文件并称之为 ksh 来解决这一问题, 但这种逃避手段只对某些命令起作用。继续安装 pdksh。如果愿意,您也可以呆在 bash 中完成您想做的每件事情。

  5. 以 root 用户身份登录,安装 DB2 EEE V7.2
    要使用的最佳文档是快速入门 — 请参阅:
    DB2 for UNIX Quick Beginnings GC09-2970,它包含了很好的逐步安装信息。

    安装屏幕类似于 图 3

    Linux 上的 DB2 安装屏幕

    请对用户标识全部使用缺省值,因为剩余的指示信息都使用缺省值。 图 4显示了数据库服务器和管理服务器的缺省用户。



    缺省用户标识
  6. 编 辑 /etc/services 文件,添加粗体显示的行
    每个逻辑节点都需要一个通信端口来侦听连接请求并与其它节点对话。 请记住:当节点处理其本地数据时,它需要与其它节点进行通信来回传结果集。逻辑节点使用的端口范围在 /etc/services 中用 _END 语法保留。

    如果没有额外的侦听器端口,就不能启动多个逻辑节点!

  7. 以 用户 db2inst1 身份登录,设置该用户的 rsh
    对于要对话的节点来说,它们必须相互信任。您可以使用 .rhosts 文件或者让系统管理员(在您自己的 Linux 机器上是您自己)将那些项置于 /etc/hosts.equiv 中。

  8. 测 试安装
    此时,您已经连接到单个 DB2 EEE 节点实例。下一步是关闭该实例,然后添加另一个逻辑节点。 如果您遇到连接问题,请确保存在名为“sample”的数据库。

  9. 数 据库停止后,编辑文件 ./sqllib/db2nodes.cfg
    这是定义附加节点的方法。第一个数字是节点号,下一项是 TCP/IP 节点名, 第三项是节点将用来通信的端口。这是服务器实例的 /etc/services 中端口号的偏移量。 不必担心,在所示的示例文件中,我不会尝试将真实的端口 0 和真实的端口 1 用于 DB2。

  10. 启 动多个逻辑节点
    祝贺您!您已经完成了。现在,您正在模拟在无共享群集中运行两个不同的计算机。当数据库产生时, 它将为第二个节点创建数据副本。

  11. 创 建跨节点进行分区的表。请注意新的语法:
    PARTITIONING KEY(foo) USING HASHING;

    这是指定哪个列用于分区数据的方法。请记住:列 foo 中的值应该有高基数(假定没有许多重复值)。

  12. 将 一些数据插入表中
    如果您更喜欢用另一种方法来插入行,请随意。该程序将一个递增整数插入列 foo 中。

  13. 查 看分区分布
    该步骤中所示的查询显示了行在 4096 个散列存储区之间是如何分布的。随着更多的键值混编到特定存储区,散列存储区不断增大。 这表示某些散列存储区的值可以比其它散列存储区多。这是任何散列算法所固有的,不会有负面影响, 除非有一个显著的散列偏离。如果发生显著的偏离,您或许要查看分区键的基数并挑选一些值更为独特的东西。
    select partition ( foo) as Partition_Hash,


    ?????count(*) as Hash_Count


    from marty


    group by??partition ( foo)


    order by count(*) desc


    fetch first 10??rows only ;




    PARTITION_HASH HASH_COUNT


    -------------- -----------


    ?????????
    2626??????????17


    ??????????3464??????????15


    ???????????307??????????13


    ???????????329??????????13


    ???????????746??????????13


    ??????????1913??????????13


    ???????????107??????????12


    ???????????492??????????12


    ???????????847??????????12


    ??????????1021??????????12




    ??10 record(s) selected.


  14. 最 后一个步骤。)
    祝贺您!享受您的选择吧! 如果您到此没有任何错误,我会很激动。如果有错误,我希望下面一节会尽量减少您的烦恼。




回页首


万一某一步骤出错,下面是各种错误消息的参考和修正它们所需的步骤。

消息:SQL6031N 错误

症状:
SQL6031N??Error in the db2nodes.cfg file at line number "2". Reason code "12".



诊断:要查找该错误的文本,使用 db2 命令环境

$ db2 ? SQL031N





Reason code ?2? states:

(12) Ensure that you only use port values that are specified in
the services file (/etc/services file on UNIX-based systems) for
your instance.


解决方案:要修正该问题,根据上面 第 6 步的描述更新 /etc/services。


消息:SQL6048N 通信错误
该消息可能出现在启动和停止处理期间,如 第 10 步中所描述的那样。 该问题的根源要回到 第 2 步。 导致出现该消息的其它可能问题是 pdksh 问题,我们将在 下 面讨论它。

症状:
[db2inst1@poohbah db2inst1]$ db2start


12-31-2001 09:29:32?????0???0???SQL6048N??A communication error occurred during START or STOP DATABASE MANAGER processing.


12-31-2001 09:29:32?????1???0???SQL6048N??A communication error occurred during START or STOP DATABASE MANAGER processing.


SQL1032N??No start database manager command was issued.??SQLSTATE=57019





SQL6048N A communication error occurred during START or STOP


??????????DATABASE MANAGER processing.




诊断:
节点无法彼此对话。节点必须通信,才能传输 SQL 查询和接收回结果集。

下面显示了该错误消息的全文:
Explanation: A TCP/IP communication error occurred while the START or STOP DATABASE MANAGER 
command was trying to establish connection with all the nodes defined in the sqllib/db2nodes.cfg file.





User Response: Do the following:: Ensure that the node has the proper a
uthorization defined in the .rhosts or the host.equiv files.





If using multiple logical nodes, ensure the DB2NODE environment
variable is set correctly. The DB2NODE environment variable indicates the node the application
will attempt to connect to. DB2NODE must be set to the node number of one of the nodes
defined on the same host as the application.


解决方案:
在 db2inst 主目录中添加 .rhosts 文件,通过输入下列命令,验证 rsh 是否正在运行:

$ rsh localhost echo hi



文本“hi”将出现在标准输出上。您可以用下列命令进一步验证功能的正确性:

$ db2_all echo hi



应该在标准输出上获得字符串“hi”,db2_all 的成功操作指出您还正确地安装了 pdksh。如果 db2_all 失败, 请阅读下一个错误消息。


消息:SQL6048N

症状:

由于 第 2 步中 rsh 设置出现的问题,我们可能已经看到了这一错误消息。 如果没有按照 第 4 步所描述的那样安装 pdksh,那么也会出现该错误。

[db2inst1@poohbah db2inst1]$ db2start


12-31-2001 10:21:42?????0???0???SQL6048N??A communication error occurred during START or STOP DATABASE MANAGER processing.


12-31-2001 10:21:42?????1???0???SQL6048N??A communication error occurred during START or STOP DATABASE MANAGER processing.


SQL1032N??No start database manager command was issued.??SQLSTATE=57019



诊断:
这些错误是由于丢失 /bin/ksh 引起的。

解决方案:
按照下面的指示信息安装公共域 Korn shell:

rpm -i /mnt/cdrom/RedHat/RPMS/pdksh-5.2.14-13.i386.rpm

消息:SQL0902C 系统错误

症状:

数据库启动,但在连接时发生错误。在 Red Hat 7.1 和 Red Hat 7.2 平台上出现的错误有所不同。

Red Hat Linux 7.2 上的内核参数错误:

[db2inst1@poohbah db2inst1]$ db2start


01-03-2002 10:41:45?????1???0???SQL1063N??DB2START processing was successful.


01-03-2002 10:41:46?????0???0???SQL1063N??DB2START processing was successful.


SQL1063N??DB2START processing was successful.


[db2inst1@poohbah db2inst1]$ db2 connect to sample


SQL0902C??A system error (reason code = "") occurred.

Subsequent SQL statements cannot be processed.??SQLSTATE=58005


[db2inst1@poohbah db2inst1]$



Red Hat Linux 7.1 上的内核参数错误:

[db2inst1@mikado db2inst1]$ db2start


01-03-2002 11:19:14?????1???0???SQL1063N??DB2START processing was successful.


01-03-2002 11:19:16?????0???0???SQL1063N??DB2START processing was successful.


SQL1063N??DB2START processing was successful.


[db2inst1@mikado db2inst1]$ db2 connect to sample


SQL1084C??Shared memory segments cannot be allocated.??SQLSTATE=57019


[db2inst1@mikado db2inst1]$



诊断:
未正确设置 Linux 内核参数。

解决方案:
要修正该问题,可按照 第 3 步所描述的那样更改内核参数。

可以通过更新 /etc/sysctl.conf 文件,使这个更改在重新引导时自动操作。

如下验证操作是否成功:

[db2inst1@poohbah db2inst1]$ db2 connect to sample





???Database Connection Information





?Database server????????= DB2/LINUX 7.2.0


?SQL authorization ID???= DB2INST1


?Local database alias???= SAMPLE


消息:SQL30081N 或 SQL1013N

症状:

在 Linux 和 Windows 2000 上,您会获得下列错误:

C:\\>db2 connect to sample


C:\\>db2 connect to sample


SQL30081N??A communication error has been detected.??
Communication protocol being used: "TCP/IP".??Communication API being used: "SOCKETS".


Location where the error was detected: "".


Communication function detecting the error: "connect".


Protocol specific error code(s): "10060", "*", "*".


SQLSTATE=08001




C:\\>db2 connect to grommit


SQL1013N??The database alias name or database name "GROMMIT" could not be found.


SQLSTATE=42705



诊断:
您正在设法连接的数据库不存在。

解决方案:
对于这两条消息,使用下列命令来列出实例中所有数据库的名称:

db2 attach to yourinstancenamehere


db2 list database directory



??连接到存在的数据库,或者如下创建一个新的数据库:

db2 create database sample



确保您连接到正确的实例。如果您有任何疑问,输入下列命令来查看所有实例名:

db2ilist

阅读(1614) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~