Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Uma visão geral da replicação cruzada do PostgreSQL e MySQL


Este blog tem como objetivo explicar uma visão geral da replicação cruzada entre PostgreSQL e MySQL e discutir mais detalhadamente os métodos de configuração da replicação cruzada entre os dois servidores de banco de dados. Tradicionalmente, os bancos de dados envolvidos em uma configuração de replicação cruzada são chamados de bancos de dados heterogêneos, o que é uma boa abordagem para mudar de um servidor RDBMS para outro.

Os bancos de dados PostgreSQL e MySQL são convencionalmente bancos de dados RDBMS, mas também oferecem capacidade NoSQL com extensões adicionais para ter o melhor dos dois mundos. Este artigo se concentra na discussão da replicação entre PostgreSQL e MySQL a partir de uma perspectiva RDBMS.

Uma explicação exaustiva sobre os componentes internos da replicação não está no escopo deste blog, no entanto, alguns elementos fundamentais devem ser discutidos para dar ao público uma compreensão de como a replicação é configurada entre servidores de banco de dados, vantagens, limitações e talvez alguns casos de uso conhecidos.

Em geral, a replicação entre dois servidores de banco de dados idênticos é obtida no modo binário ou no modo de consulta entre um nó mestre (também chamado de editor, primário ou ativo) e um nó escravo (assinante, em espera ou passivo). O objetivo da replicação é fornecer uma cópia em tempo real do banco de dados mestre no lado escravo, onde os dados são transferidos do mestre para o escravo, formando assim uma configuração ativa-passiva, pois a replicação é configurada para ocorrer apenas em um sentido. Por outro lado, a replicação entre dois bancos de dados pode ser configurada nos dois sentidos para que os dados também possam ser transferidos do escravo de volta para o mestre, estabelecendo uma configuração ativo-ativo. Tudo isso pode ser configurado entre dois ou mais servidores de banco de dados idênticos que também podem incluir uma replicação em cascata. A configuração de ativo-ativo ou ativo-passivo realmente depende da necessidade do negócio, disponibilidade de tais recursos dentro da configuração nativa ou utilização de soluções externas para configurar e compensações aplicáveis.

A configuração acima mencionada pode ser realizada com diversos servidores de banco de dados, em que um servidor de banco de dados pode ser configurado para aceitar dados replicados de outro servidor de banco de dados completamente diferente e ainda manter um instantâneo em tempo real dos dados que estão sendo replicados. Ambos os servidores de banco de dados MySQL e PostgreSQL oferecem a maioria das configurações discutidas acima em sua própria natividade ou com a ajuda de extensões de terceiros, incluindo método de log binário, método de bloco de disco, métodos baseados em instruções e baseados em linhas.

A necessidade de configurar uma replicação cruzada entre MySQL e PostgreSQL realmente vem como resultado de um esforço de migração único para mudar de um servidor de banco de dados para outro. Como ambos os bancos de dados usam protocolos diferentes, eles não podem se comunicar diretamente. Para alcançar esse fluxo de comunicação, existe uma ferramenta externa de código aberto, como pg_chameleon.

Antecedentes de pg_chameleon


pg_chameleon é um sistema de replicação MySQL para PostgreSQL desenvolvido em Python 3. Ele usa uma biblioteca de código aberto chamada mysql-replication que também é desenvolvida usando Python. A funcionalidade envolve extrair imagens de linhas de tabelas MySQL e armazená-las como objetos JSONB em um banco de dados PostgreSQL, que é posteriormente decodificado por uma função pl/pgsql e reproduzir essas alterações no banco de dados PostgreSQL.

Recursos do pg_chameleon

  • Vários esquemas MySQL do mesmo cluster podem ser replicados para um único banco de dados PostgreSQL de destino, formando uma configuração de replicação de muitos para um
  • Os nomes dos esquemas de origem e destino podem não ser idênticos
  • Os dados de replicação podem ser extraídos da réplica em cascata do MySQL
  • As tabelas que não conseguem replicar ou gerar erros são excluídas
  • Cada funcionalidade de replicação é gerenciada com a ajuda de daemons
  • Controlado com a ajuda de parâmetros e arquivos de configuração baseados na construção YAML

Demonstração

Anfitrião vm1 vm2
Versão do SO CentOS Linux versão 7.6 x86_64 CentOS Linux versão 7.5 x86_64
Servidor de banco de dados com versão MySQL 5.7.26 PostgreSQL 10.5
Porta do banco de dados 3306 5433
endereço IP 192.168.56.102 192.168.56.106

Para começar, prepare a configuração com todos os pré-requisitos necessários para instalar o pg_chameleon. Nesta demonstração o Python 3.6.8 é instalado, criando um ambiente virtual e ativando-o para uso.
$> wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tar.xz
$> tar -xJf Python-3.6.8.tar.xz
$> cd Python-3.6.8
$> ./configure --enable-optimizations
$> make altinstall

Após uma instalação bem-sucedida do Python3.6, outros requisitos adicionais são atendidos, como criar e ativar um ambiente virtual. Além desse módulo pip atualizado para a versão mais recente e é usado para instalar o pg_chameleon. Nos comandos abaixo, o pg_chameleon 2.0.9 foi instalado deliberadamente enquanto a versão mais recente é a 2.0.10. Isso é feito para evitar erros recém-introduzidos na versão atualizada.
$> python3.6 -m venv venv
$> source venv/bin/activate
(venv) $> pip install pip --upgrade
(venv) $> pip install pg_chameleon==2.0.9

O próximo passo é invocar o pg_chameleon (chameleon é o comando) com o argumento set_configuration_files para permitir que o pg_chameleon crie diretórios e arquivos de configuração padrão.
(venv) $> chameleon set_configuration_files
creating directory /root/.pg_chameleon
creating directory /root/.pg_chameleon/configuration/
creating directory /root/.pg_chameleon/logs/
creating directory /root/.pg_chameleon/pid/
copying configuration  example in /root/.pg_chameleon/configuration//config-example.yml

Agora, crie uma cópia de config-example.yml como default.yml para torná-lo o arquivo de configuração padrão. Um arquivo de configuração de amostra usado para esta demonstração é fornecido abaixo.
$> cat default.yml
---
#global settings
pid_dir: '~/.pg_chameleon/pid/'
log_dir: '~/.pg_chameleon/logs/'
log_dest: file
log_level: info
log_days_keep: 10
rollbar_key: ''
rollbar_env: ''

# type_override allows the user to override the default type conversion into a different one.
type_override:
  "tinyint(1)":
    override_to: boolean
    override_tables:
      - "*"

#postgres  destination connection
pg_conn:
  host: "192.168.56.106"
  port: "5433"
  user: "usr_replica"
  password: "pass123"
  database: "db_replica"
  charset: "utf8"

sources:
  mysql:
    db_conn:
      host: "192.168.56.102"
      port: "3306"
      user: "usr_replica"
      password: "pass123"
      charset: 'utf8'
      connect_timeout: 10
    schema_mappings:
      world_x: pgworld_x
    limit_tables:
#      - delphis_mediterranea.foo
    skip_tables:
#      - delphis_mediterranea.bar
    grant_select_to:
      - usr_readonly
    lock_timeout: "120s"
    my_server_id: 100
    replica_batch_size: 10000
    replay_max_rows: 10000
    batch_retention: '1 day'
    copy_max_memory: "300M"
    copy_mode: 'file'
    out_dir: /tmp
    sleep_loop: 1
    on_error_replay: continue
    on_error_read: continue
    auto_maintenance: "disabled"
    gtid_enable: No
    type: mysql
    skip_events:
      insert:
        - delphis_mediterranea.foo #skips inserts on the table delphis_mediterranea.foo
      delete:
        - delphis_mediterranea #skips deletes on schema delphis_mediterranea
      update:

O arquivo de configuração usado nesta demonstração é o arquivo de amostra que vem com o pg_chameleon com pequenas edições para se adequar aos ambientes de origem e destino, e segue um resumo das diferentes seções do arquivo de configuração.

O arquivo de configuração default.yml tem uma seção de "configurações globais" que controla detalhes como localização do arquivo de bloqueio, locais de registro e período de retenção, etc. A seção a seguir é a seção "substituição de tipo", que é um conjunto de regras a serem substituídas tipos durante a replicação. Uma regra de substituição de tipo de amostra é usada por padrão que converte um tinyint(1) em um valor booleano. A próxima seção é a seção de detalhes da conexão do banco de dados de destino que no nosso caso é um banco de dados PostgreSQL, denotado por “pg_conn”. A seção final é a seção de origem que contém todos os detalhes das configurações de conexão do banco de dados de origem, mapeamento de esquema entre origem e destino, quaisquer tabelas a serem ignoradas, incluindo configurações de tempo limite, memória e tamanho do lote. Observe as “fontes” que indicam que pode haver várias fontes para um único destino para formar uma configuração de replicação muitos para um.

Um banco de dados “world_x” é usado nesta demonstração, que é um banco de dados de exemplo com 4 tabelas contendo linhas de exemplo, que a comunidade MySQL oferece para fins de demonstração, e pode ser baixado aqui. O banco de dados de amostra vem como um arquivo compactado e tar junto com instruções para criá-lo e importar linhas nele.

Um usuário dedicado é criado nos bancos de dados MySQL e PostgreSQL com o mesmo nome de usr_replica, que recebe privilégios adicionais no MySQL para ter acesso de leitura a todas as tabelas que estão sendo replicadas.
mysql> CREATE USER usr_replica ;
mysql> SET PASSWORD FOR usr_replica='pass123';
mysql> GRANT ALL ON world_x.* TO 'usr_replica';
mysql> GRANT RELOAD ON *.* to 'usr_replica';
mysql> GRANT REPLICATION CLIENT ON *.* to 'usr_replica';
mysql> GRANT REPLICATION SLAVE ON *.* to 'usr_replica';
mysql> FLUSH PRIVILEGES;

Um banco de dados é criado no lado do PostgreSQL que aceitará as alterações do banco de dados MySQL, que é nomeado como “db_replica”. O usuário “usr_replica” no PostgreSQL é configurado automaticamente como proprietário de dois esquemas como “pgworld_x” e “sch_chameleon” que contêm as tabelas replicadas reais e tabelas de catálogo de replicação, respectivamente. Essa configuração automática é feita pelo argumento create_replica_schema, indicado mais abaixo.
postgres=# CREATE USER usr_replica WITH PASSWORD 'pass123';
CREATE ROLE
postgres=# CREATE DATABASE db_replica WITH OWNER usr_replica;
CREATE DATABASE

O banco de dados MySQL é configurado com algumas alterações de parâmetros para prepará-lo para replicação, conforme mostrado abaixo, e requer uma reinicialização do servidor de banco de dados para que as alterações tenham efeito.
$> vi /etc/my.cnf
binlog_format= ROW
binlog_row_image=FULL
log-bin = mysql-bin
server-id = 1

Neste ponto, é importante testar a conectividade com ambos os servidores de banco de dados para garantir que não haja problemas quando os comandos pg_chameleon forem executados.

No nó PostgreSQL:
$> mysql -u usr_replica -Ap'admin123' -h 192.168.56.102 -D world_x 

No nó MySQL:
$> psql -p 5433 -U usr_replica -h 192.168.56.106 db_replica

Os próximos três comandos do pg_chameleon (chameleon) são onde ele configura o ambiente, adiciona uma fonte e inicializa uma réplica. O argumento “create_replica_schema” do pg_chameleon cria o esquema padrão (sch_chameleon) e o esquema de replicação (pgworld_x) no banco de dados PostgreSQL como já foi discutido. O argumento “add_source” adiciona o banco de dados de origem à configuração lendo o arquivo de configuração (default.yml), que neste caso é “mysql”, enquanto o “init_replica” inicializa a configuração com base nas configurações do arquivo de configuração.
$> chameleon create_replica_schema --debug
$> chameleon add_source --config default --source mysql --debug
$> chameleon init_replica --config default --source mysql --debug

A saída dos três comandos acima é autoexplicativa, indicando o sucesso de cada comando com uma mensagem de saída evidente. Quaisquer falhas ou erros de sintaxe são claramente mencionados em mensagens simples e simples, sugerindo e solicitando ações corretivas.

A etapa final é iniciar a replicação com “start_replica”, cujo sucesso é indicado por uma dica de saída conforme mostrado abaixo.
$> chameleon start_replica --config default --source mysql 
output: Starting the replica process for source mysql

O status da replicação pode ser consultado com o argumento “show_status” enquanto os erros podem ser visualizados com o argumento “show_errors”.
$> chameleon show_status --source mysql  
OUTPUT: 
  Source id  Source name    Type    Status    Consistent    Read lag    Last read    Replay lag    Last replay
-----------  -------------  ------  --------  ------------  ----------  -----------  ------------  -------------
          1  mysql          mysql   running   No            N/A                      N/A

== Schema mappings ==
Origin schema    Destination schema
---------------  --------------------
world_x          pgworld_x

== Replica status ==
---------------------  ---
Tables not replicated  0
Tables replicated      4
All tables             4
Last maintenance       N/A
Next maintenance       N/A
Replayed rows
Replayed DDL
Skipped rows
---------------------  ---
$> chameleon show_errors --config default 
output: There are no errors in the log

Conforme discutido anteriormente, cada uma das funcionalidades de replicação é gerenciada com a ajuda de daemons, que podem ser visualizados consultando a tabela de processos usando o comando “ps” do Linux, exibido abaixo.
$>  ps -ef|grep chameleon
root       763     1  0 19:20 ?        00:00:00 /u01/media/mysql_samp_dbs/world_x-db/venv/bin/python3.6 /u01/media/mysq l_samp_dbs/world_x-db/venv/bin/chameleon start_replica --config default --source mysql
root       764   763  0 19:20 ?        00:00:01 /u01/media/mysql_samp_dbs/world_x-db/venv/bin/python3.6 /u01/media/mysq l_samp_dbs/world_x-db/venv/bin/chameleon start_replica --config default --source mysql
root       765   763  0 19:20 ?        00:00:00 /u01/media/mysql_samp_dbs/world_x-db/venv/bin/python3.6 /u01/media/mysq l_samp_dbs/world_x-db/venv/bin/chameleon start_replica --config default --source mysql

Nenhuma configuração de replicação é concluída até que ela seja submetida ao teste de “aplicação em tempo real”, que foi simulado conforme abaixo. Trata-se de criar uma tabela e inserir alguns registros no banco de dados MySQL, posteriormente, o argumento “sync_tables” do pg_chameleon é invocado para atualizar os daemons para replicar a tabela junto com seus registros para o banco de dados PostgreSQL.
mysql> create table t1 (n1 int primary key, n2 varchar(10));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into t1 values (1,'one');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t1 values (2,'two');
Query OK, 1 row affected (0.00 sec)
$> chameleon sync_tables --tables world_x.t1 --config default --source mysql
Sync tables process for source mysql started.

O teste é confirmado consultando a tabela do banco de dados PostgreSQL para refletir as linhas.
$> psql -p 5433 -U usr_replica -d db_replica -c "select * from pgworld_x.t1";
 n1 |  n2
----+-------
  1 | one
  2 | two

Se for um projeto de migração, os seguintes comandos pg_chameleon marcarão o fim do esforço de migração. Os comandos devem ser executados após a confirmação de que as linhas de todas as tabelas de destino foram replicadas e o resultado será um banco de dados PostgreSQL migrado de forma limpa, sem nenhuma referência ao banco de dados de origem ou esquema de replicação (sch_chameleon).
$> chameleon stop_replica --config default --source mysql 
$> chameleon detach_replica --config default --source mysql --debug

Opcionalmente, os comandos a seguir descartarão a configuração de origem e o esquema de replicação.
$> chameleon drop_source --config default --source mysql --debug
$> chameleon drop_replica_schema --config default --source mysql --debug

Prós do uso do pg_chameleon

  • Configuração simples e menos complicada
  • Solução de problemas e detecção de anomalias sem complicações com saída de erro fácil de entender
  • Tabelas ad hoc adicionais podem ser adicionadas à replicação após a inicialização, sem alterar nenhuma outra configuração
  • Várias fontes podem ser configuradas para um único banco de dados de destino, o que é útil em projetos de consolidação para mesclar dados de um ou mais bancos de dados MySQL em um único banco de dados PostgreSQL
  • As tabelas selecionadas podem ser ignoradas da replicação

Contras do uso do pg_chameleon

  • Suportado apenas a partir do MySQL 5.5 como banco de dados de origem e PostgreSQL 9.5 em diante para banco de dados de destino
  • Requer que cada tabela tenha uma chave primária ou exclusiva, caso contrário, as tabelas serão inicializadas durante o processo init_replica, mas não serão replicadas
  • Replicação unidirecional, ou seja, MySQL para PostgreSQL. Assim, limitando seu uso a apenas uma configuração ativa-passiva
  • O banco de dados de origem só pode ser um banco de dados MySQL, enquanto o suporte ao banco de dados PostgreSQL como fonte é experimental com outras limitações (clique aqui para saber mais)

Resumo do pg_chameleon


A abordagem de replicação oferecida pelo pg_chameleon é favorável à migração do banco de dados MySQL para PostgreSQL. No entanto, uma das limitações significativas da replicação unidirecional pode desencorajar os profissionais de banco de dados a adotá-la para qualquer outra coisa que não seja a migração. Essa desvantagem da replicação unidirecional pode ser resolvida usando outra ferramenta de código aberto chamada SymmetricDS.

Para estudar o utilitário mais detalhadamente, consulte a documentação oficial aqui. A referência da linha de comando pode ser obtida aqui.
Baixe o whitepaper hoje PostgreSQL Management &Automation with ClusterControlSaiba o que você precisa saber para implantar, monitorar, gerenciar e dimensionar o PostgreSQLBaixe o whitepaper

Uma visão geral do SymmetricDS


SymmetricDS é uma ferramenta de código aberto capaz de replicar qualquer banco de dados para qualquer outro banco de dados, da lista popular de servidores de banco de dados como Oracle, MongoDB, PostgreSQL, MySQL, SQL Server, MariaDB, DB2, Sybase, Greenplum, Informix, H2, Firebird e outras instâncias de banco de dados baseadas em nuvem, como Redshift e Azure, etc. Algumas das ofertas incluem sincronização de banco de dados e arquivos, replicação multimestre, sincronização filtrada e transformação. A ferramenta é desenvolvida em Java, exigindo uma edição padrão (versão 8.0 ou superior) do JRE ou JDK. A funcionalidade envolve alterações de dados sendo capturadas por gatilhos no banco de dados de origem e roteando-as para um banco de dados de destino participante como lotes de saída

Recursos do SymmetricDS

  • Independente de plataforma, o que significa que dois ou mais bancos de dados diferentes podem se comunicar entre si, de qualquer banco de dados para qualquer outro banco de dados
  • Bancos de dados relacionais obtêm sincronização usando captura de dados alterados, enquanto sistemas baseados em sistema de arquivos utilizam sincronização de arquivos
  • Replicação bidirecional usando o método Push and Pull, que é realizado com base em regras definidas
  • A transferência de dados também pode ocorrer em redes seguras e de baixa largura de banda
  • Recuperação automática durante a retomada de um nó com falha e resolução automática de conflitos
  • Pronto para a nuvem e contém APIs de extensão poderosas

Demonstração


SymmetricDS pode ser configurado em uma das duas opções:
  • Um nó mestre (pai) que atua como um intermediário centralizado coordenando a replicação de dados entre dois nós escravos (filhos), em que a comunicação entre os dois nós filhos só pode ocorrer por meio do pai.
  • Um nó ativo (node1) pode replicar de e para outro nó ativo (node2) sem qualquer intermediário.

Em ambas as opções, a comunicação entre os nós acontece via eventos “Push” e “Pull”. Nesta demonstração, será explicada uma configuração ativo-ativo entre dois nós. A arquitetura completa pode ser exaustiva, então os leitores são encorajados a verificar o guia do usuário disponível aqui para saber mais sobre os componentes internos do SymmetricDS.

Instalar o SymmetricDS é tão simples quanto baixar a versão de código aberto do arquivo zip daqui e extraí-lo em um local conveniente. Os detalhes do local de instalação e versão do SymmetricDS nesta demonstração estão conforme a tabela abaixo, juntamente com outros detalhes relativos às versões do banco de dados, versões do Linux, endereços IP e porta de comunicação para ambos os nós participantes.
Anfitrião vm1 vm2
Versão do SO CentOS Linux versão 7.6 x86_64 CentOS Linux versão 7.6 x86_64
Versão do servidor de banco de dados MySQL 5.7.26 PostgreSQL 10.5
Porta do banco de dados 3306 5832
endereço IP 192.168.1.107 192.168.1.112
Versão do SymmetricDS SymetricDS 3.9 SymetricDS 3.9
Local de instalação do SymmetricDS /usr/local/symmetric-server-3.9.20 /usr/local/symmetric-server-3.9.20
Nome do nó SymmetricDS corp-000 loja-001

A página inicial de instalação neste caso é “/usr/local/symmetric-server-3.9.20” que será o diretório inicial do SymmetricDS, que contém vários outros subdiretórios e arquivos. Dois dos subdiretórios que são importantes agora são “amostras” e “motores”. O diretório samples contém amostras do arquivo de configuração de propriedades do nó, além de scripts SQL de amostra para iniciar uma demonstração rápida.

Os três arquivos de configuração de propriedades do nó a seguir podem ser vistos no diretório “samples” com nomes que indicam a natureza do nó em uma determinada configuração.
corp-000.properties
store-001.properties
store-002.properties

Como o SymmetricDS vem com todos os arquivos de configuração necessários para suportar uma configuração básica de 3 nós (opção 1), é conveniente usar os mesmos arquivos de configuração para configurar também uma configuração de 2 nós (opção 2). O arquivo de configuração pretendido é copiado do diretório “samples” para os “engines” no host vm1 e se parece com o abaixo.
$> cat engines/corp-000.properties
engine.name=corp-000
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://192.168.1.107:3306/replica_db?autoReconnect=true&useSSL=false
db.user=root
db.password=admin123
registration.url=
sync.url=http://192.168.1.107:31415/sync/corp-000
group.id=corp
external.id=000

O nome desse nó na configuração do SymmetricDS é “corp-000” com a conexão do banco de dados tratada com o driver mysql jdbc usando a string de conexão conforme indicado acima junto com as credenciais de login. O banco de dados para conectar é “replica_db” e as tabelas serão criadas durante a criação do esquema de amostra. O “sync.url” denota o local para contatar o nó para sincronização.

O nó 2 no host vm2 é configurado como “store-001” com o restante dos detalhes configurados no arquivo node.properties, mostrado abaixo. O nó “store-001” executa um banco de dados PostgreSQL, com “pgdb_replica” como banco de dados para replicação. O “registration.url” permite que o host “vm2” se comunique com o host “vm1” para obter detalhes de configuração.
$> cat engines/store-001.properties
engine.name=store-001
db.driver=org.postgresql.Driver
db.url=jdbc:postgresql://192.168.1.112:5832/pgdb_replica
db.user=postgres
db.password=admin123
registration.url=http://192.168.1.107:31415/sync/corp-000
group.id=store
external.id=001

A demonstração padrão pré-configurada do SymmetricDS contém configurações para configurar uma replicação bidirecional entre dois servidores de banco de dados (dois nós). As etapas abaixo são executadas no host vm1 (corp-000), que criará um esquema de amostra com 4 tabelas. Além disso, a execução de “create-sym-tables” com o comando “symadmin” criará as tabelas de catálogo que armazenam e controlam as regras e a direção de replicação entre os nós. Finalmente, as tabelas de demonstração são carregadas com dados de amostra.
vm1$> cd /usr/local/symmetric-server-3.9.20/bin
vm1$> ./dbimport --engine corp-000 --format XML create_sample.xml
vm1$> ./symadmin --engine corp-000 create-sym-tables
vm1$> ./dbimport --engine corp-000 insert_sample.sql

As tabelas de demonstração “item” e “item_selling_price” são configuradas automaticamente para replicar de corp-000 para store-001, enquanto as tabelas de venda (sale_transaction e sale_return_line_item) são replicadas automaticamente de store-001 para corp-000. O próximo passo é criar o esquema de amostra no banco de dados PostgreSQL no host vm2 (store-001), a fim de prepará-lo para receber dados do corp-000.
vm2$> cd /usr/local/symmetric-server-3.9.20/bin
vm2$> ./dbimport --engine store-001 --format XML create_sample.xml

É importante verificar a existência de tabelas de demonstração e tabelas de catálogo SymmetricDS no banco de dados MySQL na vm1 neste estágio. Observe que as tabelas do sistema SymmetricDS (tabelas com prefixo “sym_”) estão disponíveis apenas no nó corp-000 neste momento, pois é onde foi executado o comando “create-sym-tables”, que será o local para controlar e gerenciar a replicação. Além disso, o banco de dados do nó store-001 terá apenas 4 tabelas de demonstração sem dados nele.

O ambiente agora está pronto para iniciar os processos do servidor “sym” em ambos os nós, conforme mostrado abaixo.
vm1$> cd /usr/local/symmetric-server-3.9.20/bin
vm1$> sym 2>&1 &

As entradas de log são enviadas para um arquivo de log em segundo plano (symmetric.log) em um diretório de logs no local de instalação do SymmetricDS, bem como para a saída padrão. O servidor “sym” agora pode ser iniciado no nó store-001.
vm2$> cd /usr/local/symmetric-server-3.9.20/bin
vm2$> sym 2>&1 &

A inicialização do processo do servidor “sym” no host vm2 também criará as tabelas do catálogo SymmetricDS no banco de dados PostgreSQL. A inicialização do processo do servidor “sym” em ambos os nós fará com que eles se coordenem para replicar dados de corp-000 para store-001. Após alguns segundos, consultar todas as quatro tabelas em ambos os lados mostrará os resultados da replicação bem-sucedida. Alternativamente, um carregamento inicial também pode ser enviado para o nó store-001 do corp-000 com o comando abaixo.
vm1$> ./symadmin --engine corp-000 reload-node 001

Neste ponto, um novo registro é inserido na tabela “item” no banco de dados MySQL no nó corp-000 (host:vm1) e pode ser verificado que foi replicado com sucesso para o banco de dados PostgreSQL no nó store-001 (host:vm2 ). Isso mostra o evento “Pull” de dados de corp-000 para store-001.
mysql> insert into item values ('22000002','Jelly Bean');
Query OK, 1 row affected (0.00 sec)
vm2$> psql -p 5832 -U postgres pgdb_replica -c "select * from item" 
 item_id  |   name
----------+-----------
 11000001 | Yummy Gum
 22000002 | Jelly Bean
(2 rows)

O evento “Push” de dados de store-001 para corp-000 pode ser obtido inserindo um registro na tabela “sale_transaction” e confirmando-o para replicação.
pgdb_replica=# insert into "sale_transaction" ("tran_id", "store_id", "workstation", "day", "seq") values (1000, '001', '3', '2007-11-01', 100);
vm1$> [[email protected] ~]#  mysql -uroot -p'admin123' -D replica_db -e "select * from sale_transaction";
+---------+----------+-------------+------------+-----+
| tran_id | store_id | workstation | day        | seq |
+---------+----------+-------------+------------+-----+
|     900 | 001      | 3           | 2012-12-01 |  90 |
|    1000 | 001      | 3           | 2007-11-01 | 100 |
|    2000 | 002      | 2           | 2007-11-01 | 200 |
+---------+----------+-------------+------------+-----+

Isso marca a configuração bem-sucedida da replicação bidirecional de tabelas de demonstração entre um banco de dados MySQL e PostgreSQL. Considerando que, a configuração de replicação para tabelas de usuário recém-criadas pode ser obtida usando as etapas a seguir. Uma tabela de exemplo “t1” é criada para a demonstração e as regras de sua replicação são configuradas conforme o procedimento abaixo. As etapas configuram apenas a replicação de corp-000 para store-001.
mysql> create table  t1 (no integer);
Query OK, 0 rows affected (0.01 sec)


mysql> insert into sym_channel (channel_id,create_time,last_update_time) 
values ('t1',current_timestamp,current_timestamp);
Query OK, 1 row affected (0.01 sec)
mysql> insert into sym_trigger (trigger_id, source_table_name,channel_id,
last_update_time, create_time) values ('t1', 't1', 't1', current_timestamp,
current_timestamp);
Query OK, 1 row affected (0.01 sec)


mysql> insert into sym_trigger_router (trigger_id, router_id,
Initial_load_order, create_time,last_update_time) values ('t1',
'corp-2-store-1', 1, current_timestamp,current_timestamp);
Query OK, 1 row affected (0.01 sec)

Depois disso, a configuração é notificada sobre a mudança de esquema de adição de uma nova tabela invocando o comando symadmin com o argumento “sync-triggers” que irá recriar os gatilhos para corresponder às definições da tabela. Posteriormente, execute “send-schema” para enviar as alterações de esquema para o nó store-001, após o qual a replicação da tabela “t1” será configurada com sucesso.
vm1$> ./symadmin -e corp-000 --node=001 sync-triggers    
vm1$> ./symadmin send-schema -e corp-000 --node=001 t1

Prós do uso do SymmetricDS

  • Instalação e configuração sem esforço, incluindo um conjunto pré-configurado de arquivos de parâmetro para criar uma configuração de 3 ou 2 nós
  • Banco de dados multiplataforma habilitado e independente de plataforma, incluindo servidores, laptops e dispositivos móveis
  • Replicar qualquer banco de dados para qualquer outro banco de dados, seja local, WAN ou nuvem
  • Capaz de manipular de forma otimizada alguns bancos de dados para vários milhares de bancos de dados para replicar dados perfeitamente
  • Uma versão comercial do software oferece console de gerenciamento orientado por GUI com um excelente pacote de suporte

Desvantagens do uso do SymmetricDS

  • A configuração manual da linha de comando pode envolver a definição de regras e direção de replicação por meio de instruções SQL para carregar tabelas de catálogo, o que pode ser inconveniente para gerenciar
  • Configurar um grande número de tabelas para replicação será um esforço exaustivo, a menos que alguma forma de script seja utilizada para gerar as instruções SQL que definem as regras e a direção da replicação
  • Muitas informações de log sobrecarregando o arquivo de log, exigindo manutenção periódica do arquivo de log para não permitir que o arquivo de log ocupe o disco

Resumo do SymmetricDS

Recursos relacionados ClusterControl for MySQL Replication ClusterControl for PostgreSQL Comparação de armazenamentos de dados para PostgreSQL - MVCC vs InnoDB
O SymmetricDS oferece a capacidade de configurar a replicação bidirecional entre 2 nós, 3 nós e assim por diante para vários milhares de nós para replicar dados e obter sincronização de arquivos. É uma ferramenta única que executa muitas das tarefas de manutenção de autocorreção, como a recuperação automática de dados após longos períodos de inatividade em um nó, comunicação segura e eficiente entre nós com a ajuda de HTTPS e gerenciamento automático de conflitos com base em regras definidas , etc. O recurso essencial de replicar qualquer banco de dados para qualquer outro banco de dados torna o SymmetricDS pronto para ser implantado em vários casos de uso, incluindo migração, atualização de versão e patch, distribuição, filtragem e transformação de dados em diversas plataformas.

A demonstração foi criada consultando o tutorial oficial de início rápido do SymmetricDS, que pode ser acessado aqui. The user guide can be found here, which provides a detailed account of various concepts involved in a SymmetricDS replication setup.