FERRAMENTA PARA REPLICAÇÃ ÇÃO O DE DADOS NO SGBD POSTGRESQL Malcus Otávio Quinoto Imhof Alexander Roberto Valdameri - Orientador
Roteiro da apresentaçã ção Introduçã ção Objetivos Motivaçã ção Revisão o bibliográfica Especificaçã ção Implementaçã ção Operacionalidade Conclusão
Introduçã ção Replicaçã ção o de dados SGBD PostgreSQL Replicadores de dados atuais
Objetivos Implementar uma ferramenta de replicaçã ção o de dados para o SGBD PostgreSQL; Caracterizar uma replicaçã ção o assíncrona; Manter consistência ncia entre as instâncias ncias do SGBD PostgreSQL; Resolver conflitos na replicaçã ção o de dados.
Motivaçã ção As ferramentas atuais para replicaçã ção o de dados que atuam sobre o SGBD PostgreSQL basicamente operaram exclusivamente sobre o sistema operacional Linux ou Unix, além m de terem como ponto forte a replicaçã ção o síncrona s dos dados.
Revisão o bibliográfica Sistemas Distribuídos Date (1991, p. 617), sistema distribuído do é qualquer sistema que envolve múltiplas m localidades conectadas [...], nas quais o usuário [...] de qualquer localidade pode acessar os dados armazenados em outro local; Define-se como uma rede de computadores que possui vários componentes se comunicando através s da coordenaçã ção o de mensagens (COULOURIS; DOLLIMORE; KINDBERG, 2001, p. 553)
Revisão o bibliográfica Banco de Dados Um banco de dados é uma coleçã ção o integrada de dados onde o mesmo envolve os próprios prios dados, o hardware em que os dados residem, o software que controla o armazenamento e os usuários (DEITEL; DEITEL, p. 812, 2001).
Revisão o bibliográfica Replicaçã ção o de Dados Utilizada para obter maior uma maior disponibilidade dos serviços; Gera um aumento de desempenho quando são s necessários a obtençã ção o de dados de locais geográficos distintos; Replicaçã ção o Assíncrona; Replicaçã ção o Síncrona; S
Revisão o bibliográfica Java RMI Permite a comunicaçã ção o entre objetos remotos; É a implementaçã ção o do RPC para a linguagem Java; Maior transparência ncia para o desenvolvedor;
Trabalhos Correlatos ERServer É um replicador master to multiple slavers,, baseado em trigger. Este replicador de dados foi descontinuado pelos desenvolvedores para o desenvolvimento do Slony; Capacidade de efetuar a replicaçã ção o de dados em tempo real; Replicaçã ção o apenas read only nas base de dados slaves,, ou seja, inserçõ ções, alteraçõ ções e exclusões es somente poderiam ser efetuadas na base de dados master.
Trabalhos Correlatos Slony Surgiu a partir da idéia ia de existir um replicador de dados que não n o fosse específico para nenhuma versão o do SGBD PostgreSQL; master to multiple slavers; não é indicado quando a ocorrência de quedas dos nodos seja freqüente; ente; a não n o detecçã ção o na falha de um nodo e também m a não o eleiçã ção o de um nodo master são o algumas de suas características
Trabalhos Correlatos Postgres-R O Postgres-R, um replicador síncrono, s é tido como um modelo de replicador de base de dados, no qual foi baseado no SGBD PostgreSQL 6.4.2; Considerado a mais avançada ada soluçã ção open source existente; O uso deste replicador é aconselhado para redes locais; Cópias shadow;
Requisitos principais do problema a ser trabalhado replicar os dados após s restabelecer a conexão o quando da ocorrência de alguma falha (RF); permitir a configuraçã ção o de parâmetros de uma replicaçã ção o (como tempo e tabelas) (RF); resolver conflitos na replicaçã ção o de dados utilizando o conceitos de versão o para linhas e prioridade do site (RF); implementar o projeto utilizando a linguagem de programaçã ção o Java (RNF); possibilitar a replicaçã ção o assíncrona entre diversos sistemas operacionais (RNF).
Especificaçã ção Casos de Uso ud Replicador UC01 - configurar arquiv o parâmetros Usuário UC02 - replica dados
Especificaçã ção Diagrama de Atividades ad U C 01 -configurar arquivo parâm etros inicio Informar o nome do schema de armazenamento Informar o periodo de tempo entre as replicações Informar o nome do nodo Definir a lista de nodos destinos Definir a conexão com o banco de dados Informar a prioridade do nodo [Qual o tipo de replicação?] Definir o tipo replicação (tables ou schemas) [tables] [schemas] Definiar as tabelas a serem replicadas Definir os schemas a serem replicados final
Especificaçã ção ad UC05 - replicar as informações inicio Nodo de Origem Para todos os nodos a serem replicados Nodo de Destino final Carrega próximo objeto remoto [Não] [Sim] [Existem mais nodos?] [Obteve sucesso?] [Sim] Carrega tabelas a serem replicadas [Não] [Acabou?] Selecionar uma tabela Carrega versão do dado [Sim] Enquanto houver registros a serem replicados [Sim] Versão do dado recebido maior que o armazenado? [Não] Versão do dado recebido é menor que o armazenado? [Não] Selecionar registro Armazena dado [Acabou registros?] Enviar registro [Não] [Sim] Marca registro como env iado [Não] O nodo de origem tem maior prioridade?
Especificaçã ção Diagrama de Classes cd src replicador.rmi RemindTask + ReplicadorClient + ReplicadorImpl + ReplicadorServer + Replicador Remote «interface» replicador.rmi::replicador + receberegistro(string, HashMap, String) : boolean replicador.rmi::replicadorimpl UnicastRemoteObject + ReplicadorImpl() + receberegistro(string, HashMap, String) : boolean replicador.rmi:: ReplicadorServ er + ReplicadorServer() + main(string[ ]) : void ~ timer: Timer ~ arquivo: Configuracao ~ cluster: Cluster ~ nodos: ArrayList = null ~ objremoto: HashMap replicador.rmi::replicadorclient + main(string[ ]) : void + ReplicadorClient() - carregaobjetosremotos(configuracao, ArrayList, Cluster) : HashMap - replicadados(configuracao, ArrayList, Cluster, HashMap) : void replicador.cluster + Cluster + ConexaoBanco + Configuracao + dropdbr + initdbr replicador.cluster::configuracao - schema_store: String - replication_type: String - tables: ArrayList = new ArrayList() - schemas: ArrayList = new ArrayList() - replication_time: int - node_code: String - priority: int - row_version: int - dbdatabase: String - dbuser: String - dbpassword: String - addresses: ArrayList = new ArrayList() + Configuracao() + carregaarquivo() : void replicador.cluster:: dropdbr + dropdbr() + main(string[]) : void replicador.cluster::conexaobanco - conn: Connection = null + ConexaoBanco() + conecta(configuracao) : boolean + getconn() : Connection + iniciatransacao() : void + finalizatransacao(string) : void + desconecta() : void replicador.cluster:: initdbr + initdbr() + main(string[]) : void ~ i: int ~ table: String ~ schema: String replicador.cluster::cluster + Cluster() - nexttable(arraylist) : boolean - nextschema(arraylist) : boolean + existeschema(string, ConexaoBanco) : boolean + criaschema(string, ConexaoBanco) : void + excluischema(string, ConexaoBanco) : void + existetabelas(arraylist, ConexaoBanco) : boolean + existecamposcontrole(arraylist, ConexaoBanco) : boolean + criacamposcontrole(configuracao, ConexaoBanco) : void + carregatabelasschema(configuracao, ConexaoBanco) : void + criatabelasreplicacao(configuracao, ConexaoBanco) : void + excluicamposcontrole(configuracao, ConexaoBanco) : void - gettables(configuracao, ConexaoBanco) : ArrayList + criafuncaonodo(configuracao, ConexaoBanco) : void + criatriggercontrole(configuracao, ConexaoBanco) : void + excluitriggercontrole(configuracao, ConexaoBanco) : void + getnodos(configuracao) : ArrayList + getipnodo(configuracao, String) : String + getprioridadenodo(configuracao, String) : int + gettabelasparareplicar(configuracao) : ArrayList + getcampostabela(configuracao, String) : ArrayList + transmitedados(configuracao, String, Replicador, String) : void + armazenareplicacao(string, HashMap, String) : boolean + getprimarykey(configuracao, String) : ArrayList + gettabelasorigem(configuracao, String) : String
Implementaçã ção Na implementaçã ção o foi utilizado o NetBeans da SUN Microsystems na sua versão o 5.5; Primeira etapa do desenvolvimento: leitura do arquivo de configuraçã ção; Cuidado para não n o prender a aplicaçã ção o a um sistema operacional;
Implementaçã ção # set up the name of stored replicated tables and sequences schema_store = replicated # set the delay between the synchronization between the replicas (in seconds) replication_time = 60 # set my global node name. Max 50 characters node_code = node_a #set the priority of this node priority = 1 # database connections # JDBC default dbdatabase=jdbc:postgresql://localhost:5432/tcc dbuser=postgres dbpassword=master # enter the priority number, node_code, IP ddress [nodes] 1,node_b,10.1.1.8 # choose the type of replication (tables or schemas) replication_type = tables #tables to be replicated (respecting replication_type option) [tables] ve006 ge002 #public.b #anotherschema.anothertable #schemas to be replicated (respecting replication_type option) [schemas] public
Implementaçã ção Necessidade da utilização de tabelas de sistema do PostgreSQL; Dificuldade de obter documentação sobre essas tabelas; Estrutura complexa;
Implementação Campos de controle; Detecção e resolução de conflitos; Detecção da necessidade do registro ser replicado; Propriedade do registro;
Implementação Gatilhos; Responsáveis pelo controle dos registros que devem ou não ser replicados; Responsáveis pela alimentação das tabelas de armazenamento;
Implementação Tabelas de armazenamento; Estrutura original da tabela e adicionados os seguintes campos: a. chave primária seqüencial; b. hora de inserção do registro; c. nodos destinos todos atualizados; d. operação realizada (inserção, atualização ou exclusão). Tabela de controle de nodos atualizados;
Implementação Aplicativos de comunicação; Java RMI; Aplicativo Servidor; Aplicativo Cliente;
Operacionalidade Sincronia dos dados ocorrida sem nenhum conflito e nenhuma falha de comunicaçã ção o entre os nodos; Sincronia dos dados após s a ocorrência de alguma falha de comunicaçã ção; Existência de conflito entre os dados a serem replicados;
Conclusão
Conclusão Requisitos estabelecidos foram contemplados; Replicação assíncrona e consistência das informações; Comunicação confiável não necessário para o funcionamento da ferramenta; Características apresentadas neste trabalho que não estão inseridas em outras ferramentas;
Conclusão Extensões: a. Implementação para outros SGBDs; b. Possibilitar a replicação de tabelas sem chave primária; c. Outras técnicas de resolução de conflitos; d. Implementar a replicação síncrona.
Relevância pessoal Aprendizado sobre distintas técnicas t de replicaçã ção o de dados e suas aplicaçõ ções; Conhecimento gerado do SGBD e seus recursos; Conhecimento sobre Java RMI; Java.