IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  Grid computing | Information Management  >

注册 Globus Toolkit 4 网格服务

学习如何使用 Monitoring and Discovery System(MDS)

developerWorks
文档选项

未显示需要 JavaScript 的文档选项

样例代码


级别: 初级

Babu Sundaram (babu@cs.uh.edu), 网格专家

2005 年 6 月 01 日

Monitoring and Discovery System(MDS)是 Globus Toolkit 的信息服务组件。它提供了有关网格资源的状态信息。其主要组件包括 Index service、Trigger service 和 Aggregator service。MDS 方便了资源的发现和描述,并监控服务和计算。本文解释了 Globus Toolkit 4(GT4)中 MDS 的基本设计和架构。我们还将通过一个示例服务,演示如何设置、配置并使用 MDS 来注册并查询服务。

什么是 MDS?

使用网格计算环境的一个优点是可以“转包”长时间运行的任务,但是这意味着我们需要某种方法来跟踪每个任务及其状态。GT4 版本的 MDS 称为 MDS4 或 WS MDS,用来满足网格环境中信息服务的以下基本需求和推动因素:

  • 服务发现,用来识别和描述虚拟组织(VO)中的组件
  • 资源状态信息,启用元调度程序的调度操作
  • 针对相应资源的使用情况的应用描述和执行监督
  • VO 范围内的状态监控,用于容错或故障诊断的目的

MDS 解决了所有这些问题,并允许我们对关于资源和计算状态的查询进行搜集、管理、编索引和响应。WS MDS 基于 GT4 的 WS Core,使用 Java™、C 和 Python 实现,它贯彻了 Web Services Resource Framework(WSRF)和 WS-Notification。这些技术为资源的监控和发现提供了有用的构建块,并使我们可以定义一些监控和发现的属性,以及随后进行的推和拉模式的访问,正如您将在本文中所看到的。

MDS 是由为网格信息服务提供的资源和客户端工具组成的,它包括以下 3 个组件:

  • WS MDS Index Service —— 该服务搜集网格资源的状态信息,并将其存入一个存储单元。通常来说,虚拟组织会部署一个或多个索引服务,这些服务随后搜集该 VO 中所有可用的网格资源的数据。
  • WS MDS Trigger Service —— 该服务按照管理员的指示,从网格资源中搜集数据,并将这些数据传递给适当的程序,从而根据事件执行各种操作。例如,当一个计算资源的队列长度达到一个特定的阈值时,系统就可能给管理员发送一封电子邮件。
  • WS MDS Aggregator —— 这是另外两个服务构建于其上的软件框架。aggregator 框架负责对 aggregator 源中的数据进行搜集、管理和编索引,并将这些数据发送给一个 aggregator 接收器进行处理。使用 Globus Toolkit 进行分布的 aggregator 源包括:查询服务数据的模块、通过订阅/通知来获取数据的模块以及执行程序来生成数据的模块。aggregator接收器包括用来实现 WS MDS Index service 接口和 WS MDS Trigger service 接口的模块。




回页首


MDS 的功能和架构

网格资源是 VO 的一部分,用户希望可以从中获得诸如文件、程序、Web 服务 或其他支持网络的服务的信息。信息源中包含了关于要介绍的网格资源的详细信息。它们搜集所需的信息,并对其进行格式化,以便与 WS MDS 兼容。

信息源可以是可执行文件,也可以是 Aggregator 框架中的 Java 类,如兼容 WSRF 的 Web 服务。这种服务只需要使状态和状态信息成为可用的 WSRF 资源属性(参阅 参考资料)。

GT4 被配置为使用 WS MDS 组件来发现和监控 GT4 服务,并提供内置的信息源。如前所述,WS MDS 基于 WSRF 实现,因此它自然采用 XML 和 Web 服务接口,来简化信息源的注册和所需信息的定位和访问。Aggregator 服务把所有搜集的信息保存为 XML 格式,该格式可以使用 XPath 表达式进行查询。WS MDS 提供了以下内容:

  • WSRF polling source —— 这是一个 Java 类,用来轮询来自 WSRF 服务的资源属性
  • WSRF subscription source —— 这是一个 Java 类,用来通过订阅/通知模型接收来自 WSRF 服务的资源属性(参阅 参考资料

除了标准的 WS MDS 工具之外,我们还可以编写一些定制的工具来负责服务的注册和信息的管理。通常情况下,用户提供的程序允许对信息进行周期性地查询,或者从随机的网格资源中获取信息,不管它是否是兼容 WSRF 的 Web 服务。引用 GT4 的说明就是(参阅 参考资料):“WS MDS aggregator 服务区别于传统的静态注册库(如 UDDI)的是,信息源的软件状态注册,以及存储的结构化数据的定期刷新。这种动态的行为通过允许用户不用直接访问信息源就可以访问‘最近的’信息,从而提供可伸缩的发现机制。”

除了信息搜集和管理的工具之外,GT4 还提供了很多命令行工具,例如 wsrf-get-propertywsrf-query,它们可以用来通过 QName 或 XPath 查询来检索资源属性。(GT4 还提供了 WebMDS,该工具呈现一个 MDS 信息的基于 Web 的接口。更多信息,请参阅 参考资料 中提供的有关 MDS-Index 的文档。)





回页首


WS MDS 部署

目前的 GT4 Web service 宿主环境实现支持一个默认的 MDS Index Service。在该容器中运行的任何 GT4 服务都可以自动用索引服务进行注册。MDS 的使用涉及以下内容:

  1. 安装 Java Development Kit,例如 J2SE 1.5,并设置 JAVA_HOME 环境变量
  2. 安装 Ant 编译工具,并设置 ANT_HOME 环境变量
  3. 安装 GT4
  4. 使用 Community Index Service 注册服务
  5. 从 MDS Index Service 中查询信息

有关安装 GT4 的完整信息,请参阅 参考资料 中有关 GT4 的文档。

安装好 GT4 并设置适当的环境变量之后,我们就准备好启动 Index Service 了。





回页首


默认的索引服务

在安装 GT4 之后,我们可以通过启动容器并查看容器中可用的信息服务清单来验证默认的索引服务的确存在。这个过程应该类似于:


清单 1. 验证默认索引服务的存在
>> $GLOBUS_LOCATION/bin/globus-start-container -nosec
. . .
http://localhost:8080/wsrf/services/TriggerFactoryService
http://localhost:8080/wsrf/services/IndexServiceEntry
http://localhost:8080/wsrf/services/IndexService
http://localhost:8080/wsrf/services/DefaultIndexServiceEntry
http://localhost:8080/wsrf/services/mds/test/subsource/IndexServiceEntry
http://localhost:8080/wsrf/services/TriggerServiceEntry
http://localhost:8080/wsrf/services/mds/test/execsource/IndexServiceEntry
http://localhost:8080/wsrf/services/DefaultTriggerService
http://localhost:8080/wsrf/services/DefaultIndexService
. . .

注意容器列出了如上所示的与信息服务有关的条目 —— 不一定要按列出的顺序 —— 它也不会返回控制权。要停止这个容器,请在这个窗口中输入 <ctrl>-C





回页首


部署例子

要查看实际的情况,我们可以使用 WS-Resource,例如在教程 理解 WSRF,第 4 部分 中构建的那个 WS-Resource。那时,我们构建了一个拍卖服务。要继续使用这个例子,请按照 参考资料 中的链接下载源文件,并将其保存到一个我们称之为 AUCTION_HOME 的地方。现在我们有了以下的目录结构:


清单 2. 目录结构
<AUCTION_HOME>/etc	
<AUCTION_HOME>/schema	
<AUCTION_HOME>/schema/tutorial	
<AUCTION_HOME>/src

在一个文本编辑器中打开 build.xml 文件,并确保 GLOBUS_LOCATION 变量被设置为 GT4 的安装目录。

得到适当的文件之后,我们就需要继续并确保 Auction 资源的源代码可以支持在社区的索引服务中进行注册和注销。要实现这种功能,我们编辑 <AUCTION_HOME>/src/org/globus/tutorial/auction/AuctionHome.java 文件来实现 add()remove() 操作,如下所示:


清单 3. 实现 add()remove() 操作
import org.globus.wsrf.Resource;
import org.globus.wsrf.ResourceContext;
import org.globus.wsrf.ResourceContextException;
import org.globus.wsrf.ResourceKey;
import org.globus.wsrf.ResourceException;
import org.globus.wsrf.utils.AddressingUtils;
import org.globus.wsrf.impl.ResourceHomeImpl;
import org.globus.wsrf.impl.SimpleResourceKey;

import org.globus.mds.aggregator.types.AggregatorContent;
import org.globus.mds.aggregator.types.AggregatorConfig;
import org.globus.mds.aggregator.types.AggregatorData;
import org.globus.mds.aggregator.types.GetResourcePropertyPollType;
import javax.xml.soap.SOAPElement;
import org.globus.wsrf.utils.AnyHelper;
import org.globus.mds.servicegroup.client.ServiceGroupRegistrationParameters;
import org.globus.wsrf.impl.servicegroup.client.ServiceGroupRegistrationClient;
import org.apache.axis.message.MessageElement;
import org.globus.wsrf.encoding.ObjectSerializer;
import org.globus.mds.aggregator.impl.AggregatorConstants;
import org.globus.wsrf.config.ContainerConfig;


/** This class implements a resource home that can contain many Auctions
*/

public class AuctionHome extends ResourceHomeImpl
{

    static final Log logger = LogFactory.getLog(AuctionHome.class);


    /** This method creates a new AuctionResource */
    public ResourceKey create() {
        logger.info("Creating a new Auction...");
        try {
            Auction myAuction = (Auction)createNewInstance();
            myAuction.initialize();
            ResourceKey key = new SimpleResourceKey(keyTypeName,
                                                    myAuction.getID());
            this.add(key,myAuction);
            return key;
        } catch(Exception e) {
            logger.error("Exception when creating Auction: "+e);
            return null;
        }
    }

    protected void add(ResourceKey key, Resource resource)
    {
        // pass the call to the superclass
        super.add(key,resource);

        ResourceContext ctx;
	  try {
            ctx = ResourceContext.getResourceContext();
        } catch(ResourceContextException e) {
            logger.error("Could not get ResourceContext: "+e);
            return;
        }

        EndpointReferenceType epr;
        try {
            epr = AddressingUtils.createEndpointReference(ctx, key);
        } catch(Exception e) {
            logger.error("Could not form EPR: "+e);
            return;
        }

        String regPath = ContainerConfig.getGlobusLocation()+
            "/etc/globus_tutorial_auction/registration.xml";

        try {
            ServiceGroupRegistrationParameters params =
                ServiceGroupRegistrationClient.readParams(regPath);

            params.setRegistrantEPR(epr);

            ServiceGroupRegistrationClient client =
                ServiceGroupRegistrationClient.getContainerClient();

            client.register(params);
        } catch(Exception e) {
            logger.error("Exception when trying to register this Auction: "
                            +e);
        }
    }

    public void remove(ResourceKey key) throws ResourceException
    {
        // remove from home
        super.remove(key);
    }
}

首先,我们获得一个对当前上下文的引用,然后从这里,为这个具体的拍卖资源检索后端引用。我们为社区的 index 文件设置位置。具有这些信息之后,我们就可以创建一个 ServiceGroupRegistrationClient 了。(WS MDS 是作为一个 WS-ServiceGroup 实现的。)然后就可以通过客户机注册资源了。

当删除资源时,我们实际上也将其从系统中一起删除。

现在,在 AUCTION_HOME 目录中部署这个应用程序:

ant clean
ant deploy





回页首


Community Index Service 的设置

为了系统能够使用 IndexService 来注册资源,它需要知道在哪里能找到该服务。在本例中,本地的主机服务器也用作索引服务的主机。要设置 upstream 的值(它决定了这些入口该到什么地方去),请使用一个文本编辑器来编辑下面的文件:

$GLOBUS_LOCATION/etc/globus_wsrf_mds_index/hierarchy.xml 

要增加一个黑体的文本,如下:

<config>

<!-- 
      <upstream> elements specify remote index services that the local 
       index will be registered to.
    	Set an upstream entry for each VO index that you wish to participate in.
-->

<upstream>http://localhost:8080/wsrf/services/DefaultIndexService</upstream>

</config>+





回页首


通过索引服务进行注册

部署服务之后,我们需要启动或重新启动容器。如果它已经在运行,请先输入 <ctrl>-C 来停止容器,然后使用 globus-start-container 再次启动它。您应该会看到 AuctionService,如下所示:


清单 4. AuctionService
>> globus-start-container 
.......<other_services>.......
http://localhost:8080/wsrf/services/AuctionService
.......<other_services>.......

要检查这个资源是否已经添加到了 MDS 中,请创建一个拍卖实例:


清单 5. 创建一个拍卖实例
>> $GLOBUS_LOCATION/bin/create-auction -s http://localhost:8080/wsrf/services/AuctionService 
New Auction Created...
EPR written to file:  bid-581376501.epr

要验证注册的结果,请使用 GT4 命令行工具来查询 IndexService,将整个命令放到一行中,如下所示:


清单 6. 查询 IndexService
>> $GLOBUS_LOCATION/bin/wsrf-query -s 
     http://localhost:8080/wsrf/services/DefaultIndexService '/*'
... lots of output ...
<ns1:MemberServiceEPR>
   <ns8:Address xmlns:ns8="http://schemas.xmlsoap.org/ws/2004/03/addressing">
        http://129.7.248.40:8080/wsrf/services/AuctionService>
   </ns8:Address>
   <ns9:ReferenceProperties xmlns:ns9="http://schemas.xmlsoap.org/ws/2004/03/addressing">
      <ns1:BidKey xmlns:ns1="http://auction.com">3743136</ns1:BidKey>
   </ns9:ReferenceProperties>
   <ns10:ReferenceParameters xmlns:ns10="http://schemas.xmlsoap.org/ws/2004/03/addressing"/>
</ns1:MemberServiceEPR>
... more output ...

我们还添加了某种间隔,以便很容易就可以看出 AuctionService 实例现在已经在 DefaultIndexService 中注册了。注意该清单中的键值与在 Auction 资源创建的 bid-<some-integer>.epr 文件中包含的键值是相同的。





回页首


查询有关服务实例的信息:运行中的 MDS

现在我们已经知道这个服务已经注册了,那又能拿它干什么呢?

通常,在一个具有各种服务和相关资源的大型网格环境中,我们可以查询特定服务或资源的属性的变化。GT4 使得查询特定服务实例的资源属性成为可能。例如,我们可以查询容器在上一步中创建的特定 Auction 实例的属性。对实例的查询如下:


清单 7. 查询容器
>> wsrf-query -e bid-581376501.epr
<ns1:AuctionResourceProperties xmlns:ns1="http://tutorial.globus.org/auction">
   <ns1:message>Welcome to the Auction Service (No Bid made yet!)</ns1:message>
   <ns1:lastModified>2005-04-16T17:09:51.659Z</ns1:lastModified>
</ns1:AuctionResourceProperties>

注意 bid 的值现在还没有设置。现在我们可以继续并更改 bid 的值了:


清单 8. 更改 bid 的值
>> offer-bid -e bid-581376501.epr 7291
Current Bid = Welcome to the Auction Service (No Bid made yet!)
Your Bid = 7291
Bid Accepted.

现在我们可以重复 wsrf-query 操作来查看资源属性的变化:


清单 9. 重复 wsrf-query操作
>> wsrf-query -e bid-581376501.epr
<ns1:AuctionResourceProperties xmlns:ns1="http://tutorial.globus.org/auction">
    <ns1:message>7291</ns1:message>
    <ns1:lastModified>2005-04-16T17:11:01.758Z</ns1:lastModified>
</ns1:AuctionResourceProperties>

注意除了更新的 message 属性,该结果还显示 lastModified 属性现在包含了资源属性被更改的时间。





回页首


结束语

本文简要介绍了如何使用由 Globus Alliance 提供的、作为 GT4 的一部分的 WS MDS 组件。介绍了 MDS 的重要性,解释了它的架构以及如何使用一个样例 WSRF 服务来实现它。我们谈到了使用 MDS 的以下方面:

  • DefaultIndexService 的配置
  • 对在 WSRF 服务中进行注册和注销的支持的实现
  • 使用 Community Index Service 创建并注册服务
  • 查询给定的索引服务的命令行工具





回页首


下载

描述名字大小下载方法
Classes requiredregistration.tar60 KBHTTP
关于下载方法的信息


参考资料



关于作者

Author photo

Babu Sundaram 从 Globus Toolkit 早期就开始积极地参与网格计算的研究工作。他在 Argonne National Labs 实习时就是 Globus 实现组的成员之一。他拥有医学工程的学士学位和计算机科学的硕士学位,目前他正在休斯顿大学进行计算机科学博士研究工作。他已经在各个网格会议和网格相关的组织中发表了很多论文,而且是很多有关网格计算的书籍的合作者之一。他热爱教学,有时候会作为一个讲师来讲解有关 Web 服务和网格计算领域的课程。他非常欢迎读者对本文进行反馈,您可以通过 babu@cs.uh.edu 与他联系。




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

建议?







回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款