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

developerWorks 中国  >  Grid computing  >

使用监控和发现服务实现网格信息提供程序

了解如何使用 Globus Toolkit 2.2 发布有关网格资源上共享文件的信息

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 初级

Vladimir Silva (vsilva@us.ibm.com), 软件工程师,因特网技术部

2003 年 5 月 01 日

监控和发现服务(Monitoring and Discovery Service,MDS)是 Globus Toolkit 的信息服务组件。它提供了诸如可用资源和计算网格状态之类的网格信息。该信息可能包括网格中的机器、计算机和网络的特性,比如可用处理器的数目、CPU 负载、网络接口、文件系统信息、带宽、存储设备和内存。MDS 使用轻量级目录访问协议(Lightweight Directory Access Protocol,LDAP)来在公共接口中提供中间件信息。MDS 包括两个组件:网格资源信息服务(Grid Resource Information Service,GRIS)和网格索引信息服务(Grid Index Information Service,GIIS)。有了 MDS,您几乎可以发布有关在网格中的任何信息。本文向您说明了如何通过逐步执行样本 MDS 提供程序,来发布有关网格资源上共享文件的信息。可以使用该样本实现来指导编写自己的定制 MDS 提供程序。

简介


编写实现时,应当将目标定为让网格上的每个 GRIS 发布有关每个可用资源和机器上共享文件的信息。然后可以使用 Java 商用网格(Java Commodity Grid,CoG)工具箱 API 在应用程序(类似音乐和文件共享应用程序 Morpheus)中搜索可下载文件。最后,可以使用 GridFTP 从远程资源下载文件以及将文件上载到远程资源。本文中所提供的实现属于由 IBM 研究人员开发的支持网格的文件共享系统原型。

对于这个样本实现,它的代码已经在运行 Globus Toolkit 2.2 的 RedHat Linux 7.3 系统上进行过测试。并不能保证它可以在其它平台或工具箱版本上运行。查看 MDS 使用的 LDAP 配置文件是一个不错的起点。这个文件位于 $GLOBUS_LOCATION/etc/grid-info-slapd.conf,其内容如清单 1 所示。


清单 1:MDS-LDAP 守护程序配置文件 grid-info-slapd.conf

        schemacheck off

include         /opt/globus/etc/openldap/schema/core.schema
include         /opt/globus/etc/grid-info-resource.schema
...
pidfile         /opt/globus/var/resourceslapd.pid
argsfile        /opt/globus/var/resourceslapd.args

modulepath      /opt/globus/libexec/openldap/gcc32pthr
moduleload      libback_ldif.la
moduleload      libback_giis.la
...

      

schemacheck off 行表明该提供程序不需要 LDAP 模式。但是,如果您的网格要求模式检查,则必须创建一个定制的 LDAP 模式,供您的定制提供程序使用。





回页首


创建定制的 LDAP 模式


编写 MDS 提供程序的第一步就是编写模式文件,并将该文件包含在 $GLOBUS_LOCATION/etc 目录下的 grid-info-slapd.conf 文件中。编写模式文件比较困难而且很耗时,一个错误就可以致使您的 MDS 无法使用。因此,应当非常小心谨慎地对待这一处理步骤。清单 2 提供了一个样本。

清单 2:用于发布共享文件信息的定制 LDAP 模式

    
attributetype ( 1.3.6.1.4.1.3536.2.6.3536.3.0.123.1
    NAME 'Mds-File-name'
    DESC 'File Name'
    EQUALITY caseIgnoreMatch
    ORDERING caseIgnoreOrderingMatch
    SUBSTR caseIgnoreSubstringsMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.44
    SINGLE-VALUE
 )

attributetype ( 1.3.6.1.4.1.3536.2.6.3536.3.0.123.2
    NAME 'Mds-File-location'
    DESC 'File Location'
    EQUALITY caseIgnoreMatch
    ORDERING caseIgnoreOrderingMatch
    SUBSTR caseIgnoreSubstringsMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.44
    SINGLE-VALUE
 )

attributetype ( 1.3.6.1.4.1.3536.2.6.3536.3.0.123.3
    NAME 'Mds-File-size'
    DESC 'File Size(bytes)'
    EQUALITY caseIgnoreMatch
    ORDERING caseIgnoreOrderingMatch
    SUBSTR caseIgnoreSubstringsMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.44
    SINGLE-VALUE
 )

objectclass ( 1.3.6.1.4.1.3536.2.6.3536.3.0.123
    NAME 'MdsDataGrid'
    SUP 'Mds'
    STRUCTURAL
    MUST ( Mds-File-name $ Mds-File-location $ Mds-File-size )
 )

要包含此模式,请将下面这行添加到 grid-info-slapd.conf:

include /opt/globus/etc/grid-info-resource.schema

要发布的每个属性都必须包含一个对象标识(OID)。所有属性都依次以 objectclass 分组。作为该提供程序的开发人员,您必须定义所有 OID,而且必须遵循已注册的格式。Globus 已经用 IANA 专用企业号(IANA Private Enterprise Number)注册了下列 OID:

1.3.6.1.4.1.3536.*Globus OID 子空间
1.3.6.1.4.1.3536.2.*Globus 信息服务 OID 子空间
1.3.6.1.4.1.3536.2.6.*MDS OID 子空间

该提供程序要发布的信息包括了文件名、位置(GridFTP 下载时将使用该位置)和文件大小。一旦准备好了模式,下一步就是修改 grid-info-resource-ldif.conf 文件。





回页首


修改 grid-info-resource-ldif.conf 文件


grid-info-resource-ldif.conf 文件描述了将如何调用信息提供程序以及它应该会发出什么内容。该文件位于 $GLOBUS_LOCATION/etc,内容如清单 3 所示。

清单 3:grid-info-resource-ldif.conf 文件

    
# generate shared file info every 5 min
#
dn: Mds-Software-deployment=DataGrid, Mds-Host-hn=dhcp126.adtech.internet.ibm.com, 
Mds-Vo-name=local,  o=grid
objectclass: GlobusTop
objectclass: GlobusActiveObject
objectclass: GlobusActiveSearch
type: exec
path: /opt/globus/libexec
base: grid-info-fileshare
# args
args:  -devclassobj -devobjs -dn Mds-Host-hn=dhcp126.adtech.internet.ibm.com,
Mds-Vo-name=local,o=grid -validto-secs 60 -keepto-secs 900
# end args
cachetime: 300
timelimit: 20
#sizelimit: 20

该文件必须使用下列格式:

dn对象在 DIT 中的位置
objectclass: GlobusTop
objectclass: GlobusActiveObject
objectclass: GlobusActiveSearch
type: exec
这些行是必需的
Path信息提供程序的路径
Base信息提供程序的名称
Args传递给信息提供程序的参数
cachetime单位为秒,GRIS 认为数据有效期是多久
timelimit单位为秒,GRIS 在放弃之前应该等待信息提供程序返回数据多久
sizelimit可以从信息提供程序的输出读取的 LDIF 对象的最大数目




回页首


编写信息提供程序


开发定制 MDS 提供程序的下一步就是编写一个程序(如清单 4 所示的程序),该程序将发出您希望发布的信息。可以使用任何语言,并传递需要的任何参数。只有以下两点要求:

  • 程序的 I/O 接口必须能够由 slapd 进程中的 forkexec 调用。
  • 返回的数据必须符合 LDAP 模式(RFC 2849)。
清单 4:MDS 信息提供程序 shell 脚本程序

    
#!/bin/sh -f

# default libexecdir used to bootstrap scripts
libexecdir=${GLOBUS_LOCATION}/libexec

# load GRIS common code and initialization
. ${libexecdir}/grid-info-common


###################################################

# Globals
USERS_HOME_DIR=/home
GRID_MAP_FILE="/etc/grid-security/grid-mapfile"
#

#
# Modified Globus sub to work with my stuff
#
emit_timestamps ()
{
cat <<EOF
${_line_class_av}Mds-validfrom: ${_mds_validfrom}\n
${_line_class_av}Mds-validto: ${_mds_validto}\n
${_line_class_av}Mds-keepto: ${_mds_keepto}\n
EOF
}


#
# Display Top DN info
#
emit_datagrid_dn() {

# Display output
cat <<EOF
${_line_class_dn}dn: Mds-Software-deployment=DataGrid,${_suffix}
${_line_class_oc}objectclass: Mds
${_line_class_oc}objectclass: MdsDataGrid
`emit_mds_object_timestamps`
EOF

}


#
# Emit file info by reading /etc/grid-security/grid-mapfile
# grabbing user names and reading files under the users home/.data_grid
#
emit_file_info() {
        # TODO: remove duplicates from: $grid_map_users
        grid_map_users=`cat ${GRID_MAP_FILE} | awk -F\" '{print $3}'`

        # debug
        # echo $grid_map_users

        for user in $grid_map_users; do

        # Any files in home dir?
        if [ "`ls -l $USERS_HOME_DIR/$user/.data_grid`" != "total 0" ]
        then
            # For each user print: file name, location & size 
        # of each file under $HOME/.data-grid
          _cmd="ls -l $USERS_HOME_DIR/$user/.data_grid |
                 awk '{ if (length >10) print \"dn: Mds-File-name=\" \$9
                 \", Mds-Software-deployment=DataGrid,$1\",
                  \"\n${_line_class_oc}objectclass: Mds\",
                        \"\n${_line_class_oc}objectclass: MdsDataGrid\",
                        \"\n${_line_class_av}Mds-File-name:\" \$9,
                        \"\n${_line_class_av}Mds-File-location: 
                        
$USERS_HOME_DIR/$user/.data_grid\",
                        \"\n${_line_class_av}Mds-File-size:\" \$5,
                        \"\n`emit_timestamps`\" }' | sed 's/ //' " #


                eval $_cmd
            fi
        done
}


#
# MAIN
# Required: globus stuff
probe_mds_object_timestamps

# emit Parent DN
emit_datagrid_dn
echo ""

# emit file info
emit_file_info "${_suffix}"






回页首


运行信息提供程序


您可以通过发出如下命令从命令行运行该程序:

./grid-info-fileshare -devclassobj -devobjs -dn Mds-Host-hn=dhcp126.adtech.internet.ibm.com,Mds-Vo-name=local,o=grid -validto-secs 60 -keepto-secs 900

:上述命令假设主机名为 dhcp126。它的输出如清单 5 所示。

清单 5:样本程序输出

    
dn: Mds-Software-deployment=DataGrid, Mds-Software-deployment=DataGrid, 
Mds-Host-hn=dhcp126.adtech.internet.ibm.com, Mds-Vo-name=local,  o=grid
objectclass: Mds
objectclass: MdsDataGrid
Mds-validfrom: 20030222183857Z
Mds-validto: 20030222183857Z
Mds-keepto: 20030222183857Z

dn:Mds-File-name=gram_job_mgr_12725.log, Mds-Software-deployment=DataGrid, 
Mds-Software-deployment=DataGrid, Mds-Host-hn=dhcp126.adtech.internet.ibm.com, 
Mds-Vo-name=local,  o=grid
objectclass:Mds
objectclass:MdsDataGrid
Mds-File-name:gram_job_mgr_12725.log
Mds-File-location:/home/bg_guest/.data_grid
Mds-File-size:6537
Mds-validfrom:20030222183733Z
Mds-validto: 20030222183733Z
Mds-keepto: 20030222183733Z

dn:Mds-File-name=gram_job_mgr_12738.log, Mds-Software-deployment=DataGrid, 
Mds-Software-deployment=DataGrid, Mds-Host-hn=dhcp126.adtech.internet.ibm.com, 
Mds-Vo-name=local,  o=grid
objectclass:Mds
objectclass:MdsDataGrid
Mds-File-name:gram_job_mgr_12738.log
Mds-File-location:/home/bg_guest/.data_grid
Mds-File-size:2996
Mds-validfrom:20030222183733Z
Mds-validto: 20030222183733Z
Mds-keepto: 20030222183733Z





回页首


测试信息提供程序


现在您可以准备测试定制的 MDS 信息提供程序了。用下列命令在 RedHat Linux 7.3 系统上重新启动 Globus 服务:

  1. service globus stop
  2. service globus start

使用以下设置脚本(清单 6)对所需的文件进行修改并将其复制到正确的位置。本文所提供的源代码中包含了该脚本。

清单 6:信息提供程序设置脚本

    
#!/bin/sh
# Only root can run this stuff...
if [ "`whoami`" != root ];then
  echo "You need to be root to execute."
  exit 1;
fi

# GLOBUS_LOCATION env var must be defined!
if [ -z "$GLOBUS_LOCATION" ]; then
  echo "ERROR: Environment variable 'GLOBUS_LOCATION' 
  is not set - cannot continue "
  exit 1
fi

GLOBUS_LOCATION_SED=`echo $GLOBUS_LOCATION | sed -e 's/\//\\\\\//g'`

#
# We copy files to globus/etc and /libexec directories
#

cp -f ./grid-info-fileshare ${GLOBUS_LOCATION}/libexec

HOSTNAME=`hostname`

# We modify resources.ldif to take into account the new reporter. 
We first remove old config if present.
echo "$0: Modifying ${GLOBUS_LOCATION}/etc/grid-info-resource-ldif.conf..."

TOT=`more ${GLOBUS_LOCATION}/etc/grid-info-resource-ldif.conf | wc -l `

NUM=`grep -n "## INTRAGRID FILE REPORTER ##" ${GLOBUS_LOCATION}
/etc/grid-info-resource-ldif.conf | tail -1 | sed -e 's/:.*//'`

if [ "$NUM" != "" ]; then
  NUM=`expr $NUM - 1`  
  NUM2=`grep -n "## INTRAGRID FILE REPORTER END ##" ${GLOBUS_LOCATION}
  /etc/grid-info-resource-ldif.conf | tail -1 | sed -e 's/:.*//' `
  NUM2=`expr $TOT - $NUM2`
  head -$NUM  ${GLOBUS_LOCATION}/etc/grid-info-resource-ldif.conf > top
  tail -$NUM2  ${GLOBUS_LOCATION}/etc/grid-info-resource-ldif.conf > bottom
  
  cat top  ./resource-ldif-fileshare.conf bottom | 
  sed -e 's/_-GLOBUS_LOCATION-_/'
  $GLOBUS_LOCATION_SED'/' |  sed -e 's/_-HOSTNAME-_/'$HOSTNAME'/' > 
  ${GLOBUS_LOCATION}/etc/grid-info-resource-ldif.conf
                rm -rf top bottom
else
  cat ./resource-ldif-fileshare.conf |  sed -e 's/_-GLOBUS_LOCATION-_/'
  $GLOBUS_LOCATION_SED'/' |  sed -e 's/_-HOSTNAME-_/'$HOSTNAME'/' >>  
  ${GLOBUS_LOCATION}/etc/grid-info-resource-ldif.conf

fi

#
# SETUP CODE
#

# Globals
USERS_HOME_DIR=/home
GRID_MAP_FILE="/etc/grid-security/grid-mapfile"
#
setup_homedirs() {
  # 
  grid_map_users=`cat ${GRID_MAP_FILE} | awk -F\" '{print $3}'`

  for user in ${grid_map_users}; do
    if [ -d $USERS_HOME_DIR/$user/.data_grid ]
    then 
      echo "$USERS_HOME_DIR/$user/.data_grid already exists."
    else
      cmd1=`mkdir $USERS_HOME_DIR/$user/.data_grid`
      cmd2=`chown $user:$user $USERS_HOME_DIR/$user/.data_grid`
      # echo $cmd1 $cmd2
    fi
  done
}

# Create ~$user/.data_grid dirs for each Grid user to store shared files
echo "$0: Setting up default shared directories..."
setup_homedirs

# 
# Copy chema files
#
# echo "$0: Copyimg LDAP schema..."
# cp -f ./grid-info-fileshare.schema ${GLOBUS_LOCATION}/etc

# Add the following line
# include         ${GLOBUS_LOCATION}/etc/grid-info-fileshare.schema
# to: ${GLOBUS_LOCATION}/etc/grid-info-slapd.conf

echo "$0: Done."






回页首


故障诊断技巧


如果更改配置之后不能启动 LDAP 服务器,请检查 grid-info-slapd.conf 文件中定义的所有模式,以了解是否有 OID 冲突。如果出现了 schemacheck off 行,则不需要在配置文件中包含该模式。请注意,该代码只在运行 Globus Toolkit 2.2 的 RedHat Linux 7.3 服务器上进行了测试。





回页首


结束语


本文演示了用于提供网格资源信息的监控和发现服务的功能。代码样本可以帮助您编写自己的定制提供程序,以满足您组织的需要。



参考资料



关于作者

Vladimir Silva 出生在厄瓜多尔的基多。他于 1994 年从陆军工学院(Polytechnic Institute of the Army)获得系统分析员(System's Analyst)学位。同年,他作为交换学生来到美国,在中田纳西州立大学(Middle Tennessee State University)学习计算机科学。毕业后,他加入了 IBM“Web-Ahead”技术智囊团。他的兴趣包括网格计算、神经网络和人工智能。他还拥有包括 OCP、MCSD 和 MCP 在内的众多 IT 证书。可以通过 vsilva@us.ibm.com与 Vladimir 联系。




对本文的评价

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

建议?







回页首


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