FERRAMENTA PARA REPLICAÇÃ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 bibliográfica Especificação Implementação Operacionalidade Conclusão Introdução Replicação de dados SGBD PostgreSQL Replicadores de dados atuais Objetivos Implementar uma ferramenta de replicação de dados para o SGBD PostgreSQL; Caracterizar uma replicação assíncrona; Manter consistência entre as instâncias do SGBD PostgreSQL; Resolver conflitos na replicação de dados. Motivação As ferramentas atuais para replicação de dados que atuam sobre o SGBD PostgreSQL basicamente operaram exclusivamente sobre o sistema operacional Linux ou Unix, além de terem como ponto forte a replicação síncrona dos dados. Revisão bibliográfica Sistemas Distribuídos Date (1991, p. 617), sistema distribuído é “qualquer sistema que envolve múltiplas 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 da coordenação de mensagens (COULOURIS; DOLLIMORE; KINDBERG, 2001, p. 553) Revisão bibliográfica Banco de Dados Um banco de dados é uma coleção integrada de dados onde o mesmo envolve os pró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 bibliográfica Replicação de Dados Utilizada para obter maior uma maior disponibilidade dos serviços; Gera um aumento de desempenho quando são necessários a obtenção de dados de locais geográficos distintos; Replicação Assíncrona; Replicação Síncrona; Revisão bibliográfica Java RMI Permite a comunicação entre objetos remotos; É a implementação do RPC para a linguagem Java; Maior transparê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 de dados em tempo real; Replicação apenas read only nas base de dados slaves, ou seja, inserções, alterações e exclusões somente poderiam ser efetuadas na base de dados master. Trabalhos Correlatos Slony Surgiu a partir da idéia de existir um replicador de dados que não fosse específico para nenhuma versão do SGBD PostgreSQL; master to multiple slavers; não é indicado quando a ocorrência de quedas dos nodos seja freqüente; a não detecção na falha de um nodo e também a não eleição de um nodo master são algumas de suas características Trabalhos Correlatos Postgres-R O Postgres-R, um replicador síncrono, é 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 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 restabelecer a conexão quando da ocorrência de alguma falha (RF); permitir a configuração de parâmetros de uma replicação (como tempo e tabelas) (RF); resolver conflitos na replicação de dados utilizando o conceitos de versão para linhas e prioridade do site (RF); implementar o projeto utilizando a linguagem de programação Java (RNF); possibilitar a replicaçã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 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 inicio [Qual o tipo de replicação?] Definir o tipo replicação (tables ou schemas) [schemas] [tables] Definir os schemas a serem replicados Definiar as tabelas a serem replicadas final Especificação ad UC05 - replicar as informações Nodo de Origem Nodo de Destino i nicio Para todos os nodos a serem replicados fi nal Carrega próximo obj eto remoto [Não] [Sim] [Obteve sucesso?] [Existem mais nodos?] [Sim] Carrega tabelas a serem replicadas Selecionar uma tabela Carrega v ersão do dado [Não] [Acabou?] Versão do dado recebi do mai or que o armazenado? Enquanto houv er registros a serem replicados [Sim] [Não] [Si m] Selecionar registro Versão do dado recebido é menor que o armazenado? Armazena dado [Não] [Acabou regi stros?] [Não] Env iar registro [Sim] Marca registro como env iado [Não] O nodo de ori gem tem mai or prioridade? Especificação Diagrama de Classes cd src replicador.rmi RemindTask Remote + ReplicadorClient UnicastRemoteObject «interface» + ReplicadorImpl replicador.rmi::ReplicadorImpl replicador.rmi::Replicador + ReplicadorServer + + Replicador recebeRegistro(String, HashMap, String) : boolean + + ReplicadorImpl() recebeRegistro(String, HashMap, String) : boolean replicador.rmi:: ReplicadorServ er + + replicador.rmi::ReplicadorClient ReplicadorServer() main(String[ ]) : void ~ ~ ~ ~ ~ timer: Timer arquivo: Configuracao cluster: Cluster nodos: ArrayList = null objRemoto: HashMap + + - main(String[ ]) : void ReplicadorClient() carregaObjetosRemotos(Configuracao, ArrayList, Cluster) : HashMap replicaDados(Configuracao, ArrayList, Cluster, HashMap) : void replicador.cluster + Cluster + ConexaoBanco replicador.cluster::Cluster + Configuracao + dropdbr + initdbr replicador.cluster::Configuracao replicador.cluster::ConexaoBanco - 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() - conn: Connection = null + + + + + + ConexaoBanco() conecta(Configuracao) : boolean getConn() : Connection iniciaTransacao() : void finalizaTransacao(String) : void desconecta() : void + + Configuracao() carregaArquivo() : void replicador.cluster:: dropdbr + + dropdbr() main(String[]) : void replicador.cluster:: initdbr + + initdbr() main(String[]) : void ~ ~ ~ i: int table: String schema: String + + + + + + + + + + + + + + + + + + + + + + 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 foi utilizado o NetBeans da SUN Microsystems na sua versão 5.5; Primeira etapa do desenvolvimento: leitura do arquivo de configuração; Cuidado para não prender a aplicaçã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 a. b. c. d. Tabelas de armazenamento; Estrutura original da tabela e adicionados os seguintes campos: chave primária seqüencial; hora de inserção do registro; nodos destinos todos atualizados; 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 entre os nodos; Sincronia dos dados apó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 a. b. c. d. Extensões: Implementação para outros SGBDs; Possibilitar a replicação de tabelas sem chave primária; Outras técnicas de resolução de conflitos; Implementar a replicação síncrona. Relevância pessoal Aprendizado sobre distintas técnicas de replicação de dados e suas aplicações; Conhecimento gerado do SGBD e seus recursos; Conhecimento sobre Java RMI; Java.