Um Middleware para o Gerenciamento de Clusters de

Propaganda
UIVERSIDADE ESTADUAL DO CEARÁ – UECE
Centro de Ciências Tecnológicas - CCT
ISTITUTO FEDERAL DE EDUCAÇÃO, CIÊCIA
E TECOLOGIA DO CEARÁ - IFCE
Diretoria de Ensino – DIRE
MESTRADO PROFISSIOAL EM COMPUTAÇÃO APLICADA – MPCOMP
CICERO TADEU PEREIRA LIMA FRAÇA
Um Middleware para o Gerenciamento de Clusters
de SGBDs Heterogêneos
FORTALEZA – CEARÁ
Setembro de 2010
CICERO TADEU PEREIRA LIMA FRAÇA
Um Middleware para o Gerenciamento de Clusters
de SGBDs Heterogêneos
Dissertação apresentada ao Curso de Mestrado
Profissional em Computação Aplicada da Universidade
Estadual do Ceará e Instituto Federal de Educação,
Ciência e Tecnologia do Ceará como requisito parcial
necessário para obtenção do grau de Mestre em
Computação Aplicada, área de concentração: Redes de
Computadores
Orientador: Prof. Dr. Cidcley Teixeira de Souza
FORTALEZA – CE
Setembro de 2010
F814m
França, Cicero Tadeu Pereira Lima
Um Middleware para o Gerenciamento de Clusters de SGBDs
Distribuídos / Cícero Tadeu Pereira Lima França - Fortaleza,
2010.
114 p.
Orientador: Prof. Dr. Cidcley Teixeira de Souza
Dissertação do Curso de Mestrado Profissional em
Computação Aplicada (MPCOMP) - Universidade Estadual do
Ceará e Instituto Federal de Educação, Ciência e Tecnologia do
Ceará.
1. Banco de Dados 2. SGBDD 3. Cluster
4.
Middleware.
Universidade
Estadual
do
Ceará,
Centro de Ciências e Tecnologia.
CDD: 001.6
Título do trabalho: Um Middleware para o Gerenciamento de Clusters de SGBDs
Distribuídos
Autor: Cicero Tadeu Pereira Lima França
Defesa em: 01/09/2010
Banca Examinadora
Cidcley Teixeira de Souza, DSc (IFCE)
Presidente (Orientador)
Verônica Lima Pimentel de Sousa, DSc (IFCE)
Membro Interno
José Maria da Silva Monteiro Filho, DSc (UFC)
Membro Externo
À minha esposa Ylane, e aos meus filhos Lucas Gabriel e Cibelle.
Agradecimentos
À DEUS, que sempre mostra o caminho correto em momentos incertos.
À minha esposa Ylane pelo apoio irrestrito em todos os momentos, sempre elevando
minha auto-estima nas horas difíceis.
Ao meu filho Lucas Gabriel que, mesmo com três anos de idade, aceitava as
ausências do pai durante este mestrado.
À minha filha Cibelle, que nasceu no mesmo período da defesa desta dissertação.
À minha mãe Terezinha, por sempre ter ensinado aos filhos que o estudo é
importante na vida das pessoas.
À minha tia-madrinha Cicera, pelo acolhimento e carinho que sempre me foi dado.
À minha já falecida avó materna Quitéria, pelo exemplo de bondade e serenidade.
Ao meu orientador Prof. Cidcley Teixeira de Souza, pelo tempo dedicado no
direcionamento e incentivo, sempre apoiando nos momentos mais difíceis.
Ao MPCOMP, aos que representam a coordenação, Prof. Marcos Negreiros, Profa.
Verônica Pimentel, Prof. Klécius, e aos secretários Ton e Érika, meus sinceros
agradecimentos pelo apoio institucional no final desta caminhada.
Ao IFCE – Campus Juazeiro do Norte, por proporcionar as condições de trabalho na
fase final deste trabalho.
Resumo
Este trabalho apresenta um middleware para ser utilizado com SGBDRs (Sistemas
de Gerenciamento de Bancos de Dados Relacional) que usam a arquitetura cliente-servidor
de duas camadas. O middleware tem a finalidade de aumentar a eficiência dos SGBDRs em
relação a escalabilidade, através do gerencia de um cluster de SGBDRs.
Os SGBDRs com arquitetura cliente-servidor de duas camadas têm como
desvantagem a baixa escalabilidade. A única maneira de aumentar a escalabilidade de um
SGBDR nesse tipo de arquitetura é trocando o servidor de dados por outro com poder
computacional maior. O middleware apresentado neste trabalho aumenta a escalabilidade
dos SGBDRs citados, gerenciando a distribuição horizontal dos dados e mantendo o
balanceamento de carga dentro do cluster de SGBDRs.
Palavras-chave: Banco de Dados, SGBDR, Cluster, Middleware, Distribuição de
Dados, Balanceamento de Carga.
Abstract
This project shows a middleware to be used with RDBMS (Relational Database
Management System) that use the client-server architecture of two tier. The middleware has
a the objective to increase the efficiencies of the RDBMS in order to a relation with scales,
through a RDBMS cluster management.
The RDBMS with client-server architecture of two tier has as an disadvantage the
low scales. The only way to increase the scale of a RDBMS n this type of architecture is
changing the data servers by another one with a bigger computer power. The middleware
shown in this project increases the scales of the mentioned RDBMS, managing the
horizontal data distribution and keeping the balance inside the cluster of RDBMS.
Keywords: Database, RDBMS, Cluster, Middleware, Data Distribution, Load
Balancing.
Lista de Figuras
Figura 1.1 – Arquitetura cliente-servidor de duas camadas
Figura 2.1 – A arquitetura física centralizada
Figura 2.2 – A arquitetura física cliente/servidor de duas camadas
Figura 2.3 – A arquitetura lógica cliente/servidor de três camadas
Figura 2.4 – Um elemento XML complexo chamado <projetos>
Figura 3.1 – Arquitetura física Real Application Clusters
Figura 3.2 – Sistema de balanceamento de carga
Figura 3.3 – Sistema de alta disponibilidade
Figura 3.4 – Replicação em Cascata
Figura 3.5 – Replicação continua após uma falha
Figura 3.6 – Arquitetura do ParGRES
Figura 3.7 – Arquitetura do modelo de mediador proposto por Tercilio Junior
Figura 3.8 – Exemplo de RAIDb-0
Figura 3.9 – Exemplo de RAIDb-1
Figura 3.10 – Exemplo de RAIDb-2
Figura 3.11 – Exemplo de RAIDb-1-0
Figura 3.12 – Exemplo de RAIDb-0-1
Figura 4.1 – Middleware proposto
Figura 4.2 – Diagrama de caso de uso sintético
Figura 4.3 – Diagrama de caso de uso básico
Figura 4.4 – Exemplo de arquivo XML gerado pelo middleware
Figura 4.5 – Diagrama de classe do LUCAS
Figura 4.6 – Diagrama de classe do GABRIEL
Figura 4.7 – Diagrama de Seqüência – Incluir registro independente
Figura 4.8 – Diagrama de Seqüência – Incluir registro dependente
Figura 4.9 – Fluxograma para inclusão de dados
Figura 4.10 – Diagrama de Seqüência – Alterar registro
Figura 4.11 – Fluxograma para alteração de dados
Figura 4.12 – Diagrama de Seqüência – Excluir registro
Figura 4.13 – Fluxograma para exclusão de dados
Figura 4.14 – Diagrama de Seqüência – Consultar via SetConsultar
Figura 4.15 – Fluxograma para consultar dados via SetConsultar
Figura 4.16 – Diagrama de Seqüência – Consultar via SetConsultarSQL
Figura 5.1 – Aplicativo GABRIEL
Figura 5.2 – Aplicativo Cliente
Figura 5.3 – Aplicativo Configura Cliente
Figura 5.4 – Gráfico do percentual médio de desempenho da CPU na inclusão de dados
Figura 5.5 – Gráfico do percentual médio da utilização da rede na inclusão de dados
Figura 5.6 – Gráfico do percentual médio de desempenho da CPU na alteração de dados
Figura 5.7 – Gráfico do percentual médio da utilização da rede na alteração de dados
Figura 5.8 – Gráfico do percentual médio de desempenho da CPU na consulta de dados
Figura 5.9 – Gráfico do percentual médio da utilização da rede na consulta de dados
Lista de Tabelas
Tabela 2.1 – Exemplo de fragmentação de uma relação inteira
Tabela 2.2 – Exemplo de fragmentação horizontal
Tabela 2.3 – Exemplo de fragmentação vertical
Tabela 4.1 – Incluir registro independente
Tabela 4.2 – Incluir registro dependente
Tabela 4.3 – Alterar registro
Tabela 5.1 – Percentual médio de desempenho da CPU no processo de inclusão de dados
Tabela 5.2 – Percentual médio da utilização da rede no processo de inclusão de dados
Tabela 5.3 – Tabelas dos SGBDRs após o processo de inclusão de dados
Tabela 5.4 – Percentual médio de desempenho da CPU no processo de alteração de dados
Tabela 5.5 – Percentual médio da utilização da rede no processo de alteração de dados
Tabela 5.6 – Percentual médio de desempenho da CPU no processo de consulta de dados
Tabela 5.7 – Percentual médio da utilização da rede no processo de consulta de dados
Tabela A.1 – Atributos da classe LUCAS
Tabela A.2 – Métodos da classe LUCAS
Tabela B.1 – Atributos da classe ClientSocket
Tabela B.2 – Métodos da classe ClientSocket
Tabela C.1 – Atributos da classe GABRIEL
Tabela C.2 – Métodos da classe GABRIEL
Tabela D.1 – Atributos da classe ServerSocket
Tabela D.2 – Métodos da classe ServerSocket
Tabela E.1 – Atributos da classe SQLConnect
Tabela E.2 – Métodos da classe SQLConnect
Tabela G.1 – Chamadas aos métodos da classe LUCAS
Tabela G.2 – Métodos auxiliares utilizados na sobrecarga
Tabela G.3 – Resumo das configurações dos computadores usados no teste
Lista de Abreviaturas
ANSI
American National Standards Institute
API
Application Program Interface
BDD
Banco de Dados Distribuído
CQP
Cluster Query Processor
CRM
Customer Relationship Management
DBA
Database Administrator
DCL
Data Control Language
DDL
Data Definition Language
DML
Data Manipulation Language
DQL
Data Query Language
DTL
Data Transaction Language
ERP
Enterprise Resource Planning
ISO
International Organization for Standardization
JDBC
Java Database Connectivity
JDK
Java Development Kit
JVM
Java Virtual Machine
LAN
Local Area Network
NQP
Node Query Processor
ODBC
Open Data Base Connectivity
POO
Programação Orientada a Objeto
RAC
Real Application Cluster
RAID
Redundant Array of Inexpensive Drives
RAIDb
Redundant Array of Inexpensive Databases
SEQUEL
Structured English Query Language
SGBD
Sistema Gerenciador de Banco de Dados
SGBDD
Sistema Gerenciador de Banco de Dados Distribuído
SGBDOR Sistema de Gerenciamento de Bancos de Dados Objeto-Relacional
SGBDR
Sistema Gerenciador de Bancos de Dados Relacional
SOA
Service Oriented Architecture
SQL
Structured Query Language
UML
Unified Modeling Language
XML
eXtensible Markup Language
W3C
World Wide Web Consortium
WAN
Wide Area Network
WWW
World Wide Web
Sumário
Capítulo 1 ................................................................................................................................ 1
Introdução ............................................................................................................................... 1
1.1. Motivação ................................................................................................................ 1
1.2. Descrição do Problema ........................................................................................... 2
1.3. Solução Proposta ..................................................................................................... 3
1.4. Organização da Dissertação ................................................................................... 4
Capítulo 2 ................................................................................................................................ 5
Fundamentação Teórica .......................................................................................................... 5
2.1. Computação Distribuída.......................................................................................... 5
2.1.1. Comunicação entre Processos .............................................................................. 5
2.1.1.1. Comunicação Síncrona e Assíncrona ................................................................ 6
2.1.1.2. Troca de Mensagens .......................................................................................... 6
2.1.1.3. Falhas de Comunicação .................................................................................... 7
2.1.1.4. Transmissão de Mensagens por Sockets ............................................................ 7
2.1.2. Cluster ................................................................................................................... 8
2.1.3. Grid Computing .................................................................................................... 9
2.1.3.1. Diferenças entre Cluster e Grid Computing .................................................... 10
2.1.4.Middleware .......................................................................................................... 10
2.2. Banco de Dados ..................................................................................................... 11
2.2.1. Banco de Dados e Sistema Gerenciador de Banco de Dados ............................ 11
2.2.2. Modelos de Bancos de Dados ............................................................................. 12
2.2.3. Arquiteturas de Banco de Dados ........................................................................ 13
2.2.3.1. Arquitetura Centralizada ................................................................................. 13
2.2.3.2. Arquitetura Cliente-Servidor de Duas Camadas ............................................. 13
2.2.3.3. Arquitetura Cliente-Servidor de Três Camadas .............................................. 14
2.2.3.4. Arquitetura Distribuída ................................................................................... 15
2.2.3.4.1. Vantagens...................................................................................................... 16
2.2.3.4.2. Desvantagens ................................................................................................ 16
2.2.3.4.3. Fragmentação de Dados ............................................................................... 16
2.2.3.4.4. Replicação de Dados .................................................................................... 18
2.2.4. SQL ..................................................................................................................... 19
2.2.5. XML .................................................................................................................... 20
2.3. Conclusão .............................................................................................................. 21
Capítulo 3 .............................................................................................................................. 23
Trabalhos Relacionados ........................................................................................................ 23
3.1. Oracle 10g ............................................................................................................. 23
3.1.1. Real Application Cluster ..................................................................................... 23
3.1.1.1. Arquitetura do Real Application Cluster ......................................................... 24
3.1.2. Oracle Clusterware............................................................................................. 24
3.1.3. Escalabilidade .................................................................................................... 25
3.1.4. Pontos Fracos na Solução da Oracle 10g .......................................................... 25
3.2. PostgreSQL ............................................................................................................ 25
3.2.1. PGCluster ........................................................................................................... 25
3.2.2. PGPool................................................................................................................ 27
3.2.3. Slony-I ................................................................................................................. 27
3.2.4. ParGRES ............................................................................................................. 29
3.2.4.1. Arquitetura ....................................................................................................... 30
3.2.4.2. Cluster Query Processor ................................................................................. 30
3.2.5. Pontos Fracos nas Soluções do PostgreSQL ...................................................... 30
3.3. Modelo para o Compartilhamento de Bases de Dados Distribuídas e
Heterogêneas ................................................................................................................ 30
3.3.1. Atores .................................................................................................................. 31
3.3.2. Classes ................................................................................................................ 32
3.3.3. Pontos Fracos do Middleware ............................................................................ 33
3.4. Sequoia................................................................................................................... 33
3.4.1. Arquitetura .......................................................................................................... 33
3.4.2. RAIDb ................................................................................................................. 33
3.4.2.1. RAIDb-0 ........................................................................................................... 34
3.4.2.2. RAIDb-1 ........................................................................................................... 34
3.4.2.3. RAIDb-2 ........................................................................................................... 35
3.4.2.4. Aninhamento de RAIDb ................................................................................... 35
3.4.3. Pontos Fracos do Sequoia .................................................................................. 35
3.5. Conclusão .............................................................................................................. 36
Capítulo 4 .............................................................................................................................. 38
O Middleware LUCAS-GABRIEL ...................................................................................... 38
4.1. Introdução .............................................................................................................. 38
4.2. Diagrama de caso de uso....................................................................................... 39
4.3. Diagrama de classe ............................................................................................... 42
4.3.1. LUCAS ................................................................................................................ 42
4.3.2. GABRIEL ............................................................................................................ 44
4.4. Diagrama de seqüência ......................................................................................... 45
4.4.1. Incluir.................................................................................................................. 45
4.4.1.1. Incluir registro independente........................................................................... 45
4.4.1.2. Incluir registro dependente .............................................................................. 49
4.4.2. Alterar ................................................................................................................. 53
4.4.3. Excluir ................................................................................................................. 55
4.4.4. Consultar ............................................................................................................ 57
4.4.4.1. SetConsultar..................................................................................................... 57
4.4.4.2. SetConsultarSQL ............................................................................................. 58
4.5. Fluxos alternativos e Funcionalidade ................................................................... 59
4.6. Conclusão .............................................................................................................. 60
Capítulo 5 .............................................................................................................................. 62
Validação .............................................................................................................................. 62
5.1. DLL “LUCAS” ...................................................................................................... 62
5.2. Aplicativo “GABRIEL” ......................................................................................... 62
5.3. Aplicativo “Cliente” .............................................................................................. 63
5.4. Aplicativo “Configura Cliente”............................................................................. 64
5.5. Cenário .................................................................................................................. 64
5.6. Casos de Validação ............................................................................................... 65
5.6.1. Incluir Dados ...................................................................................................... 66
5.6.2. Alterar Dados ..................................................................................................... 70
5.6.3. Consultar Dados ................................................................................................. 71
5.7. Análise da validação .............................................................................................. 73
5.8. Conclusão .............................................................................................................. 74
Capítulo 6 .............................................................................................................................. 75
Conclusão e Trabalhos Futuros............................................................................................. 75
6.1. Síntese da Dissertação ........................................................................................... 75
6.2. Conclusão .............................................................................................................. 75
6.2.1. Vantagens do Middleware .................................................................................. 76
6.2.2. Limitações do Middleware.................................................................................. 77
6.3. Dificuldades Encontradas...................................................................................... 77
6.4. Trabalhos Futuros ................................................................................................. 78
Apêndice A ........................................................................................................................... 80
Apêndice B ........................................................................................................................... 84
Apêndice C ........................................................................................................................... 86
Apêndice D ........................................................................................................................... 90
Apêndice E ............................................................................................................................ 91
Apêndice F ............................................................................................................................ 93
Apêndice G ........................................................................................................................... 95
Referências ............................................................................................................................ 98
1
Capítulo 1
Introdução
Nos tempos atuais a informação é um bem imprescindível. Contudo deve-se unir a
isso a necessidade de obtê-las de maneira eficiente e rápida. Este cenário leva ao
nascimento de muitas idéias com o intuito de aperfeiçoar (i) o armazenamento de dados e
(ii) a busca por um processo eficiente para fazer o armazenamento de dados.
1.1. Motivação
Com o fim da reserva de mercado para produtos de informática – Lei Federal
nº 8.248/91 – o parque computacional empresarial no Brasil começou a “existir”. Até então
raras empresas tinham um ou mais computadores.
Levando este cenário para o lado das redes de computadores a situação se agravava.
Se empresas com um computador era fato raro e com mais de um computador fato
raríssimo, o que falar das empresas que tinham mais de um computador e que os ligavam
em rede? Hoje é inimaginável uma empresa não interligar seus computadores numa rede de
computadores, mas no início da década de 1990 isso era muitas vezes tratado com descaso.
A quase inexistência de redes computacionais vinha de vários fatores. Um dos
fatores mais importante eram os softwares, uma vez que os mesmos eram criados para
automatizar processos, mas esses processos automatizados não eram integrados. Cada setor
tinha seu próprio software que armazenava suas próprias informações e essas informações
não eram compartilhadas por outros setores da mesma empresa.
Quase duas décadas depois este cenário mudou consideravelmente. Nos dias atuais
raramente encontra-se uma empresa no Brasil que não tenha um ou mais computadores. As
informações são compartilhadas entre os vários setores da empresa, o que elevou as redes
de computadores para o nível de tecnologia essencial no mundo empresarial.
Por outro lado, as empresas sabem que os dados armazenados podem e devem ser
convertidos em dividendos. Manter os dados em locais seguros é visto por alguns como
uma estratégia de mercado, mas não basta apenas mantê-los seguros, a empresa tem que ser
capaz de acessar esses dados.
2
A busca e cruzamento dos dados armazenados podem gerar novas oportunidades de
negócios. Por este motivo, todo esforço físico imposto no armazenamento de dados de nada
servirá, caso o empresário não tenha como obter esses dados de maneira fácil e rápida.
A agilidade na obtenção dos dados pode ser afetada pela tecnologia e arquitetura de
armazenamento de dados utilizada. Os SGBDRs com arquitetura cliente-servidor de duas
camadas são amplamente usados na atualidade, mas esses tipos de SGBDs têm como
desvantagem baixa escalabilidade.
As soluções existentes, para resolver a baixa escalabilidade dos SGBDRs com
arquitetura cliente-servidor de duas camadas. Essas soluções são onerosas, pois requerem a
aquisição de licenças caras de SGBD, ou a alteração dos sistemas já implantados na
empresa, ou ainda a criação de uma estrutura de hardware. As empresas de pequeno e
médio porte não têm o aporte financeiro necessário para adotarem as soluções existentes.
Este trabalho propõe uma solução, para resolver o problema de escalabilidade, menos
onerosa que as soluções existentes.
1.2. Descrição do Problema
Com o aumento da necessidade de armazenamento de grandes volumes de dados,
problemas e soluções foram surgindo. Um deles está relacionado com sistemas
centralizados de Maiframe e com hardwares capazes de armazenar e processar grandes
volumes de dados.
A criação de softwares capazes de manter grandes volumes de dados seguros e
disponíveis, também passou a ser uma necessidade, pois a perda de dados poderia ocasionar
danos, dependendo do domínio onde os dados estavam sendo usados.
Para ilustrar este cenário, idealize uma pane no armazenamento de dados da bolsa
de valores de Nova York, onde os valores das ações negociadas desaparecessem, e a sua
recuperação não fosse possível. A desordem se instalaria no sistema financeiro mundial.
Constatou-se que o armazenamento de dados mais comum, entre as pequenas e
médias empresas, utiliza o modelo de bancos de dados relacional com arquitetura
cliente-servidor de duas camadas. Nessa arquitetura, vários clientes ficam conectados em
um único servidor (figura 1.1). A grande vantagem dessa arquitetura é a facilidade do
gerenciamento centralizado dos dados, mas, em contrapartida, o servidor é responsável por
armazenar todos os dados num único ponto.
3
Cliente
Cliente
Cliente
Cliente
Cliente
Memória
Servidor
Figura 1.1 – Arquitetura cliente-servidor de duas camadas
A falta de escalabilidade é um problema que impacta diretamente sobre a rotina
diária das empresas. Com o constante aumento no volume de dados e na quantidade de
clientes conectados no servidor, as solicitações de manipulação e consultas dos dados
passam a sofre degradação no seu processamento.
As grandes empresas conseguem resolver o problema de escalabilidade com
investimentos financeiros altos, adquirindo licenças de softwares ou infra-estrutura de
hardware. As pequenas e médias empresas não têm como investir valores elevados para
reverter esse problema. Mas independente do tamanho da empresa, a escalabilidade é um
problema presente e sua solução merece atenção, pois a agilidade na obtenção dos dados é
tão importante para a tomada de decisão quanto a disponibilidade dos dados.
1.3. Solução Proposta
O middleware proposto nesta dissertação tem como foco principal a escalabilidade
associada a independência do SGBDR. Ele soluciona o problema de escalabilidade numa
estrutura de armazenamento de dados que pode ser tanto homogênea quanto heterogênea. O
problema de escalabilidade é resolvido através da distribuição dos dados horizontalmente
entre várias instâncias de SGBDRs sem interferir, contudo, na maneira como os dados são
gerenciados nesses servidores.
O middleware trata o problema de escalabilidade dos SGBDRs com arquitetura
cliente-servido de duas camadas. Para isso o middleware fornecerá um ambiente de
distribuição de dados, possibilitará um acesso simplificado aos dados distribuídos e tornará
4
a distribuição destes dados transparentes aos outros sistemas. O middleware simplificará as
solicitações, proporcionando a interação entre os sistemas clientes e os dados distribuídos
de maneira transparente.
1.4. Organização da Dissertação
No capítulo 2 são apresentados fundamentos teóricos, tais como os conceitos de
comunicação entre processos, troca de mensagem, transações concorrentes e uma visão
geral sobre cluster e grid computing. Banco de dados e suas principais características,
alguns modelos de banco de dados e as arquiteturas de banco de dados mais comuns,
também estão contidos no capítulo 2.
A arquitetura do banco de dados Oracle 10g com a tecnologia baseada em grid
computing, desenvolvida para dar suporte aos componentes que oferecem alta
disponibilidade, escalabilidade, e proteção contra falhas é apresentada no capítulo 3. Este
capítulo discute ainda o banco de dados PostgreSQL com suas soluções para os mesmos
problemas, assim como o middleware Sequoia e um modelo para o compartilhamento de
bases de dados distribuídas.
O middleware proposto é apresentado no capítulo 4. Sua validação, a descrição do
ambiente de teste, os casos de teste e os resultados são mostrados no capítulo 5.
No último capítulo são apresentados algumas considerações finais, além das
conclusões obtidas, dificuldade encontradas e os trabalhos futuros a serem realizados.
5
Capítulo 2
Fundamentação Teórica
Antes de apresentar o middleware proposto, se torna necessário esclarecer alguns
conceitos básicos que levaram a concepção desta proposta. Como o middleware proposto
tem a finalidade de gerenciar a distribuição do armazenamento de dados entre banco de
dados homogêneos e/ou heterogêneos, duas áreas do conhecimento – Computação
Distribuída e Banco de Dados – devem ser apresentadas para o melhor entendimento da
solução proposta.
2.1. Computação Distribuída
Nesta seção são discutidos alguns conceitos sobre sistemas distribuídos. Não é
pretensão desta seção exaurir o tema, uma vez que alguns dos tópicos apresentados têm
informações e contestações suficientes para justificar a quantidade de livros, artigos, entre
outras publicações acadêmicas.
2.1.1. Comunicação entre Processos
Processos que rodam em vários sistemas finais podem comunicar-se. Segundo
[KUROSE, 2006] “Um processo pode ser imaginado como um programa que está rodando
dentro de um sistema final.”. Quando os processos estão rodando no mesmo sistema final é
usada a comunicação interprocessos que é resolvida pelo sistema operacional final que
define suas regras com base na proposta do seu projeto de criação e desenvolvimento.
“Co contexto de uma sessão de comunicação entre um par de processos,
o processo que inicia a comunicação (isto é, o primeiro a contatar o
outro no início da sessão) é rotulado como cliente. O processo que
espera ser contatado para iniciar a sessão é o servidor.”
[KUROSE, 2006].
6
2.1.1.1. Comunicação Síncrona e Assíncrona
Nas comunicações síncronas quando o processo a envia (send) a mensagem o
mesmo fica bloqueado até receber (receive) a mensagem de resposta do processo b. Nesse
caso o send e receive causam bloqueio no processo.
Nesse tipo de comunicação (i) o processo remetente envia uma mensagem de
requisição pedindo autorização para iniciar a transmissão; (ii) recebendo a autorização o
processo remetente inicia o envio (send) da mensagem; (iii) o envio (send) só é concluído
após a recepção (receive) confirmando o recebimento; (iv) após concluir o processo os
buffers e estruturas de dados são liberados.
Necessitando-se de um processo que após o envio da mensagem (send) não fique
bloqueado pela recepção (receive), deve-se utilizar a comunicação assíncrona. Nesse caso a
operação send é não bloqueante. Enquanto o receive pode tanto ser bloqueante quanto não
bloqueante.
No receive bloqueante o send é liberado após a mensagem ter sido copiada para um
buffer local. Em seguida, o processo remetente pode reutilizar o seu buffer, mas não tendo
como garantia o sucesso da transmissão anterior. O receive da comunicação assíncrona
bloqueante assemelha-se com o receive da comunicação síncrona.
“Ca variante não bloqueante, o processo destino prossegue sua
execução após ter realizado a operação receive, a qual fornece um
buffer para ser preenchido em background. Ceste caso, o processo deve
receber separadamente uma notificação de que seu buffer possui dados a
serem lidos, isso pode ser feito baseado em polling ou em interrupção.”
[COULOURIS, 2007].
2.1.1.2. Troca de Mensagens
Quando se deseja criar uma comunicação entre um processo cliente e servidor
pode-se usar a troca de mensagem. Essas mensagens trocadas devem ter um protocolo de
comunicação, uma vez que, para obter o resultado esperado, esse processo requer uma
compreensão e cooperação entre o processo cliente e servidor.
Segundo [TANENBAUM, 2003] “Este método de comunicação interprocessos usa
duas primitivas, send e receive.”. O processo remetente envia uma solicitação ao processo
destino via mensagem. Ao receber a mensagem o processo servidor avalia para iniciar o
7
atendimento a solicitação ou, caso a mensagem seja inconsistente, retorna uma mensagem
de erro ao processo cliente.
2.1.1.3. Falhas de Comunicação
Um problema que deve ser levado em consideração nos sistemas que usam troca de
mensagem é a possibilidade de perdas de mensagens, “especialmente se os processos
comunicantes
estiverem
em
máquinas
diferentes
conectadas
por
uma
rede.”
[TANENBAUM, 2003].
O modelo de falha apresentado por [COULOURIS, 2007] classifica as falhas a
seguir:
• Falhas por Omissão: Falhas provenientes de problemas na execução em um
canal de comunicação ou processo.
• Falhas Arbitrárias: A falha no (i) processo acontece quando passos do
processo são omitidos ou são efetuados processamentos indesejados. A falha
no (ii) canal de comunicação aparece quando uma mensagem é corrompida,
mensagens inexistentes são enviadas ou mensagens reais são entregues mais
de uma vez.
• Falhas de Temporização: Só existem nos sistemas síncronos que precisam
da garantia de temporização.
• Mascaramento de Falhas: Falhas conhecidas de um componente do sistema,
ocultadas ou convertidas num tipo de falha aceitável através do
mascaramento.
• Confiabilidade da Comunicação de Um para Um: Falhas na validação e
integridade das mensagens.
2.1.1.4. Transmissão de Mensagens por Sockets
Quando o processo emissor está fisicamente separado do processo receptor, essa
comunicação pode fazer uso de socket sobre uma rede com protocolo TCP/IP, pois o
mesmo combina o endereço de IP, o protocolo de comunicação e a porta que será usada.
“Um processo envia mensagens para a rede e recebe mensagens dela através de um socket.”
[KUROSE, 2006].
Os três tipos de sockets mais comuns são:
8
1. Fluxo confiável de bytes orientado a conexão;
2. Fluxo confiável de pacotes orientado a conexão;
3. Transmissão não confiável de pacotes.
No primeiro tipo de socket os bytes são enviados do emissor para o receptor de
maneira continua, e garante que todos os bytes enviados vão ser recebidos na ordem em que
foram enviados.
O segundo tipo de socket é semelhante ao primeiro, mas neste caso os bytes não
serão transmitidos de uma única vez, e sim em pacotes com tamanhos bem definidos.
O terceiro tipo de socket é muito usado em aplicativos de tempo real ou em sistema
com tratamento de erro implementado no seu projeto. Nesse tipo de socket não existe a
garantia de ordem nem a garantia de entrega dos pacotes, sendo indicado para os
aplicativos onde a exigência de desempenho sobrepõe a confiabilidade dos bytes enviados e
recebidos.
2.1.2. Cluster
Cluster, ou aglomerado de computadores, pode ser definido como um grupo de
computadores que trabalham de maneira que aparentam ser uma única máquina. Para isto,
deve ser utilizado um sistema operacional distribuído. O sistema operacional distribuído “é
aquele que parece aos olhos dos usuários um sistema operacional tradicional de processador
único...” [TANENBAUM, 2003].
Outra definição de cluster, sob a ótica de redes de computadores, é apresentada por
[COULOURIS, 2007].
“Um agrupamento, ou aglomerado, é um conjunto de computadores
convencionais... interligado por uma rede de comunicação de alta
velocidade... comutada. Os computadores individuais podem ser PCs,
estações de trabalho padrão, placas de processador montadas sobre um
rack; eles ainda podem ser monoprocessadores ou multiprocessadores.
Uma aplicação de clusters é o fornecimento de serviços de alta
disponibilidade
e
flexíveis...
pela
replicação
ou
divisão
do
processamento e do estado do servidor em todos processadores do
cluster... também são usados para executar programas paralelos”
[COULOURIS, 2007].
9
A evolução das redes de computadores, capacitando ligar vários computadores em
uma rede e permitindo-os que desempenhem uma mesma tarefa, impulsionou o uso e
evolução do cluster ao estágio atual, onde o cluster se tornou uma opção interessante nos
departamentos de tecnologia das corporações.
2.1.3. Grid Computing
A idéia de um modelo capaz de lidar com uma taxa de processamento elevada e ao
mesmo tempo dividir esse processamento entre máquinas formando uma única máquina
virtual, podendo ser acessada por uma LAN (Local Area Cetwork – Rede de Área Local) ou
WAN (Wide Area Cetwork – Rede de Longa Distância), foi introduzida nos anos 90 com o
grid computing.
A analogia com as redes elétricas (power grids) é citada sempre que se deseja falar
sobre grid computing. No caso das redes elétricas, quando se tem um equipamento que
necessita de energia elétrica, basicamente, basta conectar na rede elétrica e a mesma
proverá a energia necessária para o funcionamento do equipamento. Não é preciso saber de
onde vem, em que momento foi gerada ou como foi transportada. A única coisa que
interessa é que tenha o que se deseja – energia elétrica – no momento que se precisa.
Da mesma maneira deve ser o grid computing, quando se precisar armazenar ou
recuperar informações, processar uma quantidade relativamente grande de dados entre
outros tantos recursos computacionais, basta conectar a máquina no grid computing e o
mesmo proverá o que se deseja no momento que se precisa.
“O termo grade (grid) é usado para se referir ao middleware que é
projeto para permitir o compartilhamento de recursos como arquivos,
computadores, software, dados e sensores em uma escala muito grande.
Cormalmente, os recursos são compartilhados por grupos de usuários
em diferentes organizações, os quais estão colaborando na solução de
problemas que exigem grandes números de computadores para resolvêlos, ou pelo compartilhamento de dados ou pelo compartilhamento do
poder de computação. Esses recursos são necessariamente suportados
por hardware, sistemas operacionais, linguagens de programação e
aplicações heterogêneas. É necessário gerenciamento para coordenar o
uso de recursos para garantir que os clientes obtenham o que precisam e
10
que os serviços possam fornecê-los. Em alguns casos, são exigidas
técnicas de segurança sofisticadas para garantir o uso correto dos
recursos nesse tipo de ambiente.” [COULOURIS, 2007].
2.1.3.1. Diferenças entre Cluster e Grid Computing
Embora possam parecer iguais à primeira vista, cluster e grid computing são
diferentes na sua essência.
Quanto ao gerenciamento de recurso:
• Cluster – Gerenciamento centralizado, tendo todos os nós trabalhando em
conjunto buscando um objetivo comum.
• Grid Computing – Gerenciamento descentralizado, onde cada nó pode adotar
políticas de alocação e uso de recursos, independente das políticas adotada
por outros nós.
Quanto à especificação do hardware e software:
• Cluster – Têm que ser homogêneos.
• Grid Computing – Têm que ser heterogêneos.
Quanto à conexão:
• Cluster – Requer tecnologia de redes de computadores de alto-desempenho
(“system bus”, iSCSI, Fibre Channel).
• Grid Computing – Permite redes convencionais de internet.
2.1.4.Middleware
Um middleware é um software que pode gerar a troca de informações entre
programas com diferentes (i) protocolos de comunicação, (ii) sistemas operacionais e (iii)
plataformas. O middleware também fornece uma estrutura de programação mais rica e
produtiva, facilitando (i) o desenvolvimento de aplicações distribuídas e a (ii) integração de
sistemas legados.
O middleware, geralmente, contém módulos com APIs (Application Program
Interface – Interface de Programação de Aplicativo) de alto nível para facilitar a integração
entre os aplicativos, mantendo uma interface de baixo nível para comportar a
independência de dispositivo.
11
Embora alguns middleware só suportem uma linguagem de programação,
comumente, o middleware é uma camada de software que oferece abstração de
programação.
“O middleware foi definido... como uma camada de software cujo o
objetivo é mascarar a heterogeneidade e fornecer um modelo de
programação conveniente para os programadores de aplicativos... Em
particular, ele simplifica as atividades de comunicação de programas
aplicativos por meio do suporte de abstração como a invocação a
métodos remotos, a comunicação entre um grupo de processos, a
notificação
de
eventos,
o
particionamento,
posicionamento
e
recuperação de objetos de dados compartilhado entre computadores, a
replicação de objetos de dados compartilhados e a transmissão de dados
multimídia em tempo real.” [COULOURIS, 2007].
2.2. Banco de Dados
Esta seção apresenta alguns tópicos sobre banco de dados que devem ser
conhecidos, uma vez que a arquitetura proposta foi criada para distribuir de maneira
balanceada os dados armazenados.
2.2.1. Banco de Dados e Sistema Gerenciador de Banco de Dados
A diferença entre banco de dados e Sistema Gerenciador de Banco de Dados
(SGBD) deve ficar bem clara para entender os conceitos que se seguem.
Um banco de dados deve ser projetado para o armazenamento de fatos que possuem
um significado implícito, representando aspectos do mundo real. O conjunto de
informações (dados) armazenado deve ter um significado efetivo que atende um propósito
específico.
“... um banco de dados possui algumas fontes das quais os dados são
derivados, alguns níveis de interação com os eventos do mundo real e um
publico efetivamente interessado em seus conteúdos.” [CAVATHE,
2005].
Um SGBD é um conjunto de programas que permite a criação e manipulação do
banco de dados, facilitando os processos de definição, construção, manipulação e
compartilhamento dos dados.
12
De uma maneira simplista, um banco de dados especifica os dados, as estruturas e
as restrições enquanto o SGBD gerencia a manipulação desses dados facilitando o acesso
aos mesmos, extraindo essas responsabilidades dos usuários e aplicativos.
2.2.2. Modelos de Bancos de Dados
À medida que aumentava o uso de banco de dados, foram surgindo necessidades
que antes não eram vislumbradas, com isso antigos modelos de banco de dados foram
cedendo espaços para novos modelos, causando uma evolução nos bancos de dados. Na
seqüência são mostrados alguns modelos de banco de dados e suas características
principais:
• Banco de Dados Hierárquico: Esse modelo foi muito utilizado nas primeiras
aplicações de banco de dados; ele conecta registros numa estrutura de árvore
de dados através de um relacionamento do tipo um-para-muitos.
• Banco de Dados em Rede: Semelhante ao anterior, mas nesse caso o
relacionamento é do tipo muitos-para-muitos.
• Banco de Dados Relacional: Concebido inicialmente para separar o modelo
físico do conceitual, além de prover uma fundamentação matemática; sendo
um modelo baseado na lógica e na teoria de conjuntos tornou-se o primeiro
modelo de banco de dados formal; esse modelo é uma abstração que define o
armazenamento, manipulação e recuperação dos dados estruturados na forma
de tabelas; sendo largamente utilizado nos dias atuais.
• Banco de Dados Orientado a Objeto: Esse modelo foi criado pensando na
necessidade
do
armazenamento
e
consulta
de
dados
complexos,
incorporando paradigmas já conhecidos da programação orientada a objeto
(POO), tais como a abstração de dados, encapsulamento, herança e
identificação de objetos.
• Banco de Dados Objeto-Relacional: Esse modelo é semelhante ao modelo
relacional, mas alguns conceitos do modelo orientado a objeto foram
incorporados; os esquemas do banco de dados dão suporte à criação e
consulta de objetos, classes e herança.
13
2.2.3. Arquiteturas de Banco de Dados
Assim como os modelos, no decorrer do tempo foram propostas varias arquiteturas.
As principais arquiteturas que foram propostas e ainda são usadas são apresentadas nesta
subseção.
2.2.3.1. Arquitetura Centralizada
As arquiteturas dos bancos de dados centralizados (figura 2.1) utilizavam o conceito
de concentrar nos mainframes o processamento das funções do sistema, programas de
aplicação, programas de interface entre outras funcionalidades do SGBD.
Figura 2.1 – A arquitetura física centralizada – Fonte: [AVATHE, 2005]
Os usuários acessavam os sistemas via terminais de computadores que apenas
exibiam resultados, mas não tinham poder computacional de processamento. Os processos
em si eram executados remotamente no mainframe, que após processar o solicitado,
enviava ao terminal as informações de exibição e os controles.
2.2.3.2. Arquitetura Cliente-Servidor de Duas Camadas
Essa arquitetura (figura 2.2) é uma evolução da arquitetura centralizada, pois graças
à troca dos antigos terminais cliente por PCs e workstations o poder computacional do lado
cliente aumentou, possibilitando passar parte do processamento para os mesmos e
14
“desafogando” os servidores. Os programas de interface com o usuário e os de aplicação
foram transpostos para o lado cliente.
Figura 2.2 – A arquitetura física cliente/servidor de duas camadas – Fonte: [AVATHE, 2005]
Um cliente é geralmente uma máquina de usuário com poder computacional e com
funcionalidade de interfaces, mas sempre que precisar acessar o banco de dados conecta-se
com o servidor que viabiliza o acesso aos dados. Geralmente têm-se máquinas com
software cliente e outras com software servidor, mas pode-se ter máquinas com ambos.
Na arquitetura cliente-servidor o programa cliente estabelece uma conexão com o
programa servidor para comunicar-se com o SGBD. Após estarem conectados, os sistemas
cliente enviam solicitações de manipulação e consulta dos dados, as mesmas são
processadas pelo servidor e enviadas de volta para o programa cliente, que processa e
apresenta o resultado de acordo com a necessidade.
2.2.3.3. Arquitetura Cliente-Servidor de Três Camadas
Com o crescimento da WWW (World Wide Web – Rede de Alcance Mundial – ou
simplesmente Web) os papéis na arquitetura cliente-servidor de duas camadas sofreram
mudanças que levaram a arquitetura cliente-servidor de duas camadas para a arquitetura
cliente-servidor de três camadas (figura 2.3), ou arquitetura de três camadas. Na arquitetura
de três camadas foi colocada uma camada intermediaria entre a máquina cliente e o
15
servidor de banco de dados. Essa camada do meio passou a chamar-se de servidor de
aplicação ou servidor Web, dependendo do contexto onde o aplicativo está inserido.
Figura 2.3 – A arquitetura lógica cliente/servidor de três camadas – Fonte: [AVATHE, 2005]
“Esse servidor desempenha um papel intermediário armazenando as regras de
negócio... que são usadas para acessar os dados do servidor de banco de dados.”
[NAVATHE, 2005]. Checar as credenciais do cliente antes de aceitar a solicitação do
mesmo também pode ser incrementado nesse servidor, deixando por sua conta a segurança
do banco de dados, desafogando o servidor de banco de dados desse processo.
A arquitetura em três camadas pode parecer igual a arquitetura em duas camadas,
mas ao retirar do servidor de dados regras de negócios e de segurança, deixa-se o servidor
menos sobrecarregado, pois fica responsável por gerenciar apenas os dados.
2.2.3.4. Arquitetura Distribuída
Um BDD (Banco de Dados Distribuído) é um conjunto de banco de dados
distribuídos por uma rede de computadores, mas logicamente inter-relacionados, enquanto
o SGBDD (Sistema Gerenciador de Banco de dados Distribuído) não apenas gerencia o
BDD, mas também torna a distribuição e transações transparentes para o usuário.
Existem dois tipos de banco de dados distribuídos, os (i) homogêneos que são
compostos por um único tipo de banco de dados e os (ii) heterogêneos que são compostos
por mais de um tipo de banco de dados.
16
Num banco de dados distribuído, os dados podem estar replicados ou fragmentados.
Na replicação, é criada uma cópia de cada dado em bases diferentes, deixando as bases com
os dados iguais. Na fragmentação, os dados são divididos entre bases diferentes.
2.2.3.4.1. Vantagens
Alguns dos motivos que levaram ao desenvolvimento dessa arquitetura foram a (i)
descentralização dos dados, aumentando o poder computacional de processamento; a (ii)
fragmentação dos dados levando em consideração a estrutura organizacional, persistindo os
dados no local desejado (Ex.: Departamento de Compras) aumentando a autonomia local; a
(iii) melhoria no desempenho devido a proximidade dos dados, paralelismo e
balanceamento entre os servidores de dados; (iv) tolerância a falhas aumentando a
disponibilidade dos dados; (v) economia na aquisição de servidores menores a medida que
o poder computacional exigido for aumentado; (vi) facilidade de acrescentar ou remover
novos servidores.
2.2.3.4.2. Desvantagens
O uso do banco de dados distribuído não só tem vantagens, mas traz consigo
algumas desvantagens como (i) complexidade exigida para garantir a distribuição de forma
transparente para o usuário; (ii) custo maior de implementação devido ao trabalho extra
exigido; (iii) planejamento mais difícil devido a fragmentação, alocação e, algumas vezes, a
replicação dos dados; (iv) integridade do banco exige alto recurso de rede; (v) exigência de
maior segurança tanto nos servidores quanto na infra-estrutura; (vi) inexistência de um
padrão que auxilie a conversão dos bancos de dados centralizados para os banco de dados
distribuídos; (vii) poucos casos práticos disponíveis para serem analisados.
2.2.3.4.3. Fragmentação de Dados
O tipo de fragmentação de banco de dados é a fragmentação de uma relação inteira,
ou seja, os dados de uma tabela inteira são colocados num único servidor do BDD. Dessa
maneira sempre que se precisar de alguma informação da tabela, o SGBDD irá busca essa
informação no servidor que a mantém. Para exemplificar suponha que um BDD tenha cinco
servidores de dados e que as tabelas do BDD estão espalhadas como mostrado na
tabela 2.1.
17
Tabela 2.1 – Exemplo de fragmentação de uma relação inteira
Servidor
Tabela
# Registros
S01
Cliente
10000
S02
Fornecedor
S03
PDV
1000000
S04
PDV_Item
4000000
S05
Estoque
1000
10000
Neste exemplo o servidor S02 vai precisar de um poder computacional bem menor
que o servidor S04 para atender as solicitações feitas, uma vez que o número de registros do
servidor S02 é bem menor que do servidor S04, causando um desbalanceamento de carga
entre os servidores.
Na fragmentação horizontal, as tuplas (registros) são divididas horizontalmente
entre os vários servidores. Esse tipo de fragmentação diminui o problema do
desbalanceamento de carga entre os servidores como pode ser visto na tabela 2.2. Com a
fragmentação horizontal cada registro da tabela fica em um servidor, junto com todos os
seus atributos (colunas).
Tabela 2.2 – Exemplo de fragmentação horizontal
Tabela: Cliente
Servidor
ID_Cliente
ome_Cliente
Cidade_Cliente
S01
1
Roberto
Juazeiro do Norte
S02
2
Helena
Fortaleza
S03
3
Francisco
Crato
S01
4
Lucas
Barbalha
S02
5
Ylane
Juazeiro do Norte
S03
6
Eduardo
Barbalha
S01
7
Carlos
Fortaleza
S02
8
Vitor
Fortaleza
S03
9
Maria
Crato
18
A fragmentação vertical divide as tuplas e seus atributos (tabela 2.3), o problema
nesse tipo de fragmentação está na obrigatoriedade de incluir a chave primária ou chave
candidata em cada parte da fragmentação, para que esses valores possam ser resgatados e
unidos quando necessário.
Existe ainda a possibilidade de combinar a fragmentação horizontal com a
fragmentação vertical gerando uma fragmentação mista ou híbrida.
2.2.3.4.4. Replicação de Dados
A replicação ou redundância de dados é usada para melhorar a disponibilidade dos
dados, pois através dela obtém-se um sistema de alta disponibilidade, mantendo o sistema
sempre disponível, mesmo em casos de falhas de componentes ou sobrecargas do sistema.
Embora a replicação de dados melhore a disponibilidade e o desempenho do banco
de dados, a mesma reduz a velocidade das operações de atualização, uma vez que cada
atualização deverá ser replicada em todas as cópias existentes para manter a consistência
dos dados redundantes.
Tabela 2.3 – Exemplo de fragmentação vertical
Tabela: Cliente
Servidor
ID_Cliente
S01
1
S02
ome_Cliente
Servidor
ID_Cliente
Cidade_Cliente
Roberto
S04
1
Juazeiro do Norte
2
Helena
S05
2
Fortaleza
S03
3
Francisco
S06
3
Crato
S01
4
Lucas
S05
4
Barbalha
S02
5
Ylane
S04
5
Juazeiro do Norte
S03
6
Eduardo
S06
6
Barbalha
S01
7
Carlos
S06
7
Fortaleza
S02
8
Vitor
S04
8
Fortaleza
S03
9
Maria
S05
9
Crato
19
2.2.4. SQL
A SQL (Structured Query Language – Linguagem Estruturada de Consulta)
permitiu padronizar a construção e acesso a SGBDR (Sistema de Gerenciamento de Bancos
de Dados Relacional) de diferentes tipos e em diferentes plataformas de software e
hardware.
Essa padronização impulsionou não apenas a disseminação dos SGBDR, mas
também a própria SQL. Para entender a importância da SQL são mostrados nesta subseção
todos os pontos que levaram os DBAs (Database Administrator – Administrador de Banco
de Dados) a ter na SQL um aliado importante.
No final da década de 1960 o matemático Edgar Frank Codd apresentou as
primeiras idéias sobre banco de dados relacional. Em junho de 1970 publicou o artigo “A
relational model of data for large shared data banks – Um modelo relacional de dados para
grandes bancos de dados compartilhados”, o que lhe rendeu em 1981 o prêmio ACM
TURING AWARD2.1.
Em 1973 a IBM criou o seu primeiro gerenciador de dados relacional, o SYSTEM R
que utilizava a linguagem de consulta SEQUEL (Structured English Query Language –
Linguagem Inglesa Estruturada de Consulta). Por motivos legais, a sigla foi alterada para
SQL, mas o primeiro SGBDR disponível comercialmente foi o ORACLE em 1979.
A primeira versão padronizada da SQL ocorreu em 1986, ficando conhecida como
SQL-86.
Esse padrão foi inicialmente desenvolvido no âmbito da ANSI (American
Cational Standards Institute – Instituto Nacional Americano de Padrões) sendo aprovado
pela ISO (International Organization for Standardization – Organização Internacional para
Padronização) em 1987.
Em 1989 foi publicada uma extensão do padrão SQL-86 chamada de SQL-89. A
SQL-92, também chamada de SQL2, foi publicado em 1992 e aprovado pela ISO. Essa
versão da SQL foi dividida tem três partes:
1. Entry Level (Nível de Entrada) – Nesse nível foi definido um conjunto
mínimo de comando para ser considerado padrão SQL
2. Intermediate level (Nível Intermediário)
2.1
O prêmio ACM TURING AWARD é conferido a uma pessoa que tenha dado contribuições de natureza
técnica a comunidade computacional
20
3. Full (Completo)
A SQL-99 ou SQL3 foi aprovado pela ISO no final de 1999. Nela foi definido o
uso de triggers, stored procedures, consultas recursivas entre outros. Esse padrão também
definiu regras para os SGBDOR (Sistema de Gerenciamento de Bancos de Dados ObjetoRelacional), implementando assim o suporte ao tratamento de objetos. No ano de 2003 foi
lançado o SQL-2003, introduzindo características relacionadas ao XML, seqüências
padronizadas e colunas com valores de auto-generalização.
A SQL é uma linguagem padronizada, mas cada SGBDR apresenta dialeto próprio,
com extensões diferentes entre cada fabricante de SGBD.
Os comandos da SQL são separados em grupos:
• DDL (Data Definition Language – Linguagem de Definição de Dados):
Subconjunto utilizado para criar, alterar e excluir tabelas e elementos
associados; esse é o grupo que mais muda de um fabricante para outro.
• DCL (Data Control Language – Linguagem de Controle de Dados):
Subconjunto de comandos que controla o acesso dos usuários aos dados.
• DTL (Data Transaction Language - Linguagem de Transação de Dados):
Subconjuntos de comandos usados para iniciar e finalizar transações.
• DML (Data Manipulation Language – Linguagem de Manipulação de
Dados): Subconjunto dos comandos usado para inserir, atualizar e apagar
dados.
• DQL (Data Query Language – Linguagem de Consulta de Dados): Com
apenas um único comando – select – e suas várias cláusulas e opções – nem
sempre obrigatórias – permite recuperar os dados de uma ou mais tabelas
através de consultas elaboradas como uma descrição do resultado desejado.
Além desses grupos de comandos a SQL tem operadores lógicos, operadores
relacionais e funções de agregação que, assim como na DDL, pode mudar de um fabricante
para outro.
2.2.5. XML
XML (Extensible Markup Language – Linguagem de Marcação Extensiva) é uma
linguagem universal usada para troca de informações entre organizações, empresas,
21
departamentos e banco de dados – entre outros – de uma forma transparente e organizada,
permitindo ao desenvolvedor criar as marcações (tags) mais adequadas para cada situação.
O XML passou a ser recomendada como padrão pelo W3C (World Wide Web
Consortium – Consórcio da World Wide Web) depois de estudos – feito em meados da
década de 1990 – que tinham o intuito de combinar a flexibilidade do SGML2.2 (Standard
Generalized Markup Language – Linguagem Padronizada de Marcação Genérica) com a
simplicidade do HTML (HyperText Markup Language – Linguagem de Marcação de
Hipertexto).
Com a combinação do SGML com o HTML pretendia-se criar uma linguagem que
oferecesse a capacidade de leitura via software e fosse facilmente integrada com outras
linguagens. Conforme [FARIA, 2005], essa capacidade promoveu comunicação entre
fornecedores e clientes, agilizando e reduzindo custos de processos.
Essa troca de informação barrava geralmente na incompatibilidade das tecnologias
utilizadas pelos dois lados, deixando o processo mais complicado. Esse ambiente abriu as
portas para o padrão XML, que passou a ser considerada a principal maneira para realizar
intercâmbio de dados entre tecnologias distintas, uma vez que combinava dois modelos
conceituais – (i) modelos empregados nos sistemas de documento e (ii) modelos de banco
de dados.
No XML os dados são organizados usando estruturas de árvores hierárquicas, e são
representados como elementos que podem ficar aninhados, permitindo a criação de
estruturas hierárquicas complexas. A figura 2.4 mostra um exemplo de um elemento XML
complexo.
2.3. Conclusão
O conhecimento sobre computação distribuída é importante para esta dissertação,
pois ela propõe um middleware para a distribuição dos dados armazenados. Conhecido os
processos de comunicação entre os sistemas distribuídos, torna-se mais claras as estratégias
adotada no projeto do middleware proposto neste trabalho.
2.2
“SGML... foi uma linguagem criada... com o objetivo de construir um sistema portável... com o qual
pudéssemos compartilhar e processar documentos.” [FARIA, 2005]
22
Figura 2.4 – Um elemento XML complexo chamado <projetos> – Fonte: [AVATHE, 2005]
A abordagem sobre cluster e grid computing foi incluída para que ficasses claro que
na elaboração do middleware, elas foram descartadas propositalmente e não por
desconhecimento do autor.
As arquiteturas de banco de dados contribuirão na delimitação do problema, ou seja,
o middleware foi elaborado para aumentar o desempenho de SGBDRs sobre a arquitetura
cliente-servidor de duas camadas. O aumento de desempenho foi feito utilizando
fragmentação horizontal dos dados.
A SQL é fundamental a dissertação, uma vez que o middleware trabalha com
SGBDRs. Já o conhecimento de XML é importante, uma vez que o middleware utiliza
desse padrão para gerar as respostas das consultas feitas pelo sistema cliente.
23
Capítulo 3
Trabalhos Relacionados
Neste capítulo é apresentada uma visão geral sobre as soluções adotadas pelos
SGBDs Oracle 10g e PostgreSQL para fornecer suporte a distribuição dos dados, com o
intuito de fornecer alta disponibilidade, tolerância a falhas, replicação, balanceamento de
carga, alto desempenho e escalabilidade. Também é apresentado o middleware Sequoia e
um modelo para o compartilhamento de bases de dados distribuídas.
3.1. Oracle 10g
O Oracle 10g foi o primeiro banco de dados destinado a grid computing. Melhorias
foram implementadas e lançadas na versão do Oracle 11g, contudo a estrutura básica do
Oracle 10g foi mantida.
No Oracle 10g, o banco de dados se acomoda no grid computing através da
clusterização de servidores, do armazenamento auto-gerenciado e dos mecanismos de autogerenciamento e auto-ajuste. Nesse cenário, a inclusão de novos recursos ou exclusão de
recursos existentes pode ser feito sem a necessidade de parar o banco de dados e seus
aplicativos.
“Esta arquitetura baseia-se em servidores de custo relativamente baixo,
mas
constantemente
atualizados.
Os
servidores
devem
estar
interconectados em uma estrutura de cluster. O Oracle Application
Server 10g e o Oracle Database 10g foram concebidos para serem
executados em clusters e poderem alocar dinamicamente os recursos de
acordo com a necessidade do grid.” [OLIVEIRA, 2004].
3.1.1. Real Application Cluster
O RAC (Real Application Cluster) é o principal componente do Oracle 10g, pois
através dele o Oracle 10g oferece alta disponibilidade, escalabilidade, proteção contra
falhas de hardware e software. O RAC permite que o banco de dados execute aplicações em
conjunto com servidores em cluster.
24
3.1.1.1. Arquitetura do Real Application Cluster
A arquitetura física do RAC (figura 3.1) é dividida em camadas, onde na interface
de acesso tem-se os usuários que têm acesso a rede pública; a infra-estrutura de rede
mantém duas redes com papeis bem definidos, a rede pública que estabelece a conexão com
os aplicativos clientes e a rede privada, que estabelece a conexão de alta velocidade para
garantir a troca de mensagens reservadas ao funcionamento do cluster; a camada de cluster
de servidores, que mantêm as instâncias do banco de dados, fica responsável pelo
gerenciamento da carga de trabalhado e o compartilhamento da memória; a camada de
armazenamento compartilhado que mantém os arquivos do banco de dados que são
armazenados “numa localização independente e cujos métodos de acesso configurados
permitem que os seus conteúdos sejam compartilhados, de modo concorrente.”
[NOGUEIRA, 2008].
Figura 3.1 – Arquitetura física Real Application Clusters – Fonte: [OGUEIRA, 2008]
3.1.2. Oracle Clusterware
O RAC deve ser colocado sobre um cluster já montado. Ainda que o RAC possa
trabalhar sobre um cluster de terceiros certificado pela Oracle, ela desenvolveu o Oracle
Clusterware que é uma solução especifica para seu banco de dados.
25
O Oracle Clusterware monitora e gerencia o RAC, dessa maneira se houver uma
falha o Oracle Clusterware irá reiniciar automaticamente a instância sem que o
administrador perceba a falha. Se um novo nó for adicionado ao cluster, o Oracle
Clusterware se responsabiliza por inicializar todas as instâncias e serviços do nó
automaticamente.
3.1.3. Escalabilidade
Na arquitetura cliente-servidor de duas camadas, quando um servidor de dados está
sobrecarregado ele é substituído por outro servidor com poder computacional maior e,
conseqüentemente, mais caro.
O RAC permite planejar um crescimento gradativo e com custo menor que o de
troca de servidores. A adição de novos servidores no cluster aumenta o poder
computacional ao mesmo tempo em que não exige uma paralisação do banco de dados.
3.1.4. Pontos Fracos na Solução da Oracle 10g
Embora o RAC proporcione escalabilidade, ele só pode ser aplicado sobre uma base
de dados Oracle, mais especificamente a partir da do Oracle 10g. Outro empecilho do RAC
está na estrutura necessária que precisa ser montada para que ele possa ser executado.
3.2. PostgreSQL
Ao contrário do Oracle 10g, o PostgreSQL não implementa nativamente o grid
computing, assim como não tem recursos para gerenciamento de cluster. Contudo tem
soluções, de terceiros, projetadas para atender essas necessidades.
O PostgreSQL também não possui implementações nativas para replicação e nem
balanceamento, porem existem soluções de terceiros criadas para replicar e balancear os
dados no PostgreSQL.
3.2.1. PGCluster
O PGCluster é um sistema de replicação síncrona composto por vários servidores,
tendo como principais características o balanceamento de carga e a alta disponibilidade.
O PGCluster é composto por três tipos de máquinas:
26
• Servidor de Balanceamento (Load Balancer): Recebe consultas e as
encaminha para os nós de armazenamento. As consultas são distribuídas de
acordo com a carga de cada nó. Podem existir mais de um balanceador de
carga.
• Servidor de Armazenamento (Cluster DB): Máquina que recebe e armazena
as consultas em bancos de dados.
• Servidor de Replicação (Replicator): Cuida de manter os dados
sincronizados entre os servidores. Mais de um servidor pode ser utilizado,
neste caso, outro servidor só assume se o servidor de replicação principal
falhar.
No balanceamento de carga (figura 3.2) são combinados servidores de
armazenamento e servidores de replicação, criando um sistema em cluster. O PGCluster
distribui a carga de acesso, redirecionando consultas para máquinas com menor carga.
Figura 3.2 – Sistema de balanceamento de carga – Fonte: [GOVEROELETROICO, 2008]
No caso da alta disponibilidade (figura 3.3) é utilizando um servidor responsável
por distribuir a carga de acesso no cluster. Caso um servidor de armazenamento falhe o
mesmo é separado pelo servidor de replicação. Quando a falha do servidor for contornada,
ou for incluído um novo servidor, os dados são copiados para o mesmo automaticamente.
27
Figura 3.3 – Sistema de alta disponibilidade – Fonte: [GOVEROELETROICO, 2008]
3.2.2. PGPool
O PGPool é uma solução que fica numa camada entre o cliente e servidor de dados
com a finalidade de prover alta disponibilidade, replicação e balanceamento de carga.
“Como sistema de replicação de dados, PGPool permite backup em
tempo real de bancos de dados, enviando as mesmas declarações SQL
para ambos os servidores, podendo ser considerado um sistema de
replicação síncrona... Se algum problema torna um dos servidores
PostgreSQL indisponível, o PGPool tenta continuar o serviço com o
servidor ainda ativo.” [GOVERCOELETROCICO, 2008].
As consultas são distribuídas de maneira aleatória entre os nós para obter um ganho
de desempenho, balanceando a carga entre esses nós. Utilizando o PGPool como
middleware os aplicativos que utilizam o PostgreSQL não precisam ser modificados. Já o
número de conexões com o PostgreSQL pode ser configuráveis.
O PGPool-II é uma evolução do PGPool, que suporta até 128 nós, com poder de
processamento paralelo nos nós.
3.2.3. Slony-I
O Slony-I é um sistema de replicação que segue o modelo Master to Multiple Slaves
apoiado no cascateamento de slaves e failover. Com essa estrutura é possível garantir que
um Slave assuma a posição de Master caso um Master venha a falhar.
O Slony-I também se responsabiliza em usar rotas alternativas sempre que um Slave
responsável pela transmissão dos dados falhe. O tipo de replicação de banco de dados
adotado pelo Slony-I foi a replicação assíncrona em cascata (figura 3.4).
28
Figura 3.4 – Replicação em Cascata – Fonte: [SLOY, Introducing, 2008]
Segundo [SLONY, 2008], Slony-I é um sistema replicador Master-Slave que inclui
todos os recursos e capacidades necessárias para replicar grandes bancos de dados para um
número razoavelmente limitado de sistemas Slaves. O Slony-I foi projetado para ser usado
em data centers e sites de backup.
No caso de falha de um Slave que fornece dados para outros Slaves, os Slaves
podem continuar a replicação através de outro Slave ou diretamente para o Master. No caso
do Master falhar (figura 3.5), um Slave pode receber uma promoção para se tornar um
Master, os outros Slaves passam a replicar o novo Master. O modelo assíncrono, adotado
pelo Slony-I, mantém réplicas em estados diferentes – mais ou menos atualizadas – por este
motivo, quando um Slave se torna um Master, ele próprio sincroniza com o estado mais
recente entre os Slaves ativos.
Figura 3.5 – Replicação continua após uma falha – Fonte: [SLOY, Introducing, 2008]
29
3.2.4. ParGRES
O ParGRES é um middleware projetado com o objetivo de ser capaz de processar
consultas pesadas com grandes quantidades de dados. Porém para que ele possa ser
utilizado o PostgreSQL deve estar sobre um cluster de PCs. O processamento da consulta
usa o paralelismo intra-consultas3.1 e inter-consultas3.2.
O ParGRES consiste em uma camada intermediária de software que gerencia
instâncias de SGBDs executados em diferentes nós de um cluster, implementando técnicas
de processamento paralelo. Segundo [MATTOSO, 2009] “seus componentes se encontram
distribuídos entre os nós do cluster”. Dessa maneira o ParGRES possui uma arquitetura
descentralizada como mostrado na figura 3.6.
Figura 3.6 – Arquitetura do ParGRES – Fonte: [MATTOSO, 2009]
“ParGRES está sendo desenvolvido em Java, e os testes estão sendo
executados em um cluster de PCs seguindo arquitetura de memória
distribuída. Pela sua arquitetura, o ParGRES não necessita em absoluto
de hardware específico de clusters... Ca implementação atual do
ParGRES está sendo utilizado o SGBD PostgreSQL versão 8.0 em cada
3.1
“Significa decompor consultas complexas em sub-consultas que serão executadas em paralelo, cada subconsulta em um fragmento de dados diferente. Dessa forma, cada sub-consulta poderá então ser enviada para
o nó que possui o respectivo fragmento dos dados. Assim, cada sub-consulta é enviada para um nó diferente e
executada em paralelo com as demais” [MATTOSO, 2009].
3.2
“Consultas distintas são executadas de forma concorrente no cluster de banco de dados, uma em cada nó do
cluster” [MATTOSO, 2009].
30
nó do cluster. A comunicação entre o ParGRES e cada nó do cluster é
realizada através de JDBC.” [MATTOSO, 2009].
3.2.4.1. Arquitetura
Na arquitetura do ParGRES existem componentes globais e locais. As tarefas que
envolvem vários nós do cluster são executadas pelos componentes globais, enquanto as
tarefas que são realizadas em apenas um nó são executadas pelos componentes locais.
Os componentes locais são os NQP (Code Query Processor – Processador de
Consultas de Nó) e o PostgreSQL, enquanto os componentes globais são o Intermediador e
o CQP (Cluster Query Processor – Processador de Consultas de Cluster).
O Intermediador repassa as requisições das aplicações para o CQP, e do CQP para
as aplicações. Dessa maneira o Intermediador provê maior flexibilidade na alocação física
do CQP, aumentando o grau de tolerância a falhas do ParGRES.
3.2.4.2. Cluster Query Processor
O CQP é o componente mais importante do ParGRES, ele age como gerenciador
dos outros componentes, sendo responsável por controlar a execução de requisições do
ParGRES.
As informações presentes no Catálogo do ParGRES são utilizadas pelo CQP para
analisar as consultas e definir que tipo de paralelismo deverá ser usado. O Catálogo
armazena informações necessárias para a fragmentação virtual adaptativa, não precisando
de informações específicas do SGBD.
3.2.5. Pontos Fracos nas Soluções do PostgreSQL
As soluções do PostgreSQL têm como foco a replicação dos dados. Nenhuma das
soluções trata a escalabilidade como foco primordial. Em alguns a escalabilidade é tratada
como um problema secundário. Em outros nem isso é apresentado. Além disso, todas são
soluções direcionadas ao PostgreSQL.
3.3. Modelo para o Compartilhamento de Bases de Dados Distribuídas
e Heterogêneas
No seu trabalho apresentado por [JUNIOR, 2005] é proposto um modelo para
viabilizar o “Compartilhamento de Bases de Dados Distribuídas e Heterogêneas”
31
A figura 3.7 mostra a arquitetura do middleware proposto. Ele é formado por
artefatos denominados Agentes, que desempenham a função de relacionar-se com o
aplicativo e de relacionar-se com os outros Agentes.
O Agente utiliza socket para comunicar-se com outros Agentes. O reconhecimento
de outros Agentes e seus serviços é feito através do Diretório de Agentes.
Os Agentes Servidores se registram no Catálogo de Serviços, esse catálogo informa
aos Agentes Clientes os Agentes Servidores disponíveis e seus endereços, esse catálogo não
é persistido.
Após a identificação dos Agentes Servidores, o Agente Cliente passa a interagir
diretamente com os mesmos, não precisando mais do auxilio do Mediador.
O Agente de Gerenciamento tem a função de (i) permitir a manutenção do Diretório
de Agentes e (ii) proporcionar a situação de atividade dos Agentes em seus Catálogos de
Serviços ativos e Log de Transação gerado pelos Agentes.
Figura 3.7 – Arquitetura do modelo de mediador proposto por Tercilio Junior – Fonte: [JUIOR, 2005]
3.3.1. Atores
Os atores são definidos por [JUNIOR, 2005] da seguinte maneira:
• Agente Cliente – Aplicativo: Sistema ou software que faz o tratamento de
informações das bases de dados através do Agente Cliente.
32
• Agente Servidor – Base de Dados: Qualquer fonte de informação disponível
em ambiente computacional ou em interfaces. Os Agentes Servidores podem
ser criados para tratar informações de sistemas de arquivos, banco de dados,
informações de estado de sistemas operacionais, sensores, etc.
• Administrador do Sistema: Usa o Agente de Gerenciamento para inserir
novos agentes no Diretório de Agente e fazer o acompanhamento do
funcionamento dos serviços através do Log de Transação e da atividade dos
agentes através do Catálogo de Serviços.
3.3.2. Classes
A descrição das classes do middleware, assim como suas características e
funcionalidade é apresentado resumidamente na seqüência:
• Diretório de Agentes: Classe de entidade persistente responsável por
catalogar todos os Agentes e seus serviços, podendo ser replicado para vários
pontos da sub-rede.
• Catálogo de Serviços: Classe de entidade não persistente responsável por
catalogar os serviços ativos, sendo utilizado pelos Agentes Servidor para
poder registrar os serviços e pelos Agentes Cliente para identificar os
Agentes Servidor em atividade.
• Log de Transações: Classe de entidade persistente responsável por registrar
as atividades dos agentes, permitindo o acesso do Agente de Gerenciamento
para fornecer dados ao Administrador do Sistema.
• Agente de Gerenciamento: Classe de fronteira que consente a manutenção
do Diretório de Agentes, apresentando o estado dos serviços do Catálogo de
Agentes e Log de Transações.
• Agente Cliente: Componente do serviço de solicitação, sendo parte
integrante do aplicativo e suprindo este aplicativo com dados por meio do
mediador.
• Agente Servidor: Componente do serviço responsável por responder as
solicitações do Agente Cliente, interagindo com uma base de dados para
disponibilizar os serviços da mesma.
33
3.3.3. Pontos Fracos do Middleware
A implementação do middleware proposto em [JUNIOR, 2005] se caracterizou por
Independência de Ambiente Operacional (Portabilidade), Independência física de dados,
Transparência de Localização, Redundância dos Serviços e Gerenciamento do Ambiente.
Mas na proposta, [JUNIOR, 2005] não apresenta uma estrutura para distribuição e
balanceamento de dados, de forma transparente ao sistema cliente.
3.4. Sequoia
O Sequoia é um middleware de código aberto desenvolvido para deixar
transparente, a aplicativos JAVA, o acesso a um cluster de banco de dados pelo meio do
JDBC (Java Database Connectivity). Com esse middleware os aplicativos clientes,
aplicativos servidores e servidores de banco de dados não sofrem alterações, bastando o
Sequoia ter acesso aos bancos de dados.
O uso do Sequoia necessita de uma aplicação cliente que utilize o JDBC, uma JVM (Java
Virtual Machine – Máquina Virtual Java) compilada para JDK (Java Development Kit – Kit
de Desenvolvimento Java) 1.4 ou superior, um banco de dados com driver JDBC ou ODBC
(Open Data Base Connectivity – Conectividade com Base de Dados Aberta), comunicação
entre o nós do cluster via TCP/IP.
3.4.1. Arquitetura
A arquitetura flexível provida pelo Sequoia permite escalabilidade, alta
disponibilidade e tolerância a falhas por meio do conceito de RAIDb (Redundant Array of
Inexpensive Databases – Conjunto Redundante de Base de Dados Econômicos), onde o
banco de dados é distribuído e replicado entre diversos nós, ficando o Sequoia responsável
por distribuir a carga das consultas entre eles.
3.4.2. RAIDb
O RAIDb é o equivalente do RAID (Redundant Array of Inexpensive Drives –
Conjunto Redundante de Discos Econômicos) só que no contexto de banco de dados. No
RAID vários discos rígidos são combinados em um array, obtendo melhor desempenho,
capacidade e confiabilidade. Já o RAIDb propõe obter melhor desempenho e tolerância a
falhas combinando várias instâncias de banco de dados em um array de banco de dados.
34
3.4.2.1. RAIDb-0
Nesse nível do RAIDb (figura 3.8) os dados são particionados, distribuindo suas
tabelas entre as máquinas que hospedam o banco de dados. Tabelas diferentes podem estar
em nós distintos, mas uma mesma tabela não pode estar em mais de um nó. O RAIDb-0
particiona o banco de dados, mas a tolerância a falha não é oferecida.
Figura 3.8 – Exemplo de RAIDb-0 – Fonte: [GOVEROELETROICO, 2008]
3.4.2.2. RAIDb-1
Nesse nível de RAIDb (figura 3.9) é disponibilizado o espelhamento integral,
replicando totalmente os dados entre as máquinas que hospedam o banco de dados,
permitindo total tolerância a falhas. A escrita no banco de dados – update, insert, delete –
se torna mais onerosa, pois as requisições devem ser enviadas para todos os nós.
Figura 3.9 – Exemplo de RAIDb-1 – Fonte: [GOVEROELETROICO, 2008]
35
3.4.2.3. RAIDb-2
A combinação de RAIDb-0 com RAIDb-1 cria o RAIDb-2 (figura 3.10). Nesse
nível o RAIDb provê replicação parcial, melhorando o desempenho em comparação ao
RAIDb-1. Cada tabela tem que estar em pelo menos dois nós, mas é necessário no mínimo
quatro nós para este nível de RAIDb.
Figura 3.10 – Exemplo de RAIDb-2 – Fonte: [GOVEROELETROICO, 2008]
3.4.2.4. Aninhamento de RAIDb
A utilização de vários níveis de RAIDb simultaneamente é possível. Com apenas
um controlador RAIDb é possível escala um número limitado de bancos de dados, mas
pode-se usar vários controladores em cascata para disponibilizar, teoricamente, um número
ilimitado de banco de dados.
No RAIDb-1-0 (figura 3.11) um controlador RAIDb-1 fica no nível mais alto,
enquanto no RAIDb-0-1 (figura 3.12) o nível mais alto fica um controlador RAIDb-0.
3.4.3. Pontos Fracos do Sequoia
O Sequoia proporciona escalabilidade, alta disponibilidade e tolerância a falhas,
mas só é possível ser usado por aplicativos JAVA.
Embora seja um consenso, entre os profissionais da área de programação, que o
JAVA estar entre as linguagens mais populares, uma quantidade grande de aplicativos não
pode usufruir do Sequoia, pois foram desenvolvidos em outras linguagens.
36
3.5. Conclusão
Embora o Oracle e o PostgreSQL apresentem soluções para resolver o problema de
escalabilidade, todas elas são para banco de dados homogêneos. O middleware proposto
nesta dissertação foi construído para resolver o problema de escalabilidade em banco de
dados heterogêneos.
Figura 3.11 – Exemplo de RAIDb-1-0 – Fonte: [GOVEROELETROICO, 2008]
Figura 3.12 – Exemplo de RAIDb-0-1 – Fonte: [GOVEROELETROICO, 2008]
A proposta apresentada em [JUNIOR, 2005] não aborda a distribuição e
balanceamento dos dados de maneira transparente ao sistema cliente. O seu trabalho ficou
limitado a uma solução para o compartilhamento de bases de dados distribuídas e
37
heterogêneas. O middleware apresentado nesta dissertação vai mais além da proposta de
[JUNIOR, 2005]. Além do compartilhamento de dados distribuídos em bases heterogêneas,
também apresenta uma solução para a distribuição e balanceamento de dados heterogêneos.
Na solução do Sequoia foi levado em consideração apenas aplicativos
desenvolvidos em JAVA. No middleware proposto nesta dissertação, a heterogeneidade da
linguagem de programação é tão importante quanto a heterogeneidade dos dados
armazenados.
38
Capítulo 4
O Middleware LUCAS-GABRIEL
Este capítulo apresenta o middleware proposto nesta dissertação, o qual foi
denominado LUCAS-GABRIEL. Ele tem a finalidade de aumentar a escalabilidade
associada a independência dos SGBDRs com arquitetura cliente-servidor de duas camadas.
O LUCAS-GABRIEL distribui os dados entre os SGBDRs, gerenciando o
balanceamento entre os mesmos. Depois, quando recebe solicitações de atualização de
dados, o LUCAS-GABRIEL redireciona a solicitação de maneira correta aos SGBDRs.
Também é de responsabilidade do LUCAS-GABRIEL receber as solicitações de consulta,
redirecionar aos SGBDRs, consolidar os resultados dos SGBDRs e enviar a consolidação
para sistema que solicitou a consulta.
4.1. Introdução
A arquitetura do LUCAS-GABRIEL é mostrada na figura 4.1, nesta arquitetura os
dados são distribui horizontal (Leia 2.2.3.4.3. Fragmentação de Dados) entre SGBDRs. O
LUCAS-GABRIEL não irá interferir diretamente no funcionamento dos SGBDRs.
O software cliente se comunica com o módulo LUCAS (Lançador Uniforme de
Consultas Acessado por Software), que é uma classe encapsulada dentro de uma DLL, com
isso, a máquina onde está o software fica livre de qualquer tipo de instalação cliente de
SGBD.
Numa camada intermediária fica o módulo GABRIEL (Gerenciador de Acesso a
Banco Receptor de Invocações Enviadas do LUCAS). Esta camada é responsável por
distribuir horizontalmente os dados entre os SGBDs registrados.
O GABRIEL recebe as solicitações de modificação de estados dos dados emitidas
pelo software cliente via LUCAS. Na seqüência, o GABRIEL processa e distribui as
solicitações entre os servidores balanceando a carga entre os mesmos.
O GABRIEL também se responsabiliza pelo gerenciamento das solicitações de
dados, repassando as mesmas para os servidores, em seguida, faz a consolidação das
respostas e as envia para o software cliente via LUCAS.
39
Cliente
Cliente
Cliente
Cliente
Cliente
LUCAS
LUCAS
LUCAS
LUCAS
LUCAS
GABRIEL
Memória
Memória
Memória
Servidor
Servidor
Servidor
Firebird
PostgreSQL
MySQL
Figura 4.1 – Middleware proposto
Esta arquitetura deixa o gerenciamento dos dados mais complexo, porém, em
contra-partida ganha nas consulta de dados, uma vez que os mesmos são processados em
locais distintos. Outra vantagem da arquitetura é a heterogeneidade dos SGBDRs e a
possibilidade de inclusão de novos servidores para aumentar a escalabilidade.
4.2. Diagrama de caso de uso
O middleware é dividido em duas partes, o LUCAS e o GABRIEL (figura 4.2). O
LUCAS fica do lado cliente, isto quer dizer que cada cliente deve ter o LUCAS instalado
localmente. Entre o LUCAS e os SGBDs tem-se o GABRIEL, que é o núcleo do
middleware. O middleware não terá nada instalado do lado do SGBDR, para o SGBDR o
GABRIEL é um cliente.
A figura 4.3 ilustra o diagrama da figura 4.2 mais detalhadamente. Na figura 4.3 são
apresentados os casos de uso básicos, nesta figura é possível ver que todo serviço existente
no LUCAS precisa, para sua conclusão, de um outro serviço que está no GABRIEL.
40
Figura 4.2 – Diagrama de caso de uso sintético
Figura 4.3 – Diagrama de caso de uso básico
Os diagramas de caso de uso não são aprofundados, pois a usabilidade do
middleware será detalhada no transcorrer deste capítulo.
A troca de mensagens entre LUCAS e GABRIEL é realizada via socket. Nas
consultas de dados, o GABRIEL consolida os dados num arquivo XML e envia ao LUCAS
via socket. A escolha do socket foi devido a simplicidade das mensagens e dos dados
trocados. Já o XML foi escolhido devido já ser um padrão amplamente usado e conhecido.
Um exemplo de um arquivo XML gerado pelo GABRIEL e enviado ao LUCAS pode ser
visto na figura 4.4.
41
<?xml version="1.0" encoding="ISO-8859-1"?>
<dados>
<registro>
<NOME>SAULA SAMPAIO BRINGEL IZIDORO</NOME>
<ENDER>RUA PADRE CICERO</ENDER>
<BAIRRO>MATRIZ</BAIRRO>
<CEP>63.000.000</CEP>
<CIDADE>JUAZEIRO DO NORTE</CIDADE>
<UF>CE</UF>
</registro>
<registro>
<NOME>TADEU PEREIRA LIMA FRANCA</NOME>
<ENDER>RUA PADRE CICERO</ENDER>
<BAIRRO>MATRIZ</BAIRRO>
<CEP>63.000.000</CEP>
<CIDADE>JUAZEIRO DO NORTE</CIDADE>
<UF>CE</UF>
</registro>
</dados>
Figura 4.4 – Exemplo de arquivo XML gerado pelo middleware
O esquema do arquivo XML gerado está diretamente relacionado com o metadado
da origem dos dados, mas três tags são comuns a todos os arquivos XML gerados:
• <?xml version="1.0" encoding="ISO-8859-1"?>
Esta tag especial define a versão do documento XML através do
atributo version, enquanto o atributo encoding define a tabela
caracteres que será usada no arquivo. Esta tag deve aparecer apenas
uma vez no arquivo XML
• <dados>
Local onde os registros ficam armazenados. Esta tag deve aparecer
apenas uma vez no arquivo XML.
• <registro>
Define uma tupla e os valores armazenados em seus atributos. Esta
tag pode aparecer uma vez, várias vezes ou nenhuma vez no arquivo
XML, o que define a quantidade de vezes é o resultado gerado pela
consulta.
Ainda analisando o exemplo apresentado na figura 4.4 tem-se as tags <COME>,
<ECDER>, <BAIRRO>, <CEP>, <CIDADE> e <UF> dentro da tag <registro>. Os
42
nomes destas tags são iguais aos nomes dos atributos da tupla retornada pela consulta, e no
seu conteúdo estão os valores dos atributos da tupla.
4.3. Diagrama de classe
Nesta seção é apresentado o diagrama de classes do middleware, além do
detalhamento dos seus atributos e métodos.
4.3.1. LUCAS
A figura 4.5(a) apresenta o LUCAS detalhado em um diagrama de classe, nesta
figura é possível ver todos os atributos e métodos da classe.
Figura 4.5(a) – Diagrama de classe do LUCAS
Detalhamento da classe LUCAS
Na figura 4.5(b) pode-se ver o relacionamento do LUCAS com a classe
ClientSocket, o tipo enumerado Tipo_Solicitacao e as exceções que podem ser geradas. Na
mesma figura também pode-se ver detalhada a classe ClientSocket e o relacionamento da
mesma com o tipo enumerado Tipo_Status.
43
Figura 4.5(b) – Diagrama de classe do LUCAS
Detalhamento da (i) classe ClientSocket, do (ii) tipo enumerado Tipo_Solicitacao e
das (iii) exceções e como os mesmos se relacionam com a classe LUCAS
A classe ClientSocket é responsável por abrir a conexão, via socket, com a classe
ServerSocket e envia solicitações à mesma.
O detalhamento dos atributos e métodos do LUCAS pode ser visto nas tabelas do
Apêndice A. Os atributos e métodos da classe ClientSocket, da qual o atributo
SoqueteCliente do LUCAS descende, estão nas tabelas do Apêndice B.
Existem sete exceções criadas pelo LUCAS. A exceção ExceptionAguardando
acontece quando o Status do atributo SoqueteCliente está diferente de zero (Aguardando), a
exceção ExceptionBaixando acontece quando existe uma falha na transferência do arquivo
de
retorno
da
consulta.
As
exceções
ExceptionIncluindo,
ExceptionAlterando,
ExceptionExcluindo e ExceptionConsultando são executadas quando um dos SGBDRs
retornarem um erro, neste caso a mensagem é repassada do SGBDR para o sistema cliente.
A última exceção é a ExceptionMensagem que acontece sempre que um erro não esperado
ocorrer no GABRIEL.
44
4.3.2. GABRIEL
Na figura 4.6(a) o diagrama de classe do GABRIEL é apresentado. Na figura 4.6(b)
pode-se ver o relacionamento do GABRIEL com as classes ServerSocket e SQLConnect.
Figura 4.6(a) – Diagrama de classe do GABRIEL
Detalhamento da classe GABRIEL
Figura 4.6(b) – Diagrama de classe do GABRIEL
Detalhamento das classes (i) ServerSocket e (ii) SQLConnect e
como as mesmas se relacionam com a classe GABRIEL
45
A classe ServerSocket é responsável por gerenciar as conexões e solicitações
enviadas pela classe ClientSocket, enquanto a classe SQLConnect gerencia a conexão e as
transações feitas ao SGBDR.
Pode-se ver nas tabelas do Apêndice C o detalhamento dos atributos e métodos do
GABRIEL. Nas tabelas do Apêndice D tem-se o equivalente para a classe ServerSocket,
enquanto as tabelas do Apêndice E se referem a classe SQLConnect.
4.4. Diagrama de seqüência
Os diagramas de seqüências da inclusão, alteração, exclusão e consultas são
apresentados nesta seção.
4.4.1. Incluir
4.4.1.1. Incluir registro independente
As figuras 4.7(a) à 4.7(f) mostram o diagrama de seqüência para incluir um registro
numa tabela sem chave estrangeira. O digrama foi desmembrado em sete partes para
permitir a visualizar.
No caso de uma inclusão independente o Sistema Cliente deve invocar os métodos
Clear e SetTabela da classe LUCAS, em seguida, para cada campo e valor que se deseja
incluir no novo registro o método SetDados deve ser invocado.
Para entender melhor, imagine que se deseja incluir um registro na tabela Cliente
com os dados da tabela 4.1.
Tabela 4.1 – Incluir registro independente
Tabela: Cliente
Campo
Valor
Nome
José da Silva
Endereco Rua Todos os Santos
Cidade
Juazeiro do Norte
UF
CE
O Sistema Cliente deve executar o código semelhante ao mostrado:
46
LUCAS.Clear;
LUCAS.SetTabela(‘Cliente’);
LUCAS.SetDados(‘Nome’, ‘José da Silva’);
LUCAS.SetDados(‘Endereco’, ‘Rua Todos os Santos’);
LUCAS.SetDados(‘Cidade’, ‘Juazeiro do Norte’);
LUCAS.SetDados(‘UF’, ‘CE’);
LUCAS.SetIncluir(True);
O comando SQL gerado pelo método SetRequisitar (Leia Apêndice F) do LUCAS e
enviado ao GABRIEL fica como mostrado:
insert into Cliente (Nome, Endereco, Cidade, UF)
values (‘José da Silva’, ‘Rua Todos os Santos’,
‘Juazeiro do Norte’, ‘CE’);
Quando recebe a solicitação, o GABRIEL, por meio do seu atributo ServidorTabela,
seleciona o servidor que tem menos registro na tabela informada. Por fim, redireciona o
comando para o servidor escolhido. Logo, o balanceamento entre os SGBDs são garantidos
pelo GABRIEL através do atributo ServidorTabela.
Figura 4.7(a) – Diagrama de Seqüência – Incluir registro independente
Mensagens trocadas entre o Sistema Cliente e a classe LUCAS
47
Figura 4.7(b) – Diagrama de Seqüência – Incluir registro independente
Mensagens trocadas entre as classes LUCAS e ClientSocket
Figura 4.7(c) – Diagrama de Seqüência – Incluir registro independente
Mensagens trocadas entre as classes ClientSocket e ServerSocket
48
Figura 4.7(d) – Diagrama de Seqüência – Incluir registro independente
Mensagens trocadas entre as classes ServerSocket e GABRIEL
Figura 4.7(e) – Diagrama de Seqüência – Incluir registro independente
Mensagens trocadas entre as classes GABRIEL e SQLConnect
Figura 4.7(f) – Diagrama de Seqüência – Incluir registro independente
Mensagens trocadas entre a classe SQLConnect e os SGBDs
49
4.4.1.2. Incluir registro dependente
A inclusão de um registro que possua chave estrangeira, e onde esta chave
estrangeira deve ser igual a chave primária de uma inclusão anterior, mas ainda
desconhecida, deve seguir o diagrama de seqüência mostrado nas figuras 4.8(a) e 4.8(b), a
partir do ClientSocket o diagrama de seqüência é semelhante ao mostrado nas figuras 4.7(c)
à 4.7(f).
Figura 4.8(a) – Diagrama de Seqüência – Incluir registro dependente
Mensagens trocadas entre o Sistema Cliente e a classe LUCAS
50
Figura 4.8(b) – Diagrama de Seqüência – Incluir registro dependente
Mensagens trocadas entre as classes LUCAS e ClientSocket
Uma venda via pedido é um cenário onde se inclui registros dependentes. A chave
primária do pedido é chave estrangeira para seus itens, mas a chave primária só será
conhecida no momento da inclusão.
51
O desconhecimento da chave primária do pedido pode causar inconsistência nos
dados, uma vez que se forem incluídos dois ou mais pedidos num mesmo instante, não tem
como saber qual a chave primária que os itens lançados nesses pedidos distintos devem
obter, uma vez que um pedido pode ser persistido (i) antes de todos, (ii) após todos ou (iii)
entre lançamentos.
Para simplificar, é mostrado como incluir dados em casos semelhantes, conforme
tabela 4.2.
Tabela 4.2 – Incluir registro dependente
Tabela: Pedido
Campo
Valor
DtPedido
01/01/2009
ID_Vend
10
ID_Cliente
153
Tabela: Pedido_Item
Campo
Valor
ID_Pedido
???????
ID_Produto 1234567890
Quant
2
Tabela: Pedido_Item
Campo
Valor
ID_Pedido
???????
ID_Produto 0987654321
Quant
5
O código que deve ser executado pelo Sistema Cliente fica semelhante ao mostrado:
LUCAS.Clear;
LUCAS.SetTabela(‘Pedido’);
LUCAS.SetDados(‘DtPedido’, ‘01/01/2009’);
LUCAS.SetDados(‘ID_Vend’, ‘10’);
LUCAS.SetDados(‘ID_Cliente’, ‘153’);
52
LUCAS.SetIncluir(False);
LUCAS.SetTabela(‘Pedido_Item');
LUCAS.SetChaveEstrangeira(‘Pedido’, 'ID_Pedido');
LUCAS.SetDados(‘ID_Produto’, ‘1234567890’);
LUCAS.SetDados(‘Quant’, ‘2’);
LUCAS.SetIncluir(False);
LUCAS.SetDados(‘ID_Produto’, ‘0987654321’);
LUCAS.SetDados(‘Quant’, ‘5’);
LUCAS.SetIncluir(False);
LUCAS.SetRequisitar;
Note que só foi preciso configurar o nome da tabela e a chave estrangeira
(SetTabela e SetChaveEstrangeira) no primeiro item. Uma vez que o parâmetro do método
SetIncluir do LUCAS recebeu o valor falso, o mesmo se encarrega de configurar estes
valores (SetTabela e SetChaveEstrangeira) automaticamente, ficando por conta do Sistema
Cliente informar apenas os campos e seus valores através do método SetDados.
O comando gerado pelo método SetRequisitar (Leia Apêndice F) do LUCAS e
enviado ao GABRIEL fica igual ao mostrado a seguir:
insert into Pedido (DtPedido, ID_Vend, ID_Cliente)
values (‘01/01/2009’, ‘10’, ‘153’);
insert into Pedido_Item (ID_Produto, Quant)
values (‘1234567890’, ‘2’), ‘Pedido’, ‘ID_Pedido’;
insert into Pedido_Item (ID_Produto, Quant)
values (‘0987654321’, ‘5’), ‘Pedido’, ‘ID_Pedido’;
Ao receber esta solicitação de inclusão, o GABRIEL executa o processo a seguir:
Pedido.Gerador_ID := Pedido.Gerador_ID + 1;
insert into Pedido (ID, DtPedido, ID_Vend, ID_Cliente)
values (Pedido.Gerador_ID, ‘01/01/2009’, ‘10’, ‘153’);
insert into Pedido_Item (ID_Pedido, ID_Produto, Quant)
53
values (Pedido.Gerador_ID, ‘1234567890’, ‘2’);
insert into Pedido_Item (ID_Pedido, ID_Produto, Quant)
values (Pedido.Gerador_ID, ‘0987654321’, ‘5’);
A figura 4.9 mostra o fluxograma para inclusão de dados.
Inicio
Clear
SetTabela
[SetChaveEstrangeira]
Fim
Não
Nova
Tabela
Sim
SetRequisitar
SetDados
Não
Sim
Novos
Dados
Requisitar
Sim
Não
SetIncluir
Figura 4.9 – Fluxograma para inclusão de dados
4.4.2. Alterar
A alteração de dados se assemelha com a inclusão de dados. A diferença básica está
no tocante ao método SetChaveEstrangeira, que neste caso é desprezado pelo método
SetRequisitar, uma vez que, em uma alteração, a chave estrangeira já é conhecida.
O algoritmo usado pelo GABRIEL replica a solicitação enviada pelo LUCAS em
todos os servidores. A desvantagem dessa escolha é a perda de desempenho da rede, pois a
mesma solicitação é enviada ao vários servidores. A vantagem é o ganho de desempenho
dos servidores, devido cada servidor ter que processar uma quantidade menor de dados.
O diagrama de seqüência da alteração de dados é mostrado na figura 4.10, a
continuação desse diagrama é semelhante ao mostrado nas figuras 4.7(b) à 4.7(f).
54
Figura 4.10 – Diagrama de Seqüência – Alterar registro
Mensagens trocadas entre o Sistema Cliente e a classe LUCAS
Tendo como base os dados da tabela 4.3, é mostrado a seguir como o Sistema
Cliente deve efetuar a alteração neste registro.
Tabela 4.3 – Alterar registro
Tabela: Cliente
Campo
Valor Atual
ID
150
Nome
José da Silva
Endereco Rua Todos os Santos
Cidade
Juazeiro do Norte
UF
CE
ovo Valor
Rua Padre Cícero
O código que deverá ser executado:
LUCAS.Clear;
LUCAS.SetTabela(‘Cliente’);
LUCAS.SetDados(‘Endereco’, ‘Rua Padre Cicero’);
LUCAS.SetAlterar(‘ID = 150’, True);
O comando SQL gerado (Leia Apêndice F):
update Cliente
55
set Endereço = ‘Rua Padre Cicero’
where ID = 150;
O fluxograma para alteração de dados é mostrado na figura 4.11.
Inicio
Clear
SetTabela
Fim
Não
Nova
Tabela
Sim
SetRequisitar
SetDados
Não
Sim
Novos
Dados
Requisitar
Sim
Não
SetAlterar
Figura 4.11 – Fluxograma para alteração de dados
4.4.3. Excluir
O processo de excluir dados é o mais simples, pois neste caso são usados apenas os
métodos Clear, SetTabela e SetExcluir, os métodos SetDados e SetChaveEstrangeira são
desprezados. A figura 4.12 mostra o diagrama de seqüência da exclusão de dados até o
LUCAS, a partir do LUCAS o diagrama é semelhante ao mostrado nas figuras 4.7(b) à
4.7(f).
Figura 4.12(a) – Diagrama de Seqüência – Excluir registro
Mensagens trocadas entre o Sistema Cliente e a classe LUCAS
56
O código executado pelo Sistema Cliente deve ficar semelhante ao mostrado a
seguir:
LUCAS.Clear;
LUCAS.SetTabela(‘Cliente’);
LUCAS.SetExcluir(‘ID = 150’, True);
O comando SQL gerado (Leia Apêndice F):
delete from Cliente
where ID = 150;
O algoritmo usado pelo GABRIEL para excluir dados é semelhante ao da alteração
de dados, uma vez que o GABRIEL replica a solicitação enviada pelo LUCAS em todos os
servidores. Na figura 4.13 tem-se o fluxograma para exclusão de dados.
Inicio
Clear
SetTabela
Fim
Não
Nova
Tabela
Não
Sim
SetRequisitar
Requisitar
SetExcluir
Figura 4.13 – Fluxograma para exclusão de dados
Sim
57
4.4.4. Consultar
Para consulta existem dois caminhos possíveis, (i) usando o método SetConsultar
ou (ii) usando o método SetConsultarSQL, mas nos dois casos, o GABRIEL replica a
consulta em todos os servidores.
No primeiro caso os métodos Clear, SetTabela e SetDados são usados em conjunto
com o método SetConsultar, sendo que o método SetDados tem o seu segundo parâmetro
(Valor) desconsiderado.
Para a segunda opção todos os outros métodos são desprezados (Clear, SetTabela,
SetChaveEstrangeira, SetDados) uma vez que neste caso o Sistema Cliente deve passar o
comando de consulta já formatado de acordo com os requisitos da SQL.
Para fazer uma consulta através do método SetConsultar, o LUCAS verifica se
existem solicitações pendentes. Caso existam, ele manda para o GABRIEL todas essas
solicitações para serem atendidas, só então a solicitação de consulta é enviada. Desta
maneira LUCAS fica livre para esperar o arquivo XML de retorno, gerado no GABRIEL,
com os dados consolidados da consulta feita nos SGBDs e unificados neste arquivo.
4.4.4.1. SetConsultar
A figura 4.14 mostra o diagrama de seqüência até o LUCAS, quando o Sistema
Cliente usa o método SetConsultar. A continuação do diagrama é idêntico aos das figuras
4.7(b) à 4.7(f).
Figura 4.14 – Diagrama de Seqüência – Consultar via SetConsultar
Mensagens trocadas entre o Sistema Cliente e a classe LUCAS
58
O Sistema Cliente deve ficar com o código semelhante ao mostrado:
LUCAS_Clear;
LUCAS_SetTabela(‘Cliente’);
LUCAS_SetDados(‘ID’, ‘’);
LUCAS_SetDados(‘Nome’, ‘’);
LUCAS_SetDados(‘Endereco’, ‘’);
LUCAS_SetDados(‘Cidade’, ‘’);
LUCAS_SetDados(‘UF’, ‘’);
LUCAS_SetConsultar(‘ID between 100 and 1000’);
Comando SQL gerado (Leia Apêndice F):
select ID, Nome, Endereco, Cidade, UF from Cliente
where ID between 100 and 1000;
Na figura 4.15 é mostrado o fluxograma para se efetuar este mesmo procedimento.
Inicio
Clear
SetTabela
Fim
SetRequisitar
SetConsultar
SetDados
Sim
Novos
Dados
Não
Figura 4.15 – Fluxograma para consultar dados via SetConsultar
4.4.4.2. SetConsultarSQL
O fluxograma deste método é mais simples que o anterior, pois ele permite uma
consulta otimizada. Contudo, se o implementador do Sistema Cliente não tiver experiência
com SQL este método se torna mais difícil de ser usado. O diagrama de seqüência com
59
este método está nas figuras 4.16(a) e 4.16(b). A continuação do diagrama assemelha-se aos
das figuras 4.7(c) à 4.7(f).
Figura 4.16(a) – Diagrama de Seqüência – Consultar via SetConsultarSQL
Mensagens trocadas entre o Sistema Cliente e a classe LUCAS
Figura 4.16(b) – Diagrama de Seqüência – Consultar via SetConsultarSQL
Mensagens trocadas entre as classes LUCAS e ClientSocket
Código do Sistema Cliente:
SetConsultarSQL(‘select ID, Nome, Endereco, Cidade, UF ’
‘from Cliente where ID between 100 and 1000’);
Comando SQL gerado:
select ID, Nome, Endereco, Cidade, UF from Cliente
where ID between 100 and 1000;
4.5. Fluxos alternativos e Funcionalidade
As solicitações de inclusão, alteração e exclusão podem ficar pendentes no LUCAS,
bastando para isso informar como falso o parâmetro Requisitar dos métodos SetIncluir,
SetAlterar e SetExcluir.
60
Para enviar as pendências ao GABRIEL o método SetRequisitar deve ser invocado
de maneira direta ou indireta. No primeiro caso o Sistema Cliente deve incorporar no seu
código a chamada ao método SetRequisitar. No outro caso basta informar o parâmetro
Requisitar da última solicitação como verdadeiro, pois uma vez que os métodos SetIncluir,
SetAlterar e SetExcluir invocam o método SetSolicitar e, ao passar o parâmetro Requisitar
como verdadeiro, o mesmo invoca o método SetRequisitar (veja figuras 4.7, 4.10 e 4.12),
todas a pendências do LUCAS são enviadas para o GABRIEL.
O método SetChaveEstrangeira só é utilizado pelo LUCAS em conjunto com o
método SetIncluir. Nos outros métodos (SetAlterar, SetExcluir e SetConsultar) ele é
desprezado.
O segundo parâmetro do método SetDados (Valor) não é utilizado quando o método
é usado em conjunto com o método SetConsultar.
O método SetRequisitar processa todas as solicitações pendentes e as repassa para o
método EnviarMensagem. Em seguida invoca o método Clear para apagar todas as
solicitações enviadas.
4.6. Conclusão
Neste capítulo foi apresentado o middleware LUCAS-GABRIEL. Este middleware
propõe uma arquitetura de armazenamento de dados distribuído para SGBDRs com
arquitetura cliente-servidor de duas camadas. Com essa distribuição, o LUCAS-GABRIEL
aumenta a escalabilidade dos SGBDRs com arquitetura cliente-servidor de duas camadas.
O LUCAS-GABRIEL efetua a distribuição horizontal dos dados entre instâncias
distintas de SGBDRs, mas sem interferir diretamente sobre o processamento dos SGBDRs.
Ele atua numa camada intermediária entre o sistema cliente e os SGBDRs. Com esta
camada intermediária o processo de comunicação entre o sistema cliente e SGBDR muda.
Este novo processo é mostrado na seqüência:
1. O sistema cliente manda a solicitação ao LUCAS (Lançador Uniforme de
Consultas Acessado por Software);
2. O LUCAS recebe as solicitações do sistema cliente, organiza estas
solicitações e as envias ao GABRIEL (Gerenciador de Acesso a Banco
Receptor de Invocações Enviadas do LUCAS);
61
3. O GABRIEL recebe as solicitações e processa as mesmas, agindo de
maneira distinta para cada tipo de solicitação:
a. Inclusão: É feita a distribuição de maneira a manter os SGBDRs
balanceados.
b. Alterações/Exclusões: A solicitação é replicada entre os SGBDRs
para que a solicitação seja executada.
c. Consultas: A solicitação é repassada para os SGBDRs, o retorno da
consulta é consolidado num arquivo XML.
4. O Gabriel envia uma resposta ao LUCAS;
5. O LUCAS repassa a resposta ao sistema cliente.
Desta maneira o sistema cliente não se comunica diretamente com o SGBDR,
apenas através do LUCAS-GABRIEL. Em contrapartida, o LUCAS-GABRIEL deixa
transparente ao sistema cliente a estrutura física dos dados persistidos. Também é possível
incluir novas instâncias de SGBDRs na estrutura computacional sem que o sistema cliente
perceba tal ação.
62
Capítulo 5
Validação
Para
testar
a
arquitetura
proposta
foi
efetuada
a
implementação
do
LUCAS-GABRIEL, além de programa auxiliares. As implementações foram feitas no
Delphi 5.0.
Embora a proposta do LUCAS-GABRIEL seja independência de SGBD, os testes
foram feitos apenas com o Firebird 2.0 instanciado em todos os servidores. Esta
homogeneidade de SGBD na validação permite apresentar resultados mais confiáveis de
desempenho.
Já o sistema operacional usado foi o Windows XP Professional Service Pack 3
rodando em hardwares com configurações idênticas. Assim como no SGBD, este ambiente
de hardware e software homogêneo proporcionou uma validação mais confiável.
Neste capítulo é descrito o ambiente de teste e casos para validação da arquitetura.
5.1. DLL “LUCAS”
A classe LUCAS foi criada seguindo todas as normas da arquitetura proposta. Nesta
primeira versão, a classe foi incorporada numa DLL (LUCAS.DLL) que passou a
disponibilizar os métodos do objeto LUCAS_DLL – instância da classe LUCAS – através
de chamada a DLL.
A escolha por criar a DLL, nesta versão, foi a opção que melhor se encaixou na
reutilização da classe por qualquer linguagem de programação que tenha suporte ao uso de
DLL. Embora muitas linguagens de programação tenham suporte ao uso de DLL, ficou
para estudos futuros a busca de uma solução que deixe o LUCAS ainda mais heterogêneo
quanto a linguagem de programação do sistema cliente.
A tabela G.1 do Apêndice G mostra os métodos disponibilizados e como efetuar sua
chamada via DLL.
5.2. Aplicativo “GABRIEL”
Foi criado um aplicativo responsável por instanciar a classe GABRIEL, o aplicativo
acessa os métodos da instância do GABRIEL. Os servidores configurados ficam visíveis
63
constantemente. As tabelas, seus campos chaves, seus geradores e valores dos mesmos são
atualizados constantemente. A figura 5.1 mostra o aplicativo GABRIEL em execução.
Figura 5.1 – Aplicativo GABRIEL
5.3. Aplicativo “Cliente”
O aplicativo Cliente simula um sistema cliente com a função de incluir, alterar,
excluir ou consultar registros nas tabelas, mas quando informada a tabela “PDV” para
inclusão, o aplicativo insere registros nas tabelas “PDV” e “PDV_Item”. As ações de
incluir, alterar, excluir ou consultar podem ser feitas diretamente no SGBD ou através do
GABRIEL.
Neste aplicativo é instanciado um objeto do tipo ServerSocket para servir de elo de
comunicação entre ele o aplicativo Configura Cliente (Leia 5.4. Aplicativo Configura
Cliente). Quando o objeto do tipo ServerSocket do aplicativo Cliente recebe uma
mensagem do aplicativo Configura Cliente é iniciado o processo de configuração da DLL
“LUCAS” e sincronizada a hora do computador local com a do computador onde está o
aplicativo Cliente.
64
Figura 5.2 – Aplicativo Cliente
A tabela G.2 do Apêndice G mostra os métodos criados para auxiliar a sobrecarga.
5.4. Aplicativo “Configura Cliente”
A tabela a ser usada, ação a ser efetuada, período inicial e quantidade de vezes que a
ação será executada são configurados através deste aplicativo (figura 5.3). O aplicativo
Configura Cliente também informa se as ações acontecerão (i) diretamente no SGBD, para
verificar o desempenho do SGBD sem uso do LUCAS-GABRIEL, ou (ii) através do
GABRIEL, para verificar o desempenho dos SGBDs gerenciados pelo GABRIEL. Este
aplicativo também tem uma instância de um objeto do tipo ClientSocket, através do qual
são enviadas as configurações para as instâncias do aplicativo Cliente que serão utilizadas
no caso de validação. Os itens da interface do aplicativo são explicados na seqüência. As
caixas de edições são usadas para configurar tanto dados individuais das instâncias do
aplicativo Cliente quanto dados comuns a todas as instâncias do aplicativo Cliente.
5.5. Cenário
As CPUs usados nos testes eram iguais devido serem de um mesmo lote de compra
(tabela G.3 do Apêndice G). Foram utilizados dezessete CPUs, das quais seis ampararam as
instâncias do Firebird 2.0 e o GABRIEL. As outras onze mantiveram o aplicativo Cliente
divididas da seguinte maneira:
‒ Quatro CPUs efetuavam mil ações sobre a tabela Cliente;
‒ Uma CPU efetuava mil ações sobre a tabela Funcion;
‒ Uma CPU efetuava mil ações sobre a tabela Produto;
‒ Cinco CPUs efetuavam mil ações sobre a tabela PDV.
65
As ações dependiam do processo que estava sendo executado durante o caso de
validação.
Figura 5.3 – Aplicativo Configura Cliente
5.6. Casos de Validação
A validação foi feita através de três processos distintos descritos na seqüência:
1. Incluir Dados: Todos os aplicativos que usavam o LUCAS efetuavam
inclusões de dados.
2. Alterar Dados: Todos os aplicativos que usavam o LUCAS efetuavam
alterações de dados.
3. Consultar Dados: Todos os aplicativos que usavam o LUCAS efetuavam
consultas de dados.
Cada processo passou por seis casos de validações com as seguintes características:
‒ Caso de Validação 1: Neste caso de validação os aplicativos de Cliente não
usaram o GABRIEL, a sobrecarga foi feita em um único SGBD.
‒ Caso de Validação 2: Neste caso de validação os aplicativos de Cliente
usaram o GABRIEL, mas o GABRIEL estava gerenciando o acesso a apenas
um único SGBD.
‒ Caso de Validação 3: Neste caso de validação os aplicativos de Cliente
usaram o GABRIEL gerenciando o acesso a dois SGBDs.
66
‒ Caso de Validação 4: Neste caso de validação os aplicativos de Cliente
usaram o GABRIEL gerenciando o acesso a três SGBDs.
‒ Caso de Validação 5: Neste caso de validação os aplicativos de Cliente
usaram o GABRIEL gerenciando o acesso a quatro SGBDs.
‒ Caso de Validação 6: Neste caso de validação os aplicativos de Cliente
usaram o GABRIEL gerenciando o acesso a cinco SGBDs.
O processo de “Incluir Dados” foi executado em todos os casos de validação
descritos, ou seja, do “Caso de Validação 1” até o “Caso de Validação 6”. Em seguida foi
executado o processo de “Alterar Dados” da mesma maneira, e assim sucessivamente.
Deste modo todos os processos de “Incluir Dados” foram executados em um momento
cronológico anterior aos processos subseqüentes.
No “Caso de Validação 1” o servidor S1 manteve o SGBD na arquitetura ClienteServidor tradicional, ou seja, com os dados centralizados em um único servidor de dados. O
GABRIEL não estava instanciado e os servidores S2, S3, S4, S5, S6 não entram no teste.
No “Caso de Validação 2” o servidor S1 manteve a instância do GABRIEL,
enquanto o servidor S2 mantinha uma instância do SGBD. Os servidores S3, S4, S5, S6 não
entram no teste.
No “Caso de Validação 3” o servidor S1 manteve a instância do GABRIEL,
enquanto os servidores S2 e S3 mantinham instâncias do SGBD, uma instância para cada
servidor. Os servidores S4, S5, S6 não entram no teste.
Para cada novo caso de validação, um novo servidor se unia aos servidores S2 e S3.
Os resultados apresentados nas próximas subseções tiveram como referencia o valor
relativo do servidor S1 no “Caso de Validação 1”, logo os valores percentuais estão
diretamente proporcionais ao mesmo. Desta maneira, o caso de validação que apresentar
valor acima de 100% implica em desempenho pior que o “Caso de Validação 1”.
Conseqüentemente, sempre que o valor estiver abaixo de 100% implica em desempenho
melhor que o “Caso de Validação 1”.
5.6.1. Incluir Dados
Neste processo as bases de dados, de cada caso de validação, estavam inicialmente
limpas. A tabela 5.1 mostra os resultados percentuais médio de desempenho da CPU.
67
Na coluna Servidor desta tabela são mostrados os servidores. Na coluna Caso 1 é
apresentado o resultado do servidor S1 no “Caso de Validação 1”. O valor apresentado
para o servidor S1 no “Caso de Validação 1” é tomado com referencia para os servidores
ativos nos casos de validações posteriores.
A coluna Caso 2 apresenta os resultados dos servidores S1 e S2 no “Caso de
Validação 1”. A coluna Caso 3 apresenta o resultados dos servidores S1, S2 e S3 no “Caso
de Validação 3”. As outras colunas têm suas explicações semelhantes as já apresentadas.
A figura 5.4 mostra o gráfico de desempenho das CPUs baseado na tabela 5.1.
Tabela 5.1 – Percentual médio de desempenho da CPU no processo de inclusão de dados
Servidor Caso 1
S1
100%
S2
S3
S4
S5
S6
Caso 2
122%
28%
Caso 3
94%
11%
Caso 4
83%
6%
Caso 5
72%
6%
Caso 6
72%
6%
A tabela 5.2 mostra os resultados percentuais médio da utilização da rede, sua
explicação é análoga a da tabela 5.1. A figura 5.5 mostra o gráfico de desempenho da rede
fundamentado na tabela 5.2.
Tabela 5.2 – Percentual médio da utilização da rede no processo de inclusão de dados
Servidor Caso 1
S1
100%
S2
S3
S4
S5
S6
Caso 2
100%
74%
Caso 3
100%
33%
Caso 4
100%
20%
Caso 5
100%
18%
Caso 6
100%
13%
68
Figura 5.4 – Gráfico do percentual médio de desempenho da CPU na inclusão de dados
Figura 5.5 – Gráfico do percentual médio da utilização da rede na inclusão de dados
A tabela 5.3 mostra como as tabelas dos SGBDRs ficaram povoadas após as
inclusões. Na coluna Servidor foram colocados os servidores. Na coluna Tabela foram
colocas as tabelas que estavam em cada servidor. Todos os servidores continham as
mesmas tabelas.
Na coluna Caso 1 é apresentado o total de registros em cada tabela do servidor S1
após a conclusão do “Caso de Validação 1”. O mesmo acontece na coluna Caso 2 onde é
69
mostrado o total de registros nas tabelas do servidor S2 após a conclusão do “Caso de
Validação 2”.
A coluna Caso 3 apresenta o total de registros nas tabelas dos servidores S2 e S3
após o “Caso de Validação 3”. As colunas Caso 4, Caso 5 e Caso 6 mostram o equivalente
dos “Caso de Validação 4” à “Caso de Validação 6”.
Tabela 5.3 – Tabelas dos SGBDRs após o processo de inclusão de dados
Servidor
S1
S2
S3
S4
S5
S6
Tabela
Cliente
Funcion
PDV
PDV_Item
Produto
Cliente
Funcion
PDV
PDV_Item
Produto
Cliente
Funcion
PDV
PDV_Item
Produto
Cliente
Funcion
PDV
PDV_Item
Produto
Cliente
Funcion
PDV
PDV_Item
Produto
Cliente
Funcion
PDV
PDV_Item
Produto
Caso 1
4000
1000
5000
15000
1000
Caso 2
Caso 3
Caso 4
Caso 5
Caso 6
4000
1000
5000
15000
1000
2000
500
2500
7500
500
2000
500
2500
7500
500
1334
334
1666
5000
333
1333
333
1667
5000
334
1333
333
1667
5000
333
1000
250
1250
3750
250
1000
250
1250
3750
250
1000
250
1250
3750
250
1000
250
1250
3750
250
800
200
1000
3000
200
800
200
1000
3000
200
800
200
1000
3000
200
800
200
1000
3000
200
800
200
1000
3000
200
70
5.6.2. Alterar Dados
Neste processo as bases de dados, de cada caso de validação, estavam com os dados
incluídos nos processos de inclusão de dados dos seus respectivos caso de validação. A
tabela 5.4 e a figura 5.6 mostram os resultados percentuais médio de desempenho da CPU,
enquanto a tabela 5.5 e a figura 5.7 mostram os resultados percentuais médio da utilização
da rede.
As explicações para as tabelas 5.4 e 5.5 são análogas as das tabelas 5.1 e 5.2,
respectivamente.
Tabela 5.4 – Percentual médio de desempenho da CPU no processo de alteração de dados
Servidor Caso 1
S1
100%
S2
S3
S4
S5
S6
Caso 2
138%
25%
Caso 3
127%
25%
Caso 4
127%
25%
Caso 5
138%
13%
Caso 6
138%
13%
Figura 5.6 – Gráfico do percentual médio de desempenho da CPU na alteração de dados
71
Tabela 5.5 – Percentual médio da utilização da rede no processo de alteração de dados
Servidor Caso 1
S1
100%
S2
S3
S4
S5
S6
Caso 2
168%
37%
Caso 3
210%
37%
Caso 4
247%
37%
Caso 5
263%
37%
Caso 6
263%
37%
Figura 5.7 – Gráfico do percentual médio da utilização da rede na alteração de dados
5.6.3. Consultar Dados
Neste processo as bases de dados, de cada caso de validação, estavam com os dados
alterados nos processos de alteração de dados dos seus respectivos caso de validação. A
tabela 5.6 e a figura 5.8 mostram os resultados percentuais médio de desempenho da CPU,
enquanto a tabela 5.7 e figura 5.9 mostram os resultados percentuais médio da utilização da
rede.
As explicações para as tabelas 5.6 e 5.7 também são análogas as das tabelas 5.1 e
5.2, respectivamente.
72
Tabela 5.6 – Percentual médio de desempenho da CPU no processo de consulta de dados
Servidor Caso 1
S1
100%
S2
S3
S4
S5
S6
Caso 2
107%
59%
Caso 3
118%
33%
Caso 4
111%
29%
Caso 5
93%
15%
Caso 6
81%
11%
Figura 5.8 – Gráfico do percentual médio de desempenho da CPU na consulta de dados
Tabela 5.7 – Percentual médio da utilização da rede no processo de consulta de dados
Servidor Caso 1
S1
100%
S2
S3
S4
S5
S6
Caso 2
417%
117%
Caso 3
300%
67%
Caso 4
250%
42%
Caso 5
233%
25%
Caso 6
217%
17%
73
Figura 5.9 – Gráfico do percentual médio da utilização da rede na consulta de dados
5.7. Análise da validação
A implementação e validação do middleware chegou aos seguintes resultados:
1. Incluir Dados: Neste processo o middleware mostrou-se parcialmente viável
quando usado no “Caso de Validação 2”, uma vez que o servidor
mantenedor do GABRIEL sofreu uma sobrecarga na CPU maior que no
“Caso de Validação 1” quando mantinha apenas o SGBD. Mas no “Caso de
Validação 2” o servidor que mantinha a instância do SGBD obteve um
ganho significativo se comparando com o caso de validação anterior. Do
“Caso de Validação 3” à “Caso de Validação 6” tanto o servidor
mantenedor do GABRIEL quanto os que mantinham o SGBD obtiveram
ganhos de uso da CPU se comparados ao “Caso de Validação 1”. A
utilização da rede por parte do servidor S1 manteve-se estável em todos os
casos de validação, quanto aos servidores S2 à S6, à medida que um novo
servidor era incluído na arquitetura, a utilização da rede obtinha ganho de
desempenho.
2. Alterar Dados: Neste processo o middleware mostrou-se parcialmente
viável, uma vez que o servidor S1 obteve desempenho pior com o uso do
GABRIEL. Já os servidores S2 à S6 sempre tiveram desempenho melhor que
74
o servidor S1 no “Caso de Validação 1”. Esta mesma situação foi verificada
no requisito utilização da rede.
3. Consultar Dados: Neste processo o servidor S1 só obteve melhor
desempenho de uso da CPU nos “Caso de Validação 5” e “Caso de
Validação 6”, em contra-partida, a cada novo servidor colocado na
arquitetura, o desempenho das CPUs foram melhoradas consideravelmente.
Os piores desempenhos da utilização da rede ocorreram neste processo, o
servidor S1 sempre obteve resultados piores quando utilizava o middleware
proposto, enquanto o servidor S2 só obteve desempenho melhor de
utilização de rede a partir do “Caso de Validação 3”, já os servidores S3 à
S6 sempre obtiveram um desempenho melhor de utilização da rede. No
“Caso de Validação 6” os servidores S2 à S6 obtiveram desempenho de
utilização de rede semelhante ao do servidor S1 quando aplicado o “Caso de
Validação 1” no processo de inclusão de dados.
5.8. Conclusão
O middleware proposto efetuou a distribuição horizontal dos dados entre os
SGBDRs instanciados, garantindo escalabilidade maior que a arquitetura cliente-servidor
de duas camadas.
Quando o LUCAS-GABRIEL foi utilizado, os servidores com as instâncias dos
SGBDRs sempre obtiveram resultados melhores, mesmo quando o servidor com a instância
do GABRIEL mostrou desempenho inferior ao valor de referencia.
Para o sistema cliente passar a usar o middleware proposto, bastou substituir os
comandos SQL pelas chamadas aos métodos da classe LUCAS via DLL. Desta maneira
softwares projetados para arquitetura cliente-servidor de duas camadas podem migrar para
uma arquitetura de escalabilidade maior com poucas alterações na sua implementação.
Para o LUCAS-GABRIEL ser utilizado não foi preciso a existência de cluster ou
grid computing. Para cada nova instância de SGBDR incluído no middleware proposto, foi
necessário apenas informar ao GABRIEL o endereço do novo banco de dados.
Estes motivos comprovam que o middleware LUCAS-GABRIEL é viável.
75
Capítulo 6
Conclusão e Trabalhos Futuros
Este capítulo apresenta comentários conclusivos sobre a dissertação. Na seqüência é
apresentada a conclusão e as dificuldades encontradas, além dos trabalhos futuros.
6.1. Síntese da Dissertação
O aumento do armazenamento de dados trouxe consigo problemas, um deles foi a
necessidade de softwares capazes de manter grandes volumes e dados seguros e
disponíveis. Técnicas de distribuição e replicação de dados foram aplicadas para garantir a
recuperação dos dados, mas tais técnicas não resolvem problemas de disponibilidade e
escalabilidade.
O banco de dados Oracle 10g impulsionou a integração de técnicas de maneira
nativa com a finalidade de fornecer alta disponibilidade, tolerância a falhas, replicação,
balanceamento de carga, alto desempenho e escalabilidade. Outro banco com estudos na
área é o PostgreSQL, mas as soluções desenvolvidas para o PostgreSQL não são
implementações nativas.
A arquitetura apresentada nesta dissertação não é direcionada a um único banco de
dados, mas para uma estrutura de armazenamento de dados homogênea ou heterogênea.
Esta arquitetura é montada sobre o middleware LUCAS-GABRIEL, o middleware se
responsabiliza em distribuir os dados horizontalmente entre os SGBDs, mas sem interferir
nos processos internos dos SGBDs.
No middleware LUCAS-GABRIEL, o sistema cliente envia suas solicitações ao
LUCAS que organiza as mesmas e as envias ao GABRIEL. O GABRIEL, por sua vez,
gerencia as solicitações junto aos SGBDRs e envia uma resposta para o LUCAS que a
repassa esta resposta para o sistema cliente.
6.2. Conclusão
Os resultados das validações demonstraram que o middleware LUCAS-GABRIEL é
viável, pois os SGBDRs sempre ganharam desempenho. O bom resultado nos SGBDRs foi
conseguido graças ao processo de distribuição dos dados executado pelo middleware.
76
As validações também demonstraram que a proposta inicial de aumentar a
escalabilidade dos SGBDRs com arquitetura cliente-servidor de duas camadas foi
alcançada.
A comunicação via socket, entre o sistema cliente e o middleware proposto,
permitiu montar uma estrutura de acesso a dados para sistemas implementados em qualquer
linguagem de programação que suporte o uso de socket.
Os requisitos que o middleware LUCAS-GABRIEL se propôs a resolver foram
conseguidos e provados na validação.
6.2.1. Vantagens do Middleware
Embora existam outras propostas de distribuição de dados (Leia Capítulo 3), o
middleware LUCAS-GABRIEL apresenta um conjunto de benefícios não igualados pelas
outras propostas estudadas:
• Heterogeneidade da linguagem de programação do sistema cliente;
• Independência de SGBDR;
• Estrutura distribuída de armazenamento de dados;
• Balanceamento dos dados armazenados entre os SGBDRs;
• Transparência na distribuição dos dados;
• Escalabilidade.
A heterogeneidade da linguagem de programação para o sistema cliente é um ponto
forte do middleware, pois beneficiar sistemas legados.
Com a independência de SGBDR, as regras de acesso ao banco de dados, mantidas
no sistema cliente, não precisam mudar quando o SGBDR for mudado.
A estrutura distribuída de armazenamento de dados aumenta o poder computacional
de processamento, melhorando o desempenho quando comparado com uma estrutura
centralizada (Leia 2.2.3.4. Arquitetura Distribuída).
O balanceamento dos dados entre os SGBDRs aumento o desempenho das
solicitações feitas pelo sistema cliente. Uma vez que cada SGBDR tem apenas parte dos
dados, o processamento das solicitações nesses dados exige um poder computacional
menor.
77
O sistema cliente não precisa ficar preocupado em gerenciar os dados distribuídos, o
middleware LUCAS-GABRIEL faz isso de maneira transparente.
Problemas de escalabilidade podem ser contornados incluindo novos servidores de
dados na estrutura gerenciada pelo middleware LUCAS-GABRIEL.
6.2.2. Limitações do Middleware
As validações apontaram que a centralização das solicitações no GABRIEL –
localizado em único nó – causou perda de desempenho do GABRIEL em situações
especifica, tanto no desempenho médio da CPU, quanto no desempenho médio da
utilização da rede.
Devido o GABRIEL não manter um esquema para o gerenciamento dos dados
armazenados junto aos SGBDRs, o uso de junções em consultas SQL se torna inviável no
middleware. A falta de esquema também impossibilitou a implementação da replicação dos
dados em um ou mais servidores de dados.
6.3. Dificuldades Encontradas
Uma pesquisa sobre o banco de dados Oracle 10g foi o passo inicial para ter em
mente a estratégia utilizada pela Oracle para resolver problemas de alta disponibilidade,
tolerância a falhas, replicação, balanceamento de carga, alto desempenho e escalabilidade.
Embora a documentação sobre o Oracle 10g seja vasta, o detalhamento técnico da sua
arquitetura não é tão fácil de encontrar.
O passo seguinte foi analisar como o PostgreSQL resolveu os mesmo problemas
citados para o Oracle 10g. Assim como no caso do Oracle 10g, a documentação também é
ampla, mas neste caso a dificuldade em localizar o detalhamento técnico de suas soluções
foi bem menor. Devido o PostgreSQL ser um banco de dados open source existem várias
soluções, mas muitas estão sem implementação; direcionando os estudos para um novo
levantamento com o intuito de saber quais soluções implementadas são mais utilizadas
pelos usuários do PostgreSQL.
Na seqüência foram pesquisadas propostas independentes de banco de dados, e
assim como no PostgreSQL, a documentação é vasta, mas a grande maioria se limitou
apenas em documentar, não levando adiante a implementação e os testes para validação.
78
Com a pesquisa feita, foi iniciado o desenho da arquitetura, tendo como foco os
diagramas de classes e de seqüências. Tais diagramas foram refinados muitas vezes até
chegar à versão apresentada neste documento.
Com os diagramas prontos foi iniciado a implementação do middleware, exigindo
maiores esforços nos tópicos de identificação do IP, criação e tratamento de mensagens e
seu envio e recebimento via sockets, além da criação, tratamento, envio e recebimento de
arquivos XML.
Por fim, foi necessário conseguir um laboratório para que os testes de validação
fossem feito, sendo necessário instalar o middleware além do Firebird 2.0, todos
instanciados sobre o sistema operacional Windows XP Professional Service Pack 3 (Leia
5.5. Cenário).
6.4. Trabalhos Futuros
Ao incorporar a classe LUCAS numa DLL, o middleware ficou heterogêneo quanto
a linguagem de programação do sistema cliente, porém limitou seu uso as linguagens de
programação que tem suporte a DLL. Deixar o LUCAS ainda mais heterogêneo deve ser
revisto em estudos futuros.
A perda de desempenho do GABRIEL é um ponto que merece ser alvo de estudos
futuros, para transformar o mesmo em um aplicativo distribuído. Estes estudos devem
tentar remover o ponto de sobrecarga detectado nos testes de validação e o ponto de falha
no caso de queda do GABRIEL.
O uso de esquemas pelo GABRIEL para gerenciar os dados e as instâncias dos
SGBDRs por si só já é uma questão que deve ser levantada para estudos futuros, mas a
criação de esquemas pode levar a outros estudos futuros como os mostrados na seqüência:
‒ Fragmentação vertical dos dados: O uso de esquemas permitiria ao
middleware evoluir para a fragmentação vertical dos dados;
‒ Alta disponibilidade dos dados: Com o uso de esquemas pode ser
implementado a redundância dos dados em instâncias distintas do SGBDs
aumentando a disponibilidade dos dados;
‒ Balanceamento automático de carga: Sempre que um novo servidor
ingressasse na arquitetura, o middleware se encarregaria de refazer o
79
balanceamento entre as instâncias do SGBDs, aumentando o desempenho do
sistema como um todo.
Um estudo futuro com esquema importante que deve ser considerado é a
fragmentação de relação inteira, onde todos os dados de uma tabela são mantidos num
único servidor. Desta maneira sistemas ERP (Enterprise Resource Planning – Sistemas
Integrados de Gestão Empresarial) e CRM (Customer Relationship Management - Gestão
de Relacionamento com o Cliente) poderiam se beneficiar do middleware, pois estes
sistemas veriam o middleware como um SGBD único, se preocupando apenas em solicitar
os serviços ao GABRIEL, implementando SOA (Service Oriented Architecture –
Arquitetura Orientada a Serviços) na arquitetura de distribuição de dados do middleware.
Independente do uso de esquema para fragmentação de dados, o middleware pode
ser usado como SOA em consultas entre empresas do mesmo grupo que retornem, por
exemplo, o histórico de compras e pagamentos de um determinado cliente, conjuntura
comum em empresas que tenham uma ou mais filiais, e que são obrigadas a utilizar
soluções nem sempre práticas (consulta via telefone entre a matriz e as filiais, troca de
mensagens instantâneas, etc.) para obter tais informações.
80
Apêndice A
Detalhamento dos atributos e métodos da classe LUCAS.
Tabela A.1 – Atributos da classe LUCAS
Atributo
Conteúdo
Porta_Endereco
- Porta que será usada na conexão;
- Endereço do GABRIEL;
- Endereço onde será colocado o arquivo XML retornado
pelo GABRIEL
Tabela
- ID da solicitação;
- Tabela que será usada na solicitação;
- Tipo de Solicitação (tipo enumerado Tipo_Solicitacao);
- Condição (quando houver) que deve ser atendida na solicitação
ChaveEstrangeira
- ID da solicitação;
- Tabela estrangeira;
- Campo da tabela local que receberá o valor da chave primária da
tabela estrangeira
Dados
- ID da solicitação;
- Campo da tabela local;
- Valor que será atribuído ao campo da tabela local
ID_Solicitacao
- ID de solicitação atual
SoqueteCliente
- socket cliente descendente da classe ClientSocket
Tabela A.2 – Métodos da classe LUCAS
Método
Parâmetro
Descrição
EnviarMensagem
Mensagem
Envia o conteúdo do parâmetro ao
método SetMensagem do SoqueteCliente
SalvarXML
NomeAtributo
Persiste, em um arquivo XML, o atributo
de configuração passado
81
SetSolicitar
- Solicitar
- Configura tipo de solicitação que será
executada (ver atributo Tabela);
- Condicao
- Condição que deve ser atendida
(ver atributo Tabela);
- Requisitar
- Quando verdadeiro chama o método
SetRequisitar
Método relacionado:
- SetRequisitar
- SetTabela
- SetChaveEstrangeira
Construir
SetPorta
Construtor da classe
Porta
Configura porta de conexão com o
GABRIEL (ver atributo Porta_Endereco)
SetMediador
Endereco
Configura endereço do GABRIEL
(ver atributo Porta_Endereco)
SetResposta
Endereco
Configura endereço do arquivo XML de
retorno (ver atributo Porta_Endereco)
SetConfiguracao
- Porta
- Envia o conteúdo do parâmetro ao
método SetPorta
- EnderecoMediador
- Envia o conteúdo do parâmetro ao
método SetMediador
- EnderecoResposta
- Envia o conteúdo do parâmetro ao
método SetResposta
SetTabela
Tabela
Configura tabela que será usada na
solicitação (ver atributo Tabela)
SetChaveEstrangeira
- Tabela
- Configura tabela estrangeira
(ver atributo ChaveEstrangeira)
- Campo
- Configura campo da tabela local
(ver atributo ChaveEstrangeira)
82
SetDados
- Campo
- Configura campo da tabela local
(ver atributo Dados)
- Valor
- Configura valor que será atribuído ao
campo (ver atributo Dados)
Clear
Limpa todas as solicitações pendentes
ClearChaveEstrangeira
Limpa todas as chaves estrangeiras das
solicitações pendentes
ClearChaveEstrangeira
- Tabela
Limpa a chave estrangeira da solicitação
atual com tabela estrangeira e campo
- Campo
local iguais aos passados pelos
parâmetros
ClearDados
Limpa todos os dados das solicitações
pendentes
ClearDados
Campo
Limpa todos os dados da solicitação
atual com campo igual ao passado pelo
parâmetro
GetPorta
Captura porta de conexão com o
GABRIEL (ver atributo Porta_Endereco)
GetMediador
Captura endereço do GABRIEL
(ver atributo Porta_Endereco)
GetResposta
Captura endereço do arquivo XML de
retorno (ver atributo Porta_Endereco)
GetTabela
Captura IDs, tabelas, tipos de
solicitações e condições das solicitações
pendentes (ver atributo Tabela)
GetChaveEstrangeira
Captura IDs, tabelas estrangeiras e
campos da tabelas locais das solicitações
pendentes
(ver atributo ChaveEstrangeira)
83
GetDados
Captura IDs, campos e valores dos dados
das solicitações pendentes
(ver atributo Dados)
GetPendente
Captura o número de solicitações
pendentes
SetIncluir
Requisitar
Envia o parâmetro Requisitar ao método
SetSolicitar, informando que a pendência
atual se refere a uma inclusão
SetAlterar
- Condicao
Envia os parâmetros Condicao e
Requisitar ao método SetSolicitar,
- Requisitar
informando que a pendência atual se
refere a uma alteração
SetExcluir
- Condicao
Envia os parâmetros Condicao e
Requisitar ao método SetSolicitar,
- Requisitar
informando que a pendência atual se
refere a uma exclusão
SetConsultar
- Condição
Envia os parâmetros Condicao ao
método SetSolicitar, informando que a
pendência atual se refere a uma consulta
SetConsultarSQL
ComandoSelect
Envia o conteúdo do parâmetro (deve ser
um comando select) ao método
EnviarMensagem
SetRequisitar
Gera os comandos SQL das solicitações
pendentes e os passa ao método
EnviarMensagem
Método relacionado:
- EnviarMensagem
- Clear
84
Apêndice B
Detalhamento dos atributos e métodos da classe ClientSocket.
Tabela B.1 – Atributos da classe ClientSocket
Atributo
Conteúdo
Status
Status atual do socket cliente (tipo enumerado Tipo_Status)
Porta
Porta que será usada na conexão
Conectado
Status da conexão
Tabela B.2 – Métodos da classe ClientSocket
Método
Parâmetro
Construir
Descrição
Construtor da classe
SetStatus
Status
Configura o atributo Status
SetPorta
Porta
Configura o atributo Porta
SetConectado
Conectado
Configura o atributo Conectado
GetStatus
Captura o atributo Status
- Aguardando = 0;
- Processando = 1;
- Baixando = 2
GetStatus
Status
Captura o atributo Status, além de
retorna, através do parâmetro passado
por referencia, o valor de enumeração
Tipo_Status
GetPorta
Captura o atributo Porta
GetConectado
Captura o atributo Conectado
SoqueteClienteLocalizar
Localizador do socket servidor
SetMensagem
Mensagem
Envia conteúdo do parâmetro para o
socket servidor
85
GetMensagem
Captura mensagem enviada pelo socket
servidor
GetErro
Captura erros que possam ocorrer entre
a conexão cliente e servidor
86
Apêndice C
Detalhamento dos atributos e métodos da classe GABRIEL.
Tabela C.1 – Atributos da classe GABRIEL
Atributo
Conteúdo
Porta_Relembrar
- Porta que será usada na conexão;
- Flag que indica se será efetuada uma contagem de registros nas
tabelas sempre que for efetuar uma inclusão
Servidor
- Nome do servidor
- Endereço do banco de dados no servidor
Tabela
- Nome das tabelas que serão gerenciadas pelo GABRIEL
- Nome do campo indicado como chave primária
- Último número gerado para a chave primaria
ServidorTabela
- Nome do servidor
- Nome da tabela
- Quantidade de registros da tabela no servidor
Este atributo é o responsável por manter os SGBDs balanceados,
através da quantidade de registros que uma tabela tem em cada um
dos SGBDs
SoqueteServidor
- Socket servidor descendente da classe ServerSocket
ConexaoSQL
- Vetor descendente da classe SQLConnect
Tabela C.2 – Métodos da classe GABRIEL
Método
Parâmetro
ConstruirConexaoSGBD Servidor
Descrição
Construtor da conexão do GABRIEL
com o SGBD
DestruirConexaoSGBD
Servidor
Destruidor da conexão do GABRIEL
com o SGBD
87
ExecutarSQL
- Mensagem
- Comando(s) SQL
- Origem
- Origem do solicitante
- Controle
- Número controle do solicitante
Envia o(s) comando(s) SQL (insert,
update, delete, select) do parâmetro
Mensagem para o método
ExecutarComandoSQL do
ConexaoSQL; caso o parâmetro
Mensagem contenha uma consulta
(select), os registros de retorno do
SGBDs são colocados em um arquivo
XML, onde sua identificação é feita
através dos parâmetros Origem e
Controle
SalvarXML
NomeAtributo
Persiste, em um arquivo XML, o
atributo de configuração passado
SetServidorTabela
Atualiza o atributo ServidorTabela
sempre que houve uma atualização nos
atributos Servidor ou Tabela
EraseServidorTabela
- Nome
- Nome do servidor ou tabela
- Servidor
- Flag que indica se o nome é de um
servidor ou de uma tabela
Exclui todos os itens do atributo
ServidorTabela que coincidam com os
parâmetros passados
Construir
SetPorta
Construtor da classe
Porta
Configura porta de conexão
(ver atributo Porta_Relembrar)
88
SetTabelaRelembrar
TabelaRelembrar
Configura flag de contagem de registros
(ver atributo Porta_Relembrar)
SetServidor
- Nome
Configura atributo Servidor
- Endereco
(ver atributo Servidor)
Métodos relacionados:
- ConstruirConexaoSGBD
- SetServidorTabela
SetConfiguracao
- Porta
- Envia o conteúdo do parâmetro ao
método SetPorta
- ServidorNome
- ServidorEndereco
- TabelaRelembrar
- Envia o conteúdo dos parâmetros ao
método SetServidor
- Envia o conteúdo do parâmetro ao
método SetTabelaRelembrar
SetTabela
- Tabela
Configura atributo Tabela
- Chave
(ver atributo Tabela)
- Gerador
Método Relacionado:
- SetServidorTabela
EraseServidor
Nome
Exclui o item do atributo Servidor que
coincide com o parâmetro
Métodos relacionados:
- DestruirConexaoSGBD
- EraseServidorTabela
89
EraseTabela
Tabela
Exclui o item do atributo Tabela que
coincide com o parâmetro
Método relacionado:
- EraseServidorTabela
GetPorta
Captura porta de conexão
(ver atributo Porta_Relembrar)
GetTabelaRelembrar
Captura flag de contagem de registros
(ver atributo Porta_Relembrar)
GetServidor
Captura atributo Servidor
(ver atributo Servidor)
GetTabela
Captura atributo Tabela
(ver atributo Tabela)
90
Apêndice D
Detalhamento dos atributos e métodos da classe ServerSocket.
Tabela D.1 – Atributos da classe ServerSocket
Atributo
Conteúdo
Porta
Porta que será usada na conexão
Conectado
Status da conexão
Tabela D.2 – Métodos da classe ServerSocket
Método
Parâmetro
Construir
Descrição
Construtor da classe
SetPorta
Porta
Configura o atributo Porta
SetConectado
Conectado
Configura o atributo Conectado
GetPorta
Captura o atributo Porta
GetConectado
Captura o atributo Conectado
SetMensagem
Mensagem
Envia conteúdo do parâmetro para o
socket cliente
GetMensagem
Captura mensagem enviada pelo socket
cliente
GetErro
Captura erros que possam ocorrer entre a
conexão cliente e servidor
91
Apêndice E
Detalhamento dos atributos e métodos da classe SQLConnect.
Tabela E.1 – Atributos da classe SQLConnect
Atributo
Conteúdo
BaseDados
Endereço da base de dados
DialetoSQL
Dialeto SQL usado pelo SGBD
SolicitarLogin*
Flag usado para informar se deverá ser pedido usuário e senha toda
vez que o banco de dados for conectado
Usuario*
Usuário que está se conectando com o banco de dados
Senha*
Senha do usuário
Ativo
Status da conexão
ComandoSQL
Comando SQL que deverá ser executado
*Os atributos Usuario e Senha só serão usados no momento da conexão com o SGBD se o atributo SolicitarLogin não estiver habilitado.
Tabela E.2 – Métodos da classe SQLConnect
Método
Parâmetro
Construir
Descrição
Construtor da classe
SetBaseDados
BaseDados
Configura o atributo BaseDados
SetDialetoSQL
DialetoSQL
Configura o atributo DialetoSQL
SetSolicitarLogin
SolicitarLogin
Configura o atributo SolicitarLogin
SetUsuario
Usuario
Configura o atributo Usuario
SetSenha
Senha
Configura o atributo Senha
SetAtivo
Ativo
Configura o atributo Ativo
SetComandoSQL
ComandoSQL
Configura o atributo ComandoSQL
GetBaseDados
Captura o atributo BaseDados
GetDialetoSQL
Captura o atributo DialetoSQL
GetSolicitarLogin
Captura o atributo SolicitarLogin
GetUsuario
Captura o atributo Usuário
GetSenha
Captura o atributo Senha
92
GetAtivo
Captura o atributo Ativo
GetComandoSQL
Captura o atributo ComandoSQL
ExecutarComandoSQL
Executa o comando SQL que está no
atributo ComandoSQL retornando,
quando for uma consulta (select), os
registros
93
Apêndice F
Algoritmo do método SetRequisitar da classe LUCAS:
// Tabela, Dados, ChaveEstrangeira: Atributos da classe LUCAS
//
do tipo HashMAP.
Variáveis Locais
SQL: String;
ReqDados: String;
ReqDadosValor: String;
ReqChaveEstrangeira: String;
Inicio
SQL.Limpar;
Tabela.Primeiro;
Enquanto (não for o fim de Tabela) Faça
Inicio
// Preparação do atributo Dados para todas as solicitações
ReqDados.Limpar;
Dados.Filtro =
“ID_Solicitacao = ” + Tabela[“ID_Solicitacao”];
Dados.Primeiro;
// Solicitação de inclusão
Se (Tabela[“Solicitacao”] == “Incluir”) Então
Inicio
ReqDadosValor.Limpar;
Enquanto (não for o fim de Dados) Faça
Inicio
Se (ReqDados <> “”) Então
Inicio
ReqDados = ReqDados + “, ”;
ReqDadosValor = ReqDadosValor + “, ”;
Fim;
ReqDados = ReqDados + Dados[“Campo”];
ReqDadosValor = ReqDadosValor + “'” +
Dados[“Valor”] + “'”;
Dados.Próximo;
Fim;
ReqChaveEstrangeira.Limpar;
ChaveEstrangeira.Filtro = “ID_Solicitacao = ” +
Tabela[“ID_Solicitacao”];
ChaveEstrangeira.Primeiro;
Enquanto (não for o fim de ChaveEstrangeira) Faça
Inicio
ReqChaveEstrangeira = ReqChaveEstrangeira +
ChaveEstrangeira[“Tabela”] + “, ” +
ChaveEstrangeira[“Campo”] +
Char(27) + Char(10) + Char(13);
ChaveEstrangeira.Próximo;
Fim;
Se ( ReqChaveEstrangeira <> “” ) Então
Inicio
ReqChaveEstrangeira =
Char(27) + Char(10) + Char(13) +
ReqChaveEstrangeira;
94
Fim;
Se (ReqDados <> “” ) E (ReqDadosValor <> “”) Então
Inicio
SQL = SQL + “insert into ” + Tabela[“Tabela”] +
“ (” + ReqDados + “) values (” + ReqDadosValor +
“)” + ReqChaveEstrangeira + “;”;
Fim;
Fim
SeNão Se (Tabela[“Solicitacao”] == “Alterar” ) Então
Inicio
Enquanto (não for o fim de Dados) Faça
Inicio
Se (ReqDados <> “”) Então
Inicio
ReqDados = ReqDados + “, ”;
Fim;
ReqDados = ReqDados + Dados[“Campo”] + “ = '” +
Dados[“Valor”] + “'”;
Dados.Próximo;
Fim;
Se (ReqDados <> “”) Então
Inicio
SQL = SQL + “update ” + Tabela[“Tabela”] + “ set ” +
ReqDados + “ where ” + Tabela[“Condicao”] + “;”;
Fim;
Fim
SeNão Se (Tabela[“Solicitacao”] == “Excluir” ) Então
Inicio
SQL = SQL + “delete from ” + Tabela[“Tabela”] +
“ where ” + Tabela[“Condicao”] + “;”;
Fim
SeNão Se (Tabela[“Solicitacao”] == “Consultar” ) Então
Inicio
Enquanto (não for o fim de Dados) Faça
Inicio
Se (ReqDados <> “”) Então
Inicio
ReqDados = ReqDados + “, ”;
Fim;
ReqDados = ReqDados + Dados[“Campo”];
Dados.Próximo;
Fim;
Se (ReqDados <> “”) Então
Inicio
SQL := SQL + “select ” + ReqDados + “ from ” +
Tabela[“Tabela”] + “ where ” +
Tabela[“Condicao”] + “;”;
Fim;
Fim;
Tabela.Próximo;
end;
EnviarMensagem(SQL);
Fim;
95
Apêndice G
Tabela G.1 – Chamadas aos métodos da classe LUCAS
Método da classe LUCAS
Chama via DLL
LUCAS_DLL.SetAtivarSoquete
LUCAS_SetAtivarSoquete
LUCAS_DLL.SetPorta
LUCAS_SetPorta
LUCAS_DLL.SetMediador
LUCAS_SetMediador
LUCAS_DLL.SetResposta
LUCAS_SetResposta
LUCAS_DLL.SetConfiguracao
LUCAS_SetConfiguracao
LUCAS_DLL.SetTabela
LUCAS_SetTabela
LUCAS_DLL.SetChaveEstrangeira
LUCAS_SetChaveEstrangeira
LUCAS_DLL.SetDados
LUCAS_SetDados
LUCAS_DLL.Clear
LUCAS_Clear
LUCAS_DLL.ClearChaveEstrangeira
LUCAS_ClearChaveEstrangeiraTudo
LUCAS_DLL.ClearChaveEstrangeira
LUCAS_ClearChaveEstrangeira
LUCAS_DLL.ClearDados
LUCAS_ClearDadosTudo
LUCAS_DLL.ClearDados
LUCAS_ClearDados
LUCAS_DLL.GetSoqueteAtivo
LUCAS_GetSoqueteAtivo
LUCAS_DLL.GetSoqueteAtivar
LUCAS_GetSoqueteAtivar
LUCAS_DLL.GetPorta
LUCAS_GetPorta
LUCAS_DLL.GetMediador
LUCAS_GetMediador
LUCAS_DLL.GetResposta
LUCAS_GetResposta
LUCAS_DLL.GetTabela
LUCAS_GetTabela
LUCAS_DLL.GetChaveEstrangeira
LUCAS_GetChaveEstrangeira
LUCAS_DLL.GetDados
LUCAS_GetDados
LUCAS_DLL.GetPendente
LUCAS_GetPendente
LUCAS_DLL.GetStatus
LUCAS_GetStatus
LUCAS_DLL.GetStatus
LUCAS_GetStatusDescr
LUCAS_DLL.SetIncluir
LUCAS_SetIncluir
LUCAS_DLL.SetAlterar
LUCAS_SetAlterar
96
LUCAS_DLL.SetExcluir
LUCAS_SetExcluir
LUCAS_DLL.SetConsultar
LUCAS_SetConsultar
LUCAS_DLL.SetConsultarSQL
LUCAS_SetConsultarSQL
LUCAS_DLL.SetRequisitar
LUCAS_SetRequisitar
Tabela G.2 – Métodos auxiliares utilizados na sobrecarga
Método
Descrição
Tabela
GerarNome
Cria um conjunto de nomes e sobrenomes para
- Cliente
as inclusões
- Funcion
Cria endereços para as inclusões e alterações
- Cliente
GerarEnder
- Funcion
GerarBairro
Cria bairros para as inclusões, alterações e
- Cliente
consultas
- Funcion
GerarDescr
Cria descrições para as inclusões e consultas
- Produto
GerarValor
Cria valores monetários para as inclusões,
- Produto
alterações e consultas
GerarComiss
Cria valores em percentuais para as inclusões e
- Produto
consultas
GerarPDV_ID
Captura o valor que será usado no campo ID das - PDV
inclusões
MaiorID(Tabela: string)
Captura o maior valor já incluído no campo ID
- Cliente
- Funcion
- Produto
- PDV
- PDV_Item
97
Tabela G.3 – Resumo das configurações dos computadores usados no teste
Sistema Operacional
Processador
HD
Placa Mãe
Memória
Windows XP Professional Service Pack 3 (build 2600)
3,00 gigahertz Intel Pentium D
16 kilobyte primary memory cache
2048 kilobyte secondary memory cache
64-bit ready
Multi-core (2 total)
Not hyper-threaded
WDC WD800BB-63JKC0 [Hard drive] (80,03 GB) -- drive 0, s/n
WD-WCAMDA734570, rev 05.01C05, SMART Status: Healthy
Board: Gigabyte Technology Co., Ltd. VM900M
Bus Clock: 200 megahertz
BIOS: Award Software International, Inc. FC 08/14/2007
448 Megabytes Usable Installed Memory
98
Referências
AULT, Mike; TUMMA, Madh. Oracle 10g Grid & Real Application Clusters:
Oracle10g Grid Computing with RAC. 2004. Kittrell, North Carolina, USA: Rampant
TechPress. 680 p.
CENTER, Next Generation. Grid Computing. http://www.nextgenerationcenter.
com/v3/web/download.php?curso_id=58. 10 de Dezembro de 2008.
COULOURIS, George; DOLLIMORE, Jean; KINDBERG, Tim. Sistemas
Distribuídos: Conceitos e Projetos. Tradução: João Tortello. 4. ed. Porto Alegre:
Bookman, 2007. 784 p.
FARIA, Rogério Amorim de. Treinamento Avançado em XML. São Paulo:
Digerati Books, 2005. 126 p.
FERREIRA, E. C.; SANTOS, A. F. P. dos; SCHULZE, B. Distribuição de
Processos em Ambiente de Grid. http://arquivosweb.lncc .br/pdfs/relatorio-31-03.pdf. 03
de Dezembro de 2008.
Guia de Estrutura e Administração do Ambiente de Cluster e Grid.
http://guialivre.governoeletronico.gov.br/guiaonline/downloads/guiacluster.pdf.
30
de
Dezembro de 2008.
JUNIOR, Tercilio Stedile. Um Modelo para Compartilhamento de Bases de
Dados Distribuídas e Heterogêneas. http://www.tede.ufsc.br/teses/ PGCC0679 .pdf. 13 de
Dezembro de 2008.
KUROSE, James F; ROSS, Keith W. Redes de Computadores e a Internet: Uma
abordagem top-down. Tradução: Arlete Simille Marques. 3. ed. São Paulo: Pearson
Addison Wesley, 2006. 634 p.
MATTOSO, Marta; ZIMBRÃO, Geraldo; LIMA, Alexandre A. B.; BAIÃO,
Fernanda; BRAGANHOLO, Vanessa P.; AVELEDA, Albino A.; MIRANDA, Bernardo;
ALMENTERO, Bruno Kinder; COSTA, Marcelo Nunes. ParGRES: Middleware para
Processamento Paralelo de Consultas OLAP em Clusters de Banco de Dados.
http://www.dcc.ufrj.br/~braganholo/artigos/mattoso2005-sbbd-demos.pdf. 16 de Dezembro
de 2009.
99
ELMASRI, Ramez; NAVATHE, Shamkant B. Sistemas de Banco de Dados. 4. ed.
São Paulo, Pearson Addison Wesley, 2005. 724 p.
NOGUEIRA, Rui Miguel Silvestre Matos. Viabilidade RAC Oracle10g + Linux /
Benchmarking Linux VS Windows 2003. http://www.di.fc.ul.pt/disciplinas/pei/pei0506/
conteudo/documentos/rels_finais/0506rfinal_23052.pdf. 30 de Novembro de 2008.
OLIVEIRA, C. H. P. de. Tecnologia de Grid Computing utilizando Banco de
Dados Oracle. http://www.niee.ufrgs.br/eventos/CBCOMP/2004/mini_curso/MiniCurso
%2005.pdf. 28 de Novembro de 2008.
RAMAKRISHNAN, Raghu; GEHRKE, Johannes. Sistemas de Banco de Dados.
Tradução: Acauan Pereira Fernandes, Celia Taniwaki, João Tortello. 2. ed. São Paulo:
McGraw-Hill, 2008. 884 p.
SLONY. Slony-I. http://www.slony.info/. 30 de Dezembro de 2008.
SLONY. Introducing Slony. http://onlamp.com/pub/ a/onlamp/2004/11/18/
slony.html. 30 de Dezembro de 2008.
TANENBAUM, Andrew S. Sistemas Operacionais Modernos. Tradução: Ronaldo
A. L. Gonçalves, Luís A. Consularo. 2. ed. São Paulo: Pearson Prentice Hall, 2003. 695 p.
Download