60
UNIVERSIADE FEDERAL DE SANTA CATARINA SCRG – Sistema de Coleta de Recursos em Grids Utilizando o Globus Toolkit 4 Florianópolis, 26 de fevereiro de 2007

SCRG – Sistema de Coleta de Recursos em Grids Utilizando o ... · 12.Demonstração da utilizaçao do SNMP versão 3 com MIB-II 31 13.Ambiente de desenvolvimento utilizando Eclipse

  • Upload
    hanhan

  • View
    215

  • Download
    0

Embed Size (px)

Citation preview

UNIVERSIADE FEDERAL DE SANTA CATARINA

SCRG – Sistema de Coleta de Recursos em Grids Utilizando o Globus Toolkit 4

Florianópolis, 26 de fevereiro de 2007

UNIVERSIDADE FEDERAL DE SANTA CATARINADEPARTAMENTO DE INFORMÁTICA E

ESTATÍSTICACURSO DE SISTEMAS DE INFORMAÇÃO

SCRG – Sistema de Coleta de Recursos em Grids Utilizando o Globus Toolkit 4

Guilherme Zanetta Simoni

Trabalho de conclusão de curso apresentado como parte dos requisitos para obtenção do grau de Bacharel em Sistemas de Informação.

Florianópolis – SC2006/2

Guilherme Zanetta Simoni

SCRG – Sistema de Coleta de Recursos em Grids Utilizando o Globus Toolkit 4

Trabalho de conclusão de curso apresentado como parte dos requisitos para obtenção do grau de Bacharel em Sistemas de Informação.

Orientador: Frank Auguto Siqueira

Banca Examinadora:

Mário Antônio Ribeiro Dantas

Luís Fernando Friedrich

SUMÁRIO

1.Introdução 72.Ambientação 92.1Sistemas Distribuídos 92.2Grids Computacionais 92.3 Globus Toolkit 112.3.1 Gerenciamento de Arquivos 132.3.1.1 Protocolo GridFTP 152.3.1.2 Serviço de Transferência Confiável 162.3.1.3 Replicação dos Dados 172.3.1.4 Replicação de Alto Nível 172.3.2 Segurança 182.3.3 Escalonamento de Processos 202.4 Web Services 222.4.1 Vantagens e Desvantagens 232.4.2 SOAP 242.4.3 eXtensible Markup Language 252.4.4 Web Services Description Language 262.4.5 Universal Description, Discovery and Integration 283. Monitoramento 303.1 SNMP 313.1.1 Visão Geral 313.1.2 Comunidades 313.1.3 Problemas com SNMP 333.2 MDS/WebMDS. 334. Desenvolvimento 354.1 Ferramentas 354.1.1 Eclipse IDE 354.1.2 Apache Web Server 364.1.3 PHP 364.1.4 GDTE (Globus Development Tools for Eclipse) 374.1.5 RRDTool 374.1.6 Java Standard Edition 384.2 Modelo de Desenvolvimento 394.3 SCRG (Sistema Coletor de Recursos em Grid) 394.3.1 Pré-Requisitos 394.3.2 Funcionamento 404.3.2.1 Arquivos de Configuração 404.3.2.2 Sistema de Arquivos /proc 414.3.2.3 Kolector 424.3.2.4 KolectorClient 444.3.2.5 PHP-Kolector 444.3.2.6 Apresentação 464.3.3 Processo de Instalação 46

4.3.4 Testes 474.3.5 Dificuldades Encontradas 485. Conclusão 496. Referências Bibliográficas 517. Apêndice 53

LISTA DE FIGURAS

1.Demonstração da utilização de um grid 10

2.Visão Geral da Arquitetura Interna do Globus 12

3.Integração entre o GT4, OSGA e WSRF 13

4.Integração do GT4, OSGA, WSRF numa visão em camadas 13

5.Exemplo de utilizaçao do RLS 17

6.Visão Geral do GSI e seus diferentemente métodos de proteção

19

7.Componentes do WS-GRAM 21

8.Diagrama de estados de um job durante sua existência 21

9.Interação e comunicação entre os elementos de uma aplicação WebService

23

10.Exemplo de mensagem SOAP 25

11.Exemplo de arquivo XML 26

12.Demonstração da utilizaçao do SNMP versão 3 com MIB-II 31

13.Ambiente de desenvolvimento utilizando Eclipse 36

14.Demonstração de código escrito em PHP 37

15.Exemplo de gráfico gerado pelo RRDTool 38

16.Demonstração do conteúdo do arquivo de configuração ips.conf

41

17.Diagrama de Fluxo de Dados do Kolector 43

18.Método principal do KolectorClient 44

19.Utilização de CPU 45

20.Demonstração do HTML gerado 46

21.Inicialização e encerramento do Globus 48

1.INTRODUÇÃO

Com o passar dos anos, a partir da década de noventa, através do

amadurecimento de técnicas de modelagem, de programação e de

melhorias de processo, os softwares foram ficando cada vez mais robustos.

Com o crescente avanço da automatização nos modelos de processos de

negócios e a complexidade dos sistemas atuais, se torna necessário cada

vez mais poder computacional e maior confiabilidade das máquinas. A

solução encontrada foi distribuir o processamento destes softwares em

diferentes máquinas, mas mantendo esta arquitetura transparente para o

usuário final. Através desse método pode-se tanto gerar uma alta

disponiblidade dos serviços prestados, pois o problema do ponto único de

falha é resolvido, como utilizar-se do poder de processamento ocioso

disponível em outras máquinas.

Neste contexto se encaixam os Grids Computacionais, que são a mais

nova tecnologia de distribuir serviços pela internet, encapsulando o método

de como isso é feito. Grids são formados por máquinas que trocam

informações entre si para processar algoritmos mais eficientemente e

rapidamente sem que exista a necessidade de estarem na mesma rede.

No entanto para um bom planejamento, gerenciamento e

escalonamento de recursos físicos, torna-se necessário o monitoramento dos

recursos disponíveis nos Grids.

Seguindo este raciocínio, desde o início tornou-se motivador codificar

tais aplicações. O objetivo deste trabalho consiste em desenvolver um

aplicação que exerça a função de avaliar a disponibilidade dos recursos

computacionais das máquinas do grid e disponibilizar estas informações em

um servidor central para as mesmas possam ser analizadas e avaliadas

pelo(s) gerente(s) do grid. Para este projeto tenha sucesso será necessário

realizar estudos da plataforma de grid e observar como este se comporta em

ambientes simulados. Um estudo mais aprofundado sobre comunicação com

WebServices e GridServices também será necessário.

Atualmente existem vários projetos de grids sendo desenvolvidos ao

redor do mundo, como o Globus [1], GridBus [2], InteGrade [3] e o OurGrid

[4]. O mais maduro e amplamente utilizado destes projetos é o Globus [1]

que está ativo desde 1997. Desde de suas primeiras versões o Globus já

possui um sistema de monitoramento que é capaz de realizar as funções

necessárias e informar o usuário de suas análises.

Embora o Globus [1] já possua um sistema para monitoramento, o

software que exerce a função de colher informações das máquinas do Grid e

exibi-las para o usuário administrador, requer a instalação de outros

softwares adicionais que consomem muitos recursos da máquina e geram

uma árvore de dependências entre aplicativos e bibliotecas que torna a sua

instalação extremamente dificultada. A solução apresentada neste trabalho

não irá requerer uma infra-estrutura complexa de instalar, manter e que

consuma muitos recursos das máquinas servidoras.

Este trabalho se dividirá nas seguintes etapas: no capítulo dois, será

apresentada uma ambientação e um estudo sobre sistemas distribuídos e o

sistema de grid que será utilizado neste trabalho. No capítulo seguinte será

apresentada uma análise sobre funcionalidades e características de

monitoramento e algumas arquiteturas como o SNMP e o WebMDS. No

capítulo quatro será apresentada a proposta do trabalho em si, como

funcionará e porque ela se tornará muito fácil de se instalar e operar. Nos

capítulos 4 e 5, serão apresentados, respectivamente, o desenvolvimento e a

conclusão do trabalho.

2.AMBIENTAÇÃO

2.1 Sistemas Distribuídos

Segundo George Coulouris [5], um sistema distribuído é aquele no

qual componentes localizados em diferentes redes se comunicam e

cordenam suas ações através da troca de mensagens.

Através deste conceito, podemos imaginar o poder que isto trás à

computação. Com este tipo de paradigma, podemos desenvolver sistemas

muito mais eficientes e que podem processar muito mais informação do que

se alocássemos todo o processamento em uma única máquina.

Com o avanço das redes de computadores, este tipo de sistema

evoluiu e mecanismos foram desenvolvidos para resolver alguns problemas

enfrentados pelos programadores, tais como: controle de concorrência,

falhas independentes e sincronização de mensagens e horários.

Um dos novos paradigmas de sistemas distribuídos que está

crescendo aos olhos dos pesquisadores são os Grids Computacionais. Isto

está acontecendo porque eles proporcionam um aumento da produtividade

de aplicações graças ao seu poder de serem altamente escaláveis.

2.2 Grids Computacionais

A maioria das grandes e médias empresas possui em seu parque

tecnológico vários computadores entre servidores e desktops. Na maioria

dos casos os sistemas operacionais destes computadores são heterogêneos,

passando desde máquinas Windows, Linux, variantes de Unix (HP-UX, AIX,

Solaris) até sistemas operacionais para mainframes.

Como essas máquinas geralmente são dedicadas a um único fim,

como os servidores que são responsáveis por email, web, impressão, e os

desktops que são utilizados na sua maioria por usuários que não exploram

toda a capacidade de processamento, elas possuem processamento

potencial sem ser utilizado. A utilização em médias de servidores fica entre

5% a 10%, chegando em média a 40% de sua capacidade em horário de

pico. A situação dos desktops ainda é mais impressionante porque

geralmente das 168 horas que uma semana possui, em apenas 40 horas em

média uma máquina desktop fica em utilização. Além disto, sua utilização é

bem abaixo do processamento máximo que o hardware proporciona. Na

média o consumo do processador é muito baixo, ficando em torno de apenas

3% a 5% do total. Tendo isto em vista, se torna claro que há um imenso

poder computacional ocioso dentro das organizações.

De acordo com Cezar Taurion Chefe [6], Grids Computacionais

tratam-se de um conjunto de softwares de middleware que gerenciam

recursos distribuídos e espalhados pela organização, disponibilizando como

recursos os servidores e eventualmente os desktops da empresa.

A figura 1 demonstra a utilização de um grid de computadores, para

que uma tarefa seja executada.

Figura 1: Demonstração da utilização de um grid. Fonte: http://www.redbooks.ibm.com

Os Grids Computacionais servem para que as organizações possam

compartilhar suas aplicações em milhares de computadores pelo planeta

todo, não interessando em quais redes estejam.

A grande vantagem dos Grids é poder executar uma aplicação

remotamente, agregando poder de processamento, sem que o usuário final

da aplicação tenha conhecimento disto. Esta característica só se torna

possível graças aos suportes de middleware existentes, pois são eles que

exercem toda a função de escalonamento de processos, concorrência, e

entrega dos resultados a uma interface.

Como mencionado anteriormente, um dos projetos de middleware

para grid mais maduros atualmente é o Globus Project [1], e por este motivo

este trabalho será realizado sobre esta plataforma.

2.3 Globus Toolkit

O Globus Tookit é um pacote Open Source para montar arquiteturas

Grid. Os usuários das VO's (Virtual Organizations – entidades que se utilizam

o Grid), podem ser universidades, empresas privadas, entidades

governamentais, entre outras, podem compartilhar processamento, banco de

dados e outras funcionalidades pela internet sem necessariamente perder a

autonomia de sua própria organização.

O GT4 (Globus Toolkit version 4) é formado por uma série de pacotes

e cada um deles provê um tipo de serviço, tais como compartilhamento de

processos, monitoramento, segurança, entre outros. Estes pacotes são

demonstrados na figura 2:

Esses módulos interagem entre si para funcionar como um todo. Para

que isto fosse possível, foi preciso estabelecer um padrão de interface.

O OGSA (Open Source Grid Services Architecture) visa definir

aplicações para grids com um padrão de comunicação comum.

Atualmente o OGSA já definiu um padrão para praticamente todas as

aplicações que são geralmente encontradas em grids como gerenciamento

de recursos, segurança de serviços, gerenciamento de processos, dentre

outros.

Figura 2: Visão Geral da Arquitetura Interna do Globus. Fonte: http://www.globus.org

Quando os desenvolvedores criaram esta arquitetura, eles

perceberam que precisariam adotar algum tipo de middleware, já que

queriam que seus padrões fossem aceitos mais facilmente pelas indústrias.

Apesar de terem optado por Web Services, os mesmos não suportam

a principal característica necessária para funcionamento do OGSA: eles têem

que manter estado entre invocações (ou seja, são serviços stateful). Embora

na teoria eles possam manter estado ou não, geralmente não os mantém, e

não há padrões definidos para esta característica. Sendo assim foi criado o

WSRF.

O WSRF (Web Services Resource Framework) especifica como

podemos fazer um web service agregar a funcionalidade de manter estado,

adicionando algumas características interessantes.

Figura 3 : Integração entre o GT4, OSGA e WSRF. Fonte: http://www.globus.org

A 3 mostra a interação entre o GT4, o OSGA e o WSRF. E a figura 4

mostra a interação entre eles em uma forma de camadas:

Figura 4: Integração do GT4, OSGA, WSRF numa visão em camadas. Fonte: http://www.globus.org

2.3.1 Gerenciamento de Arquivos

Durante o desenvolvimento do middleware, seus desenvolvedores

perceberam que o acesso a transferência de arquivos em um ambiente

distribuído era tão importante quanto acessar recursos distribuídos, isto

porque tanto aplicações científicas como de engenharia acessam grandes

volumes de dados.

A partir deste momento, começou a ser projetado um sistema que

fosse capaz de realizar essa tarefa. Outros sistemas de arquivos distribuídos

já existiam como o HPSS (High Performance Storage System), criado pela

IBM, o DPSS (Distributed Parallel Storage System) do LBNL (Lawrence

Berkley National Laboratory) e o SRB (Storage Resource Broker) do SDSC

(San Diego Supercomputer Center).

Desenvolver um novo sistema de armazenamento distribuído, para

que seja reconhecido como padrão aberto e para manter compatibilidade

com os outros, era necessário implementar todas as suas funcionalidades já

estabelecidas.

Para garantir a compatibilidade com os outros sistemas, foram

inicialmente cogitadas duas abordagens para o desenvolvimento.

A primeira era criar uma camada interoperabilidade em cima do

sistema de armazenamento. Isto envolveria a tarefa de desenvolver um

meta-sistema de armazenamento que seria uma abstração de um sistema já

existente. Somente seria subsituída a camada de alto-nível, mantendo-se as

funcionalidades já implementadas. Esta metodologia tem a vantagem de que

pode-se chegar ao objetivo sem aplicar nenhuma mudança na parte de

transferência de arquivos propriamente dita dos sistemas já existentes. Por

outro lado, seria necessário a criar de uma interface para cada um deles e

para outros que possam surgir.

Uma segunda abordagem, que foi a tomada, era construir a interface

de interoperabilidade embaixo, influenciando diretamente nas

funcionalidades de transferência de arquivos. Esta metodologia envolve

desacoplar o sub-sistema de transferência de arquivos e incorporar um

protocolo único e universal nos outros sistemas de armazenamento de

arquivos distribuídos existentes. Como a maioria destes já foram

desenvolvidos com o mecanismo de alto-nível desacoplado do de baixo nível,

esta operação não seria muito custosa.

Analisando as várias possibilidades de protocolos já existentes, optou-

se por implementar o sistema de armazenamento em cima do protocolo FTP.

Esta decisão foi tomada principalmente porque o FTP trabalha com

transferência de grandes volumes de dados e as partes de autenticar (login)

e transferência (bulk) são desacopladas.

2.3.1.1 Protocolo GridFTP

Foi defino pelo Global Grid Forum Recommendation no documento

GFD.020, posteriormente sendo aceito e descrito no seguintes documentos:

RFC 959, RFC 2228 e RFC 2389. Suas especificações descrevem métodos

robustos, eficientes e seguros para tranferências de arquivos em larga

escala. O GTK4 implementa as funcionalidades mais comuns como servidor,

uma interface em linha de comando e um conjunto de bibliotecas de

desenvolvimento.

Entre suas principais características pode-se citar:

• Suporte à Infra-estrutura de Segurança para Grids (GSI) e ao

Kerberos: sistema de segurança que garante uma autenticação

flexível, integridade confidencialidade para aplicações em ambiente

Grid. Também tem a possibilidade de utilizar Kerberos.

• Controles externos para transferência: se for necessário utilizar de

controles de conexão quando houver um volume grande dados entre

dois servidores, é oferecido à API de segurança para que estes

controles sejam implementados.

• Transferências Paralelas: utilizar várias conexões TCP simultâneas

pode aumentar o tamanho máximo de banda do que se usar uma

única conexão. O GridFTP suporte múltiplas através de extensões de

comando FTP ou então através de vários canais de dados.

• Dados Particionados: transferir porções de dados distribuídos por

várias conexões pode aumentar a banda utilizada, de modo a agilizar

a transferência.

• Dados Parciais: algumas aplicações requerem a transferência de

arquivos parciais. Embora o FTP necessite que os arquivos sejam

enviados e/ou recebidos por completo ou então uma marcação de

onde o arquivo terminou, o GridFTP introduz novas funcionalidades

que permitem a transferência de partes de arquivos.

• Suporte a transferências confiáveis: robustez e controles sobre falhas

são requisitos necessários para muitas aplicações. O FTP define

alguns métodos para continuar uma transferência em que houve erro,

porém não são amplamente implementadas. O GridFTP implementa e

estende estes mecanismos.

2.3.1.2 Serviço de Transferência Confiável

Embora o GridFTP seja um protocolo bastante robusto, há algumas

características nele que não são interessantes quando fala-se de

transferências confiáveis.

Primeiramente, ele não é um protocolo orientado a web services.

Outro ponto é que se faz necessário manter uma conexão aberta durante

toda a operação entre os servidores ou entre cliente e servidor. Isto, no caso

de arquivos muito grandes, requer mais tempo para a transmissão, o que

não é interessante quando usa-se uma estações de trabalho móveis como

laptops. Os mecanismos de transferência confiável prevêem erros no

servidor ou no meio de comunicação, porém não há nada implementado

quando há um erro no cliente, já que neste cenário os arquivos estão na

memória do cliente e não no servidor.

Para contornar estes problemas, foi desenvolvido o RTS (Reliable

Transfer Service) . O RTS é um web service que provê um serviço

semelhante a um escalonador de serviços. Toma como entrada uma lista de

URLs contendo os arquivos e diretórios a serem movidos e os mesmos são

cadastrados em uma base de dados para que comecem as transferências.

Após o RTS receber as requisições, este funciona como qualquer

outro escalonador. Sua interface ainda fornece métodos para se buscar o

estado das transferências e notificações sobre eventos.

2.3.1.3 Replicação de Dados

O Serviço de Localização de Réplicas (RLS) é um serviço que serve

para localizar cópias ou réplicas pelo ambiente de Grid. Ele tem a habilidade

de criar registros distribuidamente de onde estas cópias estão fisicamente.

Isto implica em ter vários servidores trocando informações dentro do Grid.

Esta abordagem se torna interessante, porque ela permite a eliminação de

pontos únicos de falha.

Os arquivos são criados e posteriormente, através de requisições, o

protocolo descobre onde estão localizadas fisicamente as cópias. Duas

nomenclaturas são utilizadas:

• Nome lógico do arquivo: -identificador único perante o Grid.

• Nome físico do arquivo: -identificador da réplica localizada no sistema

de armazenamento local.

Figura 5: Exemplo de utilizaçao do RLS. Font: Globus Alliance.

2.3.1.4 Replicação em Alto Nível

O Serviço de Replicação de Dados (DRS) é um serviço que se localiza

na camada de alto nível, que se utiliza de dois outros componentes de baixo

nível do middleware: o RLS e o RTS.

A função do DRS é assegurar que um ou mais arquivos específico(s)

existem em um repositório de armazenamento. Sua operação começa

enviando requisições ao RLS para descobrir em qual servidor o arquivo

desejado se encontra. Após isto, envia requisições ao RTS para que sejam

criadas as conexões no escalonador para que então as transferências

comecem. Caso haja algum problema no lado do servidor, as técnicas de

tolerância a falhas do GridFTP atuam e em caso da falha ser no lado do

cliente, quem atua é o próprio RTS.

2.3.2 Segurança

Grids surgiram como uma solução para aplicações distribuídas inter-

operacionais e dinâmicas. O projeto Globus foi projetado para suportar esses

ambientes e ser utilizado em todo o mundo. O Grid Security Infrastructure

(GSI) é o módulo que tem a responsabilidade de gerenciar a segurança

envolvida nas transações de dados e tarefas.

No Globus Toolkit versão 4 (GT4) dois mecanismos são utilizados

para incrementar a proteção das trocas de mensagens SOAP: o nível de

transporte e o nível de mensagem. O nível de transporte utiliza-se do

protocolo TLS com suporte a certificados x.509 através de proxys para

realizar a autenticação. Já o nível de mensagem provê compatibilidade com

os padrões WS-Security e o WS-SecureConversation para criptografar as

mensagens SOAP.

Embora seja importante suportar os padrões WS-Security e o WS-

SecureConversation para manter compatibilidade com o protocolo básico

de segurança para WebSevices (WS- Interoperability Basic Security

Profile ), ele não é muito utilizado pois sua performance é baixa e por esta

razão o GT4 vem configurado para fazer uso do protocolo TLS.

A segurança no nível de transporte utiliza TLS para encapsular a

mensagem SOAP com criptografia através do grid. Isso garante a integridade

e a privacidade das mensagens. Esta tecnologia é suportada como uma

alternativa de alto desempenho a de nível de mensagem.

Este mecanismo é comumente utilizado em conjunto com credenciais

X.509 para autenticação, entretanto seu funcionamento pode se dar sem

autenticação, conhecida como anonymous transport- level security .

Nesta categoria o processo de reconhecimento do usuário deve ser feito em

outro estágio, com usuário e senha dentro de uma mensagem SOAP ou

então completamente sem autenticação.

O GSI implementa em seu message- level security os padrões WS-

Security e o WS-SecureConversation para proteger a comunicação

SOAP. O WS-Security é um padrão elaborado pela OASIS que define um

framework para estabelecer um nível aplicado de segurança para cada

troca de mensagem. Já o WS-SecureConversation , que é um protocolo

proposto pela Microsoft e IBM, define um contexto inicial de segurança para

a troca de mensagens, desta maneira consumindo menos poder

computacional. Embora seja interessante este último modo de

contextualização da segurança, ele funciona somente assossiado a

certificados X.509. Já com o WS-Security , pode-se tanto permirtir

autenticação via credenciais X.509 ou com usuário e senha.

As credenciais X.509 são utilizadas para identificar entidades

persistentes como usuários e serviços, já que garantem uma única

identificação para cada entidade e também um método de assegurar que a

identidade pertence mesmo ao indivíduo em questão.

Figura 6: Visão Geral do GSI e seus diferentemente métodos de proteção.

O GSI trabalha com delegação e single sign-on junto com proxys de

certificados para propagar os privilégios de quem originou uma solicitação de

serviço para outras entidades.

Os três tipos diferentes de proxys são:

• Old : são mantidos apenas como legado. Referentes ao rascunho do

RFC 3820.

• Default GT4: seguem o formado do RFC 3820, exceto por

possuírem um conjunto proprietário de OIDs. Serão depreciados nas

próximas versões do Globus Toolkit.

• Fully RFC 3824 : são completamente compatíveis com o RFC 3820.

Será o padrão adotado futuramente.

A delegação de serviços é realizada utilizando o padrão WS-Trust e

sempre será do mesmo tipo de proxy do qual originou o serviço.

2.3.3 Escalonamento de processos

O Globus Toolkit trata o escalonamento de processos através de um

conjunto de aplicações que unidas são chamadas de GRAM (Grid Resource

Allocation and Management) e sua implementação sob o conceito de

webservices WS GRAM.

Embora possua seu próprio mecanismo de escalonamento, sua

principal função é distribuir as tarefas, ou jobs pelos nodos do Grid. Para

isso ser realizado, foi implementada uma interface entre o escalonador do

Grid e o do próprio sistema operacional que roda no nodo.

Uma visão geral sobre seus componentes é mostrado na figura 6:

Figura 7: Componentes do WS-GRAM. Fonte: http://www-unix.globus.org/toolkit/docs/4.0/

Cada job submetido ao Grid é identificado unicamente por um serviço

chamado de ManagedJob. Este serviço possui uma interface onde é

possível verificar o estado deste job ou então terminá-lo. O seu

comportamento dentro do escalonador local do sistema operacional é

identificado por um tipo especializado dentro da abstração da interface.

Figura 8: Diagrama de estados de um job durante sua existência. Fonte: http://www-

unix.globus.org/toolkit/docs/4.0/

2.4 Web Services

De acordo com a W3C [12], Web Services são sistemas

desenvolvidos com a característica de suportar interoperabilidade entre

máquinas através de uma rede. Isto é possível devido a sua descrição de

interface em um formato independente de sistema operacional como a

WDSL.

A interatividade entre as pontas da comunicação se dá por troca de

mensagens encapsuladas pelo protocolo SOAP, que por sua vez também é

encapsulado em um protocolo de aplicação, comumente sendo o HTTP.

Sistemas projetados para serem WebServices se utilizam de várias

tecnologias, dentre as principais estão listadas abaixo:

• XML: todos os dados trocados durante a comunicação são formatados

em XML. A codificação das mensagens devem estar de acordo com o

padrão estabelecido pelo SOAP;

• Protocolos de Alto Nível: é através deles que os dados são

transportados entre as aplicações. Podem ser estes protocolos: HTTP,

FTP, SMTP e XMPP;

• WSDL: linguagem que serve para descrever as interfaces públicas de

um Web Service. É baseada em XML.

• UDDI: a publicação das interfaces em repositórios públicos é feita com

este protocolo. Isto habilita as aplicações procurarem por informações

de outros WebServices;

• WS-Security: o WebServices Security Protocol foi aceito pela OASIS

como um padrão. Esse mesmo permite a autenticação dos atores e a

confidencialidade das mensagens enviadas;

• WS-ReliableExchange: uma especificação baseada no SOAP com o

objetivo de garantir que toda mensagem será entregue. É visto em

ambientes de alta criticidade. Também foi aceito como um padrão pela

OASIS.

Figura 9: Interação e comunicação entre os elementos de uma aplicação WebService.

2.4.1 Vantagens e Desvantagens

Como já mencionado antes, WS mantém um alto grau de

interoperabilidade entre plataformas e sistemas operacionais. Isto é possível

porque sua pilha de protocolos é formada por protocolos abertos e

intependentes de registros e marcas. Como a passagem de mensagens é

realizada através de métodos já estabelecidos como HTTP e FTP, não há

necessidade de alterações nos firewalls das organizações envolvidas como

outras formas de invocação remota de métodos necessitam. Juntamente ao

fato das aplicações que se encaixam neste modelo de desenvolvimento

serem altamente distribuídas e publicadas, tem-se uma alta reusabilidade de

componentes.

Embora WS apresentem vários benefícios, estes possuem certas

desvantagens como não possuir suporte a transações simultâneas entre

vários hosts, como CORBA possui, e sua performance é baixa compara

com outras linguagens para a construção de sistemas distribuídos. Isto se

deve aos objetivos de projetos da tecnologia que não foram voltados a

eficiência e parsing .

2.4.2 SOAP

SOAP é um protocolo para o intercâmbio de mensagens entre pontos

através da internet/intranet baseado em XML, normalmente utilizando HTTP.

Forma a camada fundamental para a implementação de WebServices,

fornecendo um framework que camadas mais acima podem ser

implementadas.

Há vários padrões de diferentes tipos de mensagem, mas o mais

conhecido é a chamada de procedimento remoto (RPC), que em um nodo

cliente manda uma requisição e um outro nodo servidor retorna uma

resposta.

Embora alguns protocolos de alto nível são válidos para fazer o

transporte de mensagens SOAP, o HTTP tem se destacado e sido usado

com mais freqüência pois ele trabalha bem com a atual intra-estrutura da

internet, especialmente porque geralmente não é bloqueado por firewalls .

Esta é a maior vantagem sobre protocolos de sistemas distribuídos

como GIOP/IIOP ou DCOM que são comumente filtrados. Um ponto que está

sob discussão é se o HTTP é a forma correta de transporte devido a sua

característica de ser assíncrono.

A XML foi escolhida como padrão de formato das mensagens devido a sua

grande aceitação por corporações e seu padrão aberto. Além disto, existem

várias ferramentas livres de fácil aprendizagem que podem ser utilizadas

para migrar suas aplicações para o modelo SOAP.

Figura 10: Exemplo de mensagem SOAP.

2.4.3 eXtensible Markup Language

XML é uma linguagem de marcação de uso geral, capaz de descrever

vários tipos de dados, recomendada pela W3C para a criação de outras

linguagens para uso específico. Sua função primária é o compartilhamento

de dados por diferentes sistemas, em particular, os conectados à internet.

Linguagens baseadas em XML são definidas através de um modelo formal,

permitindo que programas ou usuário possam modificar ou validar

documentos sem prévio conhecimento de sua forma.

Figura 11: Exemplo de arquivo XML.

Esta meta linguagem define um meio de descrever as informações em

uma estrutura de árvore. Isto permite a fácil visualização das próprias por

seres humanos. Por ser uma descendente da SGML, sua hierarquia de

dados é definida por tags, do mesmo modo que HTML, e também garante

uma alta estabilidade e padronização, já que a SGML é mundialmente aceita.

Por ser uma meta-lingüagem, é capaz de se definir outras linguagens,

geralmente de uso específico como a MathML (para utilização matemática) e

SyncML (sincronização de dados).

2.4.4 Web Services Description Language

Como já mencionado antes, WSDL (linguagem de descrição de

WebServices) é a linguagem utilizada para dizer ao programa cliente quais

são os métodos e atributos disponíveis no Web Service.

Segundo Cleuton Sampaio [13] um WSDL é um documento XML

baseado no esquema: http://schemas.xmlsoap.org/wsdl, que define um

WebService. Através do WSDL é possível criar um Cliente que acessa o

Web Service.

Segue abaixo um exemplo de arquivo WDSL:

<?xml version="1.0"?>

<definitions name="StockQuote"

targetNamespace="http://example.com/stockquote.wsdl" xmlns:tns="http://example.com/stockquote.wsdl" xmlns:xsd1="http://example.com/stockquote.xsd" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns="http://schemas.xmlsoap.org/wsdl/">

<types> <schema targetNamespace="http://example.com/stockquote.xsd" xmlns="http://www.w3.org/2000/10/XMLSchema"> <element name="TradePriceRequest"> <complexType> <all> <element name="tickerSymbol" type="string"/> </all> </complexType> </element> <element name="TradePrice"> <complexType> <all> <element name="price" type="float"/> </all> </complexType> </element> </schema> </types>

<message name="GetLastTradePriceInput"> <part name="body" element="xsd1:TradePriceRequest"/> </message>

<message name="GetLastTradePriceOutput"> <part name="body" element="xsd1:TradePrice"/> </message>

<portType name="StockQuotePortType"> <operation name="GetLastTradePrice"> <input message="tns:GetLastTradePriceInput"/> <output message="tns:GetLastTradePriceOutput"/> </operation> </portType>

<binding name="StockQuoteSoapBinding" type="tns:StockQuotePortType"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="GetLastTradePrice"> <soap:operation

soapAction="http://example.com/GetLastTradePrice"/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> </binding>

<service name="StockQuoteService"> <documentation>My first service</documentation> <port name="StockQuotePort" binding="tns:StockQuoteBinding"> <soap:address location="http://example.com/stockquote"/> </port> </service>

</definitions>

2.4.5 Universal Description, Discovery and Integration

UDDI é um acrônimo para Universal Description, Discovery and

Integration que é uma notação para o registro, independente de plataforma,

baseado em XML visando que organizações de todo o planeta registrem

informações, de forma centralizada, de quais serviços elas estão oferecendo.

O registro UDDI é formado de três componentes:

• Páginas Brancas: contém endereços, contatos;

• Páginas Amarelas: categorias industriais baseadas em taxonomias

padronizadas;

• Páginas Verdes: informações técnicas sobre os serviços oferecidos

pela organização.

UDDI é um dos principais padrões que fazem parte da tecnologia de

Web Services. Foi projetado para receber requisições de mensagens SOAP

e prover acesso para as interfaces WSDL que descrevem como interagir com

o serviço.

Um exemplo de registro UDDI é mostrado abaixo:

<businessEntity businessKey="ba744ed0-3aaf-11d5-80dc-002035229c64"

operator="www.ibm.com/services/uddi" authorizedName="0100001QS1"> <discoveryURLs>

<discoveryURL useType="businessEntity">http://www.ibm.com/services/uddi/uddiget?businessKey=BA744ED0-3AAF-11D5-80DC-002035229C64</discoveryURL> </discoveryURLs> <name>XMethods</name> <description xml:lang="en">Web services resource site</description> <contacts> <contact useType="Founder"> <personName>Tony Hong</personName> <phone useType="Founder" /> <email useType="Founder">[email protected]</email> </contact> </contacts> <businessServices> <businessService serviceKey="d5921160-3e16-11d5-98bf-002035229c64" businessKey="ba744ed0-3aaf-11d5-80dc-002035229c64"> <name>XMethods Delayed Stock Quotes</name> <description xml:lang="en">20-minute delayed stock quotes</description> <bindingTemplates> <bindingTemplate bindingKey="d594a970-3e16-11d5-98bf-002035229c64" serviceKey="d5921160-3e16-11d5-98bf-002035229c64"> <description xml:lang="en">SOAP binding for delayed stock quotes service</description> <accessPoint URLType="http">http://services.xmethods.net:80/soap</accessPoint> <tModelInstanceDetails> <tModelInstanceInfo tModelKey="uuid:0e727db0-3e14-11d5-98bf-002035229c64" /> </tModelInstanceDetails> </bindingTemplate> </bindingTemplates> </businessService> </businessServices></businessEntity>

3.MONITORAMENTO

O monitoramento de recursos é uma das partes mais importantes da

disponibilização de serviços e/ou recursos, pois deste modo pode-se saber

quais serviços têm sido mais acessados, como os recursos estão sendo

utilizados, quais os horários de pico, ou seja, são disponibilizados dados

importantes para o gerenciamento do grid .

A tarefa de monitoramento tem que ser feita de forma a não interferir

significantemente no processamento da máquina a ser monitorada e também

ser robusto e preciso nas informações recolhidas.

Geralmente o processo de monitorar informações provenientes de

dispositivos espalhados pela rede se dá em três etapas: recolhimento,

armazenamento e apresentação.

A etapa de recolhimento é onde se obtém os dados vindos dos

dispositivos, o que pode ser feito através de testes remotos com comandos

como ping , queso e dig, como também pela instalação de agentes nos

próprios servidores, desktops e demais elementos ativos do grid .

Após recolhidos os dados, ocorre a etapa de armazenamento, na qual

os dados obtidos na etapa de recolhimento são armazenados. Pode-se

guardar estas informações em arquivos com formatos proprietários, arquivos

textos, XML, ou em um banco de dados.

A última das três etapas consiste na disponibilização dos dados

processados para o usuário final do sistema. Pode-se usar várias tecnologias

nesta etapa, desde páginas web até softwares especializados para este fim.

Nas redes baseadas em protocolos da pilha TCP/IP existe um

procotolo já especificado para monitoramento e gerência de dispositivos

chamado SNMP (Simple Network Management Protocol) . No caso do

Globus [1], temos um sistema de monitoramento já existente que é

denominado Monitoring and Discovering System (MDS).

3.1 SNMP

O SNMP é um protocolo padrão da Internet que serve para gerenciar

vários recursos de dispositivos de rede IP. Dentro esses dispositivos estão os

ativos de rede, tais como switches, routers, modems ou então ainda

estações de trabalho e servidores. O SNMP ajuda os administradores de

redes a organizar melhor suas redes e também a saber quando ocorre um

problema.

3.1.1 Visão Geral

No mundo do gerencimanento de rede com SNMP, a base de

funcionamento está nos agentes e gerentes. Os gerentes são comumente

chamados de NMS (Network Management Stations). Essas NMS não são

nada mais que servidores rodando um software capaz de tratar as tarefas de

gerenciamento de uma rede. Esta mesma é responsável pelas operações de

polling e receber as traps dos agentes.

Uma operação de poll é o método utilizado pela NMS para fazer

alguma consulta aos seus agentes em algum ativo que está sendo

monitorado. Esses dados podem ser armazenados para futuramente gerar

estatísticas e saber se ocorreu algum sinistro no ativo. Em contra partida

uma trap é uma mensagem enviada por um agente para dizer que algo

aconteceu.

O agente é um software incorporado nos dispositivos de rede

(switches, hubs, servidores, routers) que responde às pollings da NMS e

envia as traps caso ocorra algo de anormal.

3.1.2 Comunidades

O conceito de comunidade é utilizado pelas versões 1 e 2 do protocolo

SNMP. Essas comunidades são usadas para fornecer um certo mecanismo

de autenticação. Elas são subdivididas em três tipos: read-only, read-write, e

trap. A comunidade read-only pode só ler valores mas não alterá-los, já a

comunidade read-write pode além de ler, alterar esses dados. Por último, a

comunidade trap pode apenas receber traps dos agentes.

Um agente é configurado com três strings de comunidades. Essas

strings são as senhas para a comunicação, portanto, deve-se tomar cuidado

com as senhas utilizadas. É também recomendado, que se configure no

agente o destino das traps.

Ocorre um problema com esse conceito, porque ele não utiliza

criptografia, o que faz com que essas strings sejam passadas em texto plano

pela rede.

Figura 12 : Demonstração da utilizaçao do SNMP versão 3 com MIB-II.

3.1.3 Problemas do SNMP

Como o protocolo SNMP foi projetado quando a internet estava

apenas começando a se popularizar, logo não foram consideradas várias

características de segurança na sua implementação. Várias técnicas de

firewall foram desenvolvidas na tentativa de sanar estes problemas de

segurança, que embora ajudem, não os resolvem por completo.

Somente a partir da versão 3 da especificação do protocolo foram

abordados aspectos referentes à segurança da informação que trafega pela

rede. Isto inclui certificados digitais, listas de acesso e autenticação temporal

das mensagens. Mesmo com todas estas características de segurança

implementadas, o SNMP é um protocolo binário que requer a abertura de

portas para o meio exterior, o que aumenta o risco para a segurança dos

dispositivos.

Considerando os problemas apresentados acima e levando em conta

que o próprio middleware do grid já possui um sistema próprio de

segurança, o SNMP não será utilizado neste trabalho.

3.2 MDS / WebMDS

O MDS (Monitoring and Discovery System) é um conjunto de serviços

web para monitorar e descobrir recursos e serviços no grid. Esse sistema

permite aos usuários saber quais serviços são pertencentes a determinada

VO e monitorar esses recursos. Todas estas informações são postas em um

único servidor que está à disposição dos administradores do grid.

Este sistema de monitoramento possui dois tipos de serviços: o Index

Service , que coleta dados de várias fontes e provê a visualização dos

serviços que cada VO disponibiliza; e o Trigger Service , que coleta os

dados das máquinas e pode ser configurado para agir de acordo com os

resultados da coleta.

O Index Service é um registro similar ao UDDI, mas é mais flexível. A

informação sobre os serviços é coletada e posta como propriedades do

recurso. Os índices podem ser registrados de forma hierárquica com o

objetivo de agregar informações em diferentes camadas. Cada índice tem um

tempo de vida e pode ser removido caso não seja renovado antes de

expirar.

O Trigger Service coleta a informação e compara os dados com um

conjunto de condições definidas em um arquivo de configuração. Quando

uma condição é atingida, é tomada uma ação, que pode, ser o envio de um

email ao administrador do sistema quando o disco do computador estiver

próximo de sua capacidade total.

O MDS foi depreciado, não terá novas versões e inclusive será

retirado nas próximas atualizações do GT4. Para substituí-lo, foi

desenvolvido o WebMDS que funciona de forma semelhante, porém atua

como um servlet. Para instalar este serviço se faz necessário também

instalar o Tomcat, e um dos kits de monitoramento separados: Glanglia

Information Provider e/ou Hawkeye Information Provider.

São estes kits de monitoramento que fornecem as informações para o

WebMDS disponibilizar para os usuários.

4. DESENVOLVIMENTO

4.1 Ferramentas

Para a confecção deste trabalho de conclusão de curso, foram

utilizadas ferramentas de apoio para facilitar o seu desenvolvimento.

Foi dada preferência para utilitários considerados softwares livres

visando o não pagamento de licenças de uso durante o andamento do

trabalho e principalmente quando o software desenvolvido for utilizado.

4.1.1 Eclipse IDE

“ Eclipse is an open source community whose projects are

focused on building an open development platform comprised of

extensible frameworks, tools and runtimes for building, deploying

and managing software across the lifecycle. A large and vibrant

ecosystem of major technology vendors, innovative start- ups,

universities, research institutions and individuals extend,

complement and support the Eclipse platform.”

- Fundação Eclipse

Figura 13: Ambiente de desenvolvimento utilizando Eclipse.

4.1.2 Apache Web Server

O Apache Web Server é o atual servidor web livre mais bem sucedido.

Criado em 1995 através da aplicação de vários patchs sobre o NCSA httpd

que teve seu desenvolvimento interrompido na época.

Seu desenvolvimento é ajudado pela comunidade e mantido pela

Fundação Apache, sendo seu principal projeto.

4.1.3 PHP

PHP é um acrônimo recursivo para PHP Hypertext Preprocessor

que é uma linguagem de programação orientada a objetos e voltada para ser

utilizada em páginas web.

A linguagem PHP foi criada em 1994 por Ramsus Lerdof, com

pequenos scripts e formada por um subconjunto de funções de Perl . Em

junho de 2004 foi lançada a versão 5 que incluiu várias características e

dentre elas o suporte a orientação a objetos, a tornando uma linguagem

poderosa e flexível.

Figura 14: Demonstração de código escrito em PHP.

4.1.4 GDTE (Globus Development Tools for Eclipse)

O GDTE é um projeto recém aprovado como Incubado pela Globus

Alliance. Seu objetivo é criar uma gama de ferramentas que integradas ao

framework Eclipse, se torne um poderoso ambiente de desenvolvimento para

Grid Computing .

Suas ferramentas permitem que boa parte da programação e

configuração de parâmetros necessários seja encapsulada por uma API de

desenvolvimento. Sendo assim, o desenvolvedor pode se concentrar no seu

software propriamente dito.

4.1.5 RRDTool

O RRDTool é um acrônimo para Round Robin Database . É um

sistema que armazena e gera gráficos a partir de uma base própria que é

alimentada por uma aplicação específica ou uma série de aplicações. Utiliza-

se de um padrão industrial para a geração dos gráficos.

Foi criado e é mantido por Tobias Oetiker através da comunidade

envolta no projeto. Sua licença é GPL, o que permite sua livre utilização.

Figura 15: Exemplo de gráfico gerado pelo RRDTool. Fonte: http://oss.oetiker.ch/rrdtool/index.en.html

4.1.6 Java Standard Edition

Java é uma linguagem de programação desenvolvida pela Sun

Microsystems e sua primeira versão foi lançada meados da década de

noventa.

Com uma sintaxe semelhante a linguagem C, ela chama a atenção

pela sua portabilidade em várias arquiteturas. Esta característica é garantida

graças a presença de uma máquina virtual que encapsula toda a

conversação entre o código de alto nível com o de baixo.

Outra característica a ser observada quando for utilizada é que o

código desenvolvido tem que passar por dois processos, um de compilação e

posteriormente o de interpretação. Em determinados projetos isto pode

acarretar em problemas de performance, o que não é o caso da aplicação

realizada neste trabalho.

4.2 Modelo de Desenvolvimento

O emprego de modelos de desenvolvimento de software, embora

bastante difundido no meio de desenvolvedores e analistas, não se trata um

conceito amplamente aceito e bem formado. Entende-se como uma série de

passos perante um procedimento maior que devem ser seguidosdurante o

desenvolvimento de um sistema de informação (Yourdon, 1995, p. 97).

O modelo empregado neste trabalho foi o modelo Espiral, criado em

1998 por Boehm. Dentro suas principais características, está a definição

clara de etapas que podem ser consideradas “fases”, análise de riscos e

prototipação. A cada nova estapa concluída, o software é prototipado e

testado, e é refeita uma análise de riscos sobre o que pode dar errado.

4.3 SCRG (Sistema Coletor de Recursos em Grid)

O SCRG é uma aplicação que visa recolher e armazenar informações

vitais para um administrador de servidores como carga de CPU, memória

RAM utilizada, dentre outras informações.

Estes dados tornam-se importantes na medida que os computadores

de certa VO participam do Grid e seu processamento se torna compartilhado

perante todas as outras máquinas.

Neste contexto, no qual um servidor que também serviços para

usuários da rede interna ou usuários públicos, é extremamente necessário o

monitoramento dos recursos disponibilizados.

Este monitoramento pode evitar problemas que possam gerar

desconforto para os usuários e também prever novos upgrades de

hardware.

4.3.1 Pré- Requisitos

Para a instalação do SCRG se faz necessário instalar alguns

softwares no sistema operacional. Abaixo segue a lista dos mesmos:

– Java SDK 1.5+;

– Ant 1.6+ (para instalação do Globus Toolkit);

– GNU C Compiler 3.x / 2.95.X (para instalação do Globus Toolkit);

– GNU sed (para instalação do Globus Toolkit);

– GNU tar;

– zLib 1.4.x (para instalação do Globus Toolkit);

– GNU Make (para instalação do Globus Toolkit);

– Perl (Para alguns recursos do Globus Toolkit);

– Sudo (para instalação do Globus Toolkit);

– Apache Web Server;

– PHP 5.x;

– Linux 2.6.16+ com sistema /proc;

– Globus Toolkit 4.x;

– RRDTool 1.2.12+;

– Crontab.

4.3.2 Funcionamento

A aplicação desenvolvida neste trabalho possui quatro partes bastante

distintas assim denominadas: Kolector , KolectorClient , PHP-Kolector e

Apresentação .

Cada um destes sub-sistemas se encarrega de funções específicas

para mostrar ao administrador o resultados de suas coletas de dados.

4.3.2.1 Arquivos de Configuração

Os arquivos de configuração para o funcionamento do software estão

localizados dentro do diretório /etc/scrg . São apenas dois arquivos: o

ips.conf e o config.ini .

Em ips.conf são postos os endereços IP para os quais serão

efetuadas as requisições sobre informações de recursos.

Figura 16: Demonstração do conteúdo do arquivo de configuração ips.conf.

Já no arquivo config.ini estão contidas algumas variáveis para o

funcionamento principalmente do PHP-Kolector. Abaixo segue a descrição

das mesmas:

– ips_path: caminho de onde se encontra o arquivo que contém os

endereços Ips a serem pesquisados, por padrão se localiza em

/etc/scrg/ips.conf ;

– output_path: caminho do diretório onde ficarão os HTML's da

apresentação. Precisa ser um local onde seu servidor web possa

exibi-los;

– kolector_path: caminho onde se localiza o binário do

KolectorClient;

– rrd_path: caminho para o binário do RRDTool;

– rrdupdate_path: caminho para o binário do RRDTool Update;

4.3.2.2 Sistema de arquivos /proc

O sistema de arquivos /proc encontrado no sistema operacional Linux

é uma parte importante do processo, pois é dele que são retiradas as

informações que serão passadas ao Kolector.

Ele serve para acessar várias estruturas providas pelo kernel sem

precisar utilizar funções de ioctl(), que são de certa forma complicadas de

utilizar.

Sua principal função é dar visibilidade a estatísticas sobre o sistema e

informações sobre hardware em tempo real. Através dele também é possível

setar variáveis para se fazer tunning de sistema operacional.

Os principais usos para este sub-sistema são:

– ver informações estatísticas;

– descobrir hardware;

– modificar parâmetros em tempo real;

– obter informações sobre memória e desempenho.

É importante notar que a estrutura de diretórios e informações nela

contida pode mudar de uma máquina para outra, já que essas podem possuir

hardware e configurações diferenciados.

4.3.2.3 Kolector

O Kolector é um serviço propriamente dito que foi construído sobre o

Globus. Sua função primária é coletar os dados do computador o qual está

instalado para ser acessado pelo cliente que fará a requisição por essas

informações.

As informações obtidas são: tempo desde a inicialização da máquina

(uptime) , quantidade total de memória RAM, quantidade utilizada de

memória RAM, tipo de processador, velocidade do processador, arquitetura

do computador, nome do Sistema Operacional e versão do Sistema

Operacional.

Os dados são obtidos através de pipes ao Sistema Operacional. A

fonte de obtenção dos mesmos é no sub sistema conhecido como /proc

encontrado no Sistema Operacional Linux.

Após a extração primária é feito um pequeno parsing em cima dos

dados para que os mesmos não sejam passados totalmente brutos pela

rede. Isto ajuda a não prejudicar o desempenho de link de dados. Como

última etapa são posicionados em um array chamado Status para que este

seja retornado quando for solicitado.

Todo código que faz a interatividade com o Globus Toolkit, geração de

WSDL's e XML's é gerado automaticamente pelo GTDE, somente passando

alguns parâmetros de configuração na criação do projeto inicial. O

desenvolvedor tem uma classe principal onde pode começar seu código e

expandi-lo para outras caso necessário.

Os métodos e variáveis que são acessíveis pelos outros nodos do

Grid estão precedidos respectivamente pelas diretivas @GridMethod e

@GridAttribute . No caso do Kolector, apenas o método principal

getStatus() e o array Status estão disponíveis, garantindo que a

visibilidade dos outros métodos seja interna ao próprio nodo.

Figura 17: Diagrama de Fluxo de Dados do Kolector.

4.3.2.4 KolectorClient

O KolectorClient é o sub-sistema que faz a chamada pelo Kolector

dentro do Grid e imprime na tela as informações recebidas.

O endereço IP para onde apontará sua requisição é passada por

argumento em linha de comando.

Todo o código necessário para a interação com o Globus Toolkit é

gerado automaticamente através do GDTE, deixando somente a codificação

do método principal para o programador. Um exemplo deste código é

apresentado na figura 18.

public static void main(String[] args) {

  if (args[1] == null){

System.out.println("Uso: "+ args[0] +" <endereço IP>");System.exit(0);

}  String instanceURI="http://"+ args[1] 

+":8080/wsrf/services/KolectorService";        String factoryURI="http://"+ args[1] +":8080/wsrf/services/KolectorFactoryService";

    try {      KolectorClient client = new KolectorClient(factoryURI, instanceURI);            String[] Status = client.getStatus();             int i = 0;      for (i = 0 ; i < Status.length ; i++){              System.out.println(Status[i]);      }                 } catch (Exception e) {     System.out.println("Não foi possível obter informações de Kolector no ip:" + args[1] + "\n");     e.printStackTrace();    }  }

Figura 18: Método principal do KolectorClient.

4.3.2.5 PHP- Kolector

O PHP-Kolector é o sub-sistema de interação entre todo os outros

sub-sistemas. É através dele que o serviço instalado é chamado para

execução.

Suas principais atrubuições são:

– Chamada do KolectorClient;

– Parsing dos dados obtidos;

– Criação dos diretórios (raiz e específicos para cada nodo);

– Verificação dos diretórios existentes (caso não estejam

criados, ele os cria);

– Criação das Bases RRD;

– Verificação das bases existentes (caso não estejam criadas,

ele as cria);

– Incrementação das Bases RRD;

– Geração dos HTML's;

– Geração do Menu.

Como sugere o nome, todo seu código é escrito em PHP. Para que

seu funcionamento seja automático, é preciso utilizar a Crontab com a

configuração para que seja executado a cada cinco minutos.

Os parsings feitos pelo PHP-Kolector são realizados sobre duas

variáveis, que são as de carga do processador e memória livre. O resto das

informações são utilizadas diretamente nos arquivos HTML criados através

de um template pré-estabelecido, somente substituindo pelos reais valores

encontrados.

Figura 19: Utilização de CPU.

4.3.2.6 Apresentação

Apresentacao é onde o usuário final da aplicacão, seja ele um simples

usuário ou então o administrador do Grid , verá as informacões colhidas.

Toda interacão entre ator principal e software se dá através da WWW (world

wide web) , podendo o mesmo verificar as informacões de qualquer lugar do

planeta, desde que possua permissão de acesso.

Através de uma interface simples e objetiva pode-se navegar entre os

vários nodos do e ir procurando as informacões que se deseja.

Figura 20: Demonstração do HTML gerado.

4.3.3 Processo de Instalação

Após obter o pacote compactado do software (scrg-v0.1.tgz) deve-se

decompactá-lo para começar o processo de instalação. Primeiramente crie

os diretórios /etc/scrg e /etc/scrg/rrd. Copie o arquivo config.ini que está

dentro do diretório scrg/Kolector/ para o recém-criado diretório /etc/scrg,

configure-o as próprias necessidades e execute o comando: $touch

/etc/scrg/ips.conf .

Dentro do arquivo /etc/scrg/ips.conf coloque os endereços IP (um

por linha) dos nodos pelo qual há o interesse de fazer a coleta dos dados.

Ao descompactar o arquivo da aplicação, será fornecido o arquivo

br_eti_zanetta_scrg_kolector_Kolector.gar . Neste arquivo deve-se

utilizar uma ferramenta fornecida pelo próprio Globus para fazer a instalação

do SCRG dentro do ambiente Grid. Obtém-se este processo entrando no

diretório de instalação do Globus e digitando: # globus-deploy- gar

{ localização do gar} .

Depois de executar esses passos, coloca-se o script PHP-Kolector

dentro da configuração da Crontab . Usa-se o comando 'crontab -e' para

editar a tabela e poe-se a linha a seguir : 0-55/5 * * * * { localicação do

script PHP-Kolector } .

Em torno de meia hora aponte o browser para o diretório especificado

no arquivo de configuração para verificar os gráficos e informações.

4.3.4 Testes

Os testes foram realizados em um único computador formando um

Grid de apenas de um nodo. O motivo da escolha por este método foi a

conveniência e facilidade para os mesmos fossem realizados.

A configuração básica do computador de teste é a seguinte:

– Processador Intel Centrino 1.5Ghz;

– 512Mb de memória RAM;

– 60Gb de disco rígido;

Por se tratar de uma instalação em localhost do Globus Toolkit, não

foi preciso a utilização dos módulos de Transferência de arquivos, WebMDS

e Replicação da Dados. Isso inclui os protocolos: GridFTP, RLS, RTS e

várias aplicações requeridas pelo WebMDS que possuem seus próprios

protocolos.

Os certificados utilizados para a autorização das requisições foram

fornecidos pela própria Globus Alliance, que possui certificados que servem

para testes de conectividade e funcionamento. Esses não habilitam todas as

funções do GSI, porém suas funcionalidades básicas ainda estão ativas.

Figura 21: Inicialização e encerramento do Globus.

4.3.5 Dificuldades Encontradas

Como todo trabalho exige, um grande estudo foi feito sobre o assunto.

Por ser uma área nova e ainda não amplamente explorada ainda não é fácil

achar documentacão boa e atualizada.

A codificacão de programas para o Globus Toolkit foi outra dificuldade

encontrada, já que o mesmo necessita de vários arquivos extras como

WSDL's, XML's e uma estrutura de diretórios extremamente complexos e

difíceis de se manter.

5. CONCLUSÃO

O objetivo principal deste trabalho era construir uma aplicação que

permitisse a coleta de certas informações sobre os recursos computacionais

de equipamentos pertencentes a uma grade sem que este software afetasse

ou interferisse incisivamente sobre a performance da máquina. Além disto

este software deveria ser fácil de instalar e não depender de outros

aplicativos de difícil instalação, como o WebMDS necessita.

Como demonstrado no item 4.3.1, a maioria das dependências

exitentes para o funcionamento do SCRG são as necessárias para a

instalação do próprio Globus Toolkit. As que não seguem este padrão são

facilmente encontrou adas em qualquer distribuição do sistema operacional

Linux.

Nas figuras 19 e 20 são mostradas os gráficos de utilização de CPU e

memória livre. Nesses mesmos pode-se perceber que mesmo em horário de

bastante utilização do computador, como horário de trabalho, o desempenho

em relação a estes dois aspectos estão em níveis muito satisfatórios.

Caso o projeto SCRG seja continuado, pode vir a se tornar uma

opção interessante para monitoramento de recursos computacionais para

Grids que utilizam o Globus Toolkit como middleware de comunicação.

Juntamente com o projeto desenvolvido pelo mestrando Glauco Antônio

Ludwig na universidade de Rio dos Sinos, que visa a contabilização de

utilização de CPU sobre cada processo submetido ao Grid, pode-se obter

uma arquitetura robusta e ao mesmo tempo leve para determinar dados

estatísticos sobre a grade.

Com os objetivos atingidos vizualisa-se os trabalhos futuros que são:

– Melhorar a interface, torná-la mais amigável e ergonômica;

– Elencar mais dados estatísticos e fazer a disponibilização

dos mesmos;

– Tornar o SCRG utilizável para mais sistemas operacionais

como OpenBSD, FreeBSD;

– Disponibilizar gráficos temporais de mês e ano;

– Realizar testes em grades reais e não somente em

ambiente simulado.

Finalizando, o SCRG torna a tarefa de monitoramento mais fácil,

rápida e leve, permitiondo que inclusive equipamentos desktop participem da

grade. Assim sendo o projeto descrito neste trabalho, torna-se uma

alternativa muito interessante ao sistema nativo do próprio Globus Toolkit.

6. REFERÊNCIAS BIBLIOGRÁFICAS

[1] The Globus Project, Globus Alliance, http://www.globus.org

[2] The GridBus Project, Universidade de Melbourne, GRIDS Lab,

http://www.gridbus.org

[3] InteGrade, Universidade de São Paulo,

http://gsd.ime.usp.br/integrade/

[4] OurGrid Projetc, Universidade Federal de Campina Grande,

http://www.ourgrid.org

[5] COULOURIS, George; DOLLIMORE, Jean; KINDBERG, Tim;

Distributed Systems, Concepts and Design; 3rd Edition; Editora Addison

Wesley, Ano 2001.

[6] CHEDE, Cezar Taurion; Grid Computing: Um Novo Paradigma

Computcional; 1a Edição; Editora Brasport, Ano 2004.

[7] GLOBUS ALLIANCE, Installing GT 4.0 (System Administrator

Guide. Disponível em

<http://www.globus.org/toolkit/docs/4.0/admin/docbook/>. Acesso em 24 de

junho de 2005.

[8] GLOBUS ALLIANCE, GT4 Key Concepts (A Globus Primer).

Disponível em:

<http://www.globus.org/toolkit/docs/4.0/admin/docbook/admin.pdf>. Acesso

em 01 de julho de 2005.

[9] GLOBUS ALLIANCE, GT 4.0 Component Fact Sheet: WS MDS

WebMDS. Disponível em:

<http://www.globus.org/toolkit/docs/4.0/info/webmds/WSMDSWebMDSFacts.

html>. Acesso em 29 de junho de 2005.

[10] THE GLOBUS SECURITY TEAM, Globus Toolkit Version 4 Grid

Security Infrastrutucre: A Standards Perspective, Version 4, 12 de Setembro

de 2005.

[11] WIKIPEDIA, Disponível em:

<http://en.wikipedia.org/wiki/Web_service>. Acesso em 07 de junho de 2006.

[12] WORLD WIDE WEB CONSORTIUM, Disponível em:

<http://www.w3.org/>. Acesso em 07 de junho de 2006.

[13] BERSTIS Viktor, Fundamentals of Grid Computing, RedBooks

Paper IBM, 2002.

[14] FERREIRA Luis, BERSTIS Viktor, ARMSTRONG Jonathan, et al,

Introduction to Grid Computing with Globus, RedBooks Paper IBM, 2003.

[15] FERREIRA Luis, WILSON B. Lee, MOSBY Dennis, et al, Grid

Computing with IBM Grid Tool Box, RedBooks Paper IBM, 2004.

7. APÊNDICE

7.1 Apêndice 1: Código Java do Kolector

package br.eti.zanetta.scrg.kolector;

import java.io.InputStream;

import de.fb12.gdt.GridService;

import de.fb12.gdt.GridAttribute;

import de.fb12.gdt.GridMethod;

@GridService (name = "Kolector",

namespace = "http://susie.zanetta.eti.br/scrg/kolector",

targetPackage = "br.eti.zanetta.scrg.kolector",

serviceStyle = "SSTYLE_FACTORY",

resourceStyle = "RSTYLE_MAGE",

operationProvider = "GetRPProvider")

public class Kolector {

@GridAttribute private String[] status;

@GridMethod public String[] getStatus() {

Runtime runtime = Runtime.getRuntime();

this.makeCPU(runtime);

this.makeMem(runtime);

this.makeProperties(runtime);

this.makeUptime(runtime);

return status;

}

public void setStatus(String[] status) {

this.status = status;

}

private void makeUptime(Runtime runtime){

try {

Process processo = runtime.exec("uptime");

processo.waitFor();

InputStream input = processo.getInputStream();

int output;

while ((output = input.read()) != -1) {

status[7] = (String) (status[7] + (char)output);

}

input.close();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

private void makeMem(Runtime runtime){

/*

* Descobrindo memória total

*/

try {

Process processo = runtime.exec("cat /proc/meminfo |grep

'MemTotal' | cut -d : -f2 ");

processo.waitFor();

InputStream input = processo.getInputStream();

int output;

while ((output = input.read()) != -1) {

status[2] = (String) (status[2] + (char)output);

}

input.close();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

try {

Process processo = runtime.exec("cat /proc/meminfo |grep

'MemFree' | cut -d : -f2 ");

processo.waitFor();

InputStream input = processo.getInputStream();

int output;

while ((output = input.read()) != -1) {

status[3] = (String) (status[3] + (char)output);

}

input.close();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

private void makeCPU(Runtime runtime){

/**

* Descobrindo Modelo do processador

*/

try {

Process processo = runtime.exec("cat /proc/cpuinfo |grep name

| cut -d : -f2 ");

processo.waitFor();

InputStream input = processo.getInputStream();

int output;

while ((output = input.read()) != -1) {

status[0] = (String) (status[0] + (char)output);

}

input.close();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

/**

* Descobrindo quantidade de MHz

*/

try {

Process processo = runtime.exec("cat /proc/cpuinfo |grep 'cpu

MHz' | cut -d : -f2 ");

processo.waitFor();

InputStream input = processo.getInputStream();

int output;

while ((output = input.read()) != -1) {

status[1] = (String) (status[1] + (char)output);

}

input.close();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

private void makeProperties(Runtime runtime){

this.status[4] = (String)System.getProperty("os.arch");

this.status[5] = (String)System.getProperty("os.name");

this.status[6] = (String)System.getProperty("os.version");

}

7.2 Apêndice 2: Código Java do KolectorClient:

package br.eti.zanetta.scrg.kolector.client;import org.apache.axis.message.addressing.Address;import org.apache.axis.message.addressing.EndpointReferenceType;import org.globus.axis.util.Util;import java.rmi.RemoteException;import br.eti.zanetta.scrg.kolector.impl.*;//import br.eti.zanetta.scrg.kolector.stubs.*;//import br.eti.zanetta.scrg.kolector.stubs.bindings.*;//import br.eti.zanetta.scrg.kolector.stubs.service.*;import br.eti.zanetta.scrg.kolector.kolectorService.stubs.*;import br.eti.zanetta.scrg.kolector.kolectorService.stubs.bindings.*;import br.eti.zanetta.scrg.kolector.kolectorService.stubs.service.*;import org.oasis.wsrf.lifetime.Destroy;import org.oasis.wsrf.properties.GetResourcePropertyResponse;import org.oasis.wsrf.properties.InvalidResourcePropertyQNameFaultType;import org.oasis.wsrf.properties.ResourceUnknownFaultType;import org.apache.axis.types.URI.MalformedURIException;import javax.xml.rpc.ServiceException;import org.oasis.wsrf.lifetime.ResourceNotDestroyedFaultType;import org.apache.commons.beanutils.BeanUtils;import java.lang.reflect.InvocationTargetException;import java.util.Iterator;import java.util.List;

public class KolectorClient implements KolectorNamespaces{

  static {   Util.registerTransport();  }

  private KolectorPortType port =null;

  private String instanceURI="http://127.0.0.1:8080/wsrf/services/KolectorService";

  private String factoryURI="http://127.0.0.1:8080/wsrf/services/KolectorFactoryService";

  private KolectorFactoryPortType factoryPort = null;

  public KolectorPortType getPort(String factoryURI, String instanceURI) throws MalformedURIException, ServiceException, RemoteException {    KolectorFactoryServiceAddressingLocator factoryLocator = new KolectorFactoryServiceAddressingLocator();     EndpointReferenceType factoryEPR, instanceEPR;    KolectorServiceAddressingLocator locator = new KolectorServiceAddressingLocator();    factoryEPR = new EndpointReferenceType();    factoryEPR.setAddress(new Address(factoryURI));

    factoryPort = factoryLocator.getKolectorFactoryPortTypePort(factoryEPR);    CreateResourceResponse createResponse = factoryPort      .createResource(new CreateResource());    instanceEPR = createResponse.getEndpointReference();    KolectorPortType port = locator.getKolectorPortTypePort(instanceEPR);    return port;  }  public KolectorClient(String factoryURI,String instanceURI) throws MalformedURIException, RemoteException, ServiceException {   this.port=getPort(factoryURI,instanceURI);this.factoryURI=factoryURI;   this.instanceURI=instanceURI;  }

/** * * @generated */public java.lang.String[] getStatus() throws RemoteException  {

java.lang.String[] retVal=  port.getStatus(new GetStatus()).getGetStatusReturn();

return retVal;

}

/** * @generated */public org.oasis.wsrf.properties.GetResourcePropertyResponse 

getResourceProperty(javax.xml.namespace.QName getResourcePropertyRequest) throws org.oasis.wsrf.properties.InvalidResourcePropertyQNameFaultType, org.oasis.wsrf.properties.ResourceUnknownFaultType, RemoteException              {                return port.getResourceProperty(getResourcePropertyRequest);              }

/** * @generated */public org.oasis.wsrf.properties.GetResourcePropertyResponse 

getStatusAsResourceProperty() throws Exception, InvalidResourcePropertyQNameFaultType, ResourceUnknownFaultType, RemoteException {     return getResourceProperty(RP_STATUS);

}

    public static void main(String[] args) {

  if (args[1] == null){

System.out.println("Uso: "+ args[0] +" <endereço IP>");System.exit(0);

}  

String instanceURI="http://"+ args[1] +":8080/wsrf/services/KolectorService";        String factoryURI="http://"+ args[1] +":8080/wsrf/services/KolectorFactoryService";

    try {      KolectorClient client = new KolectorClient(factoryURI, instanceURI);            String[] Status = client.getStatus();             int i = 0;      for (i = 0 ; i < Status.length ; i++){              System.out.println(Status[i]);      }                 } catch (Exception e) {     System.out.println("Não foi possÃvel obter informações de Kolector no ip:" + args[1] + "\n");     e.printStackTrace();    }  }

}