Ir para o conteúdo

Como replicar

Um banco de dados do CouchDB pode ser replicado de duas formas:

  • Nativa, em que outra instância de CouchDB copia para si os dados de um banco da instância original. Esse é o método preferível;
  • Por replicadores, em que um outro software monitora e copia um banco do CouchDB original para uma outra base, em PostgreSQL ou MySQL por exemplo.

Esta seção explica como realizar uma replicação nativa. Para projetos que replicam para outras bases, consulte a pergunta "Gostaria de ter as bases em um banco relacional, é possivel?" no FAQ.

As instruções desta seção foram destiladas a partir da documentação original do CouchDB sobre réplicas nativas, disponível aqui.

Configuração do banco de réplica

Para que a replicação funcione, o CouchDB de destino precisa estar configurado exatamente igual ao CouchDB de origem, que no caso é o do peer. Para isso, utilize no CouchDB de destino o mesmo arquivo de configuração do CouchDB do peer, que está localizado em /etc/hyperledger/fabric/peer/couchdb/couchdb-config.ini.

Esse arquivo de configuração deve ser copiado para o servidor do CouchDB de destino e substituir o arquivo couchdb-config.ini da sua instância. O local desse arquivo pode variar de acordo com a sua instalação, portanto, para saber qual é o caminho correto, consulte a documentação da sua instalação do CouchDB ou siga a documentação oficial.

Atenção: o arquivo couchdb-config.ini copiado para o servidor de destino deve possuir também o seguinte conteúdo:

[couchdb]
uuid = replica01 
Caso exista mais de um servidor de réplica, utilizar outro uuid: replica02, replica03, etc.

Criação do job de replicação

O job de replicação deve ser criado no CouchDB de destino, sendo que o CouchDB de origem precisa oferecer apenas um acesso de leitura. A credencial para acesso ao CouchDB do peer (origem) consta no arquivo /etc/hyperledger/fabric/peer/credencial_couchdb e já possui os privilégios necessários para o funcionamento da replicação.

Para criar o job de replicação no CouchDB de destino, utilize o comando a seguir, populando antes as variáveis com os valores correspondentes ao seu cenário:

ENDERECO_PEER="<endereço de DNS do peer, sem https:// e sem porta, ex: peer-bcadastros.orgao.gov.br>"
CREDENCIAL_COUCHDB_PEER="<conteúdo do arquivo /etc/hyperledger/fabric/peer/credencial_couchdb do peer>"
BANCO_ORIGEM="<nome do banco b-Cadastros de origem, ex: chcpf_bcadastros>"
ENDERECO_DESTINO="<endereço de DNS do servidor com o CouchDB de destino, ex: replica-bcadastros.orgao.gov.br>"
USUARIO_COUCHDB_DESTINO="<geralmente o usuario admin>"
SENHA_COUCHDB_DESTINO="<senha do usuario acima>"
BANCO_DESTINO="<nome do banco na réplica, ex: cpf_replica, esse banco será automaticamente criado pelo job>"

curl -k -X POST "http://$ENDERECO_DESTINO:5984/_replicator" \
        -u $USUARIO_COUCHDB_DESTINO:$SENHA_COUCHDB_DESTINO  \
        -H "Accept: application/json" \
        -H "Content-Type: application/json" \
        -d "{\"source\": \"https://$CREDENCIAL_COUCHDB_PEER@$ENDERECO_PEER:6984/$BANCO_ORIGEM\", \"target\": \"http://$USUARIO_COUCHDB_DESTINO:$SENHA_COUCHDB_DESTINO@$ENDERECO_DESTINO:5984/$BANCO_DESTINO\", \"create_target\": true, \"continuous\": true}"

O job criado faz a replicação contínua do banco de origem, ou seja, quando novos documentos ou atualizações ocorrerem na base de origem, elas serão automaticamente replicadas para a base de destino.

Acompanhamento do job de replicação

Você pode consultar o status do processo de replicação, comandando:

curl -k -s -u $USUARIO_COUCHDB_DESTINO:$SENHA_COUCHDB_DESTINO \
    "http://$ENDERECO_DESTINO:5984/_scheduler/jobs" | jq

Ou você pode consultar a quantidade de documentos nas duas bases. A replicação inicial estará concluída quando o banco de destino tiver a mesma quantidade de documentos do banco de origem.

Para saber a quantidade de documentos na origem:

curl -k -s -u $CREDENCIAL_COUCHDB_PEER \
    "https://$ENDERECO_PEER:6984/$BANCO_ORIGEM" | jq .doc_count

Para saber a quantidade de documentos no destino:

curl -k -s -u $USUARIO_COUCHDB_DESTINO:$SENHA_COUCHDB_DESTINO \
    "http://$ENDERECO_DESTINO:5984/$BANCO_DESTINO" | jq .doc_count

Como o job de replicação é contínuo, mesmo que o banco de destino seja reiniciado ou fique fora do ar por um período, a replicação continuará funcionando tão logo o banco de destino esteja online e conectado ao banco de origem novamente.