Pesquisa de site

Como configurar a replicação Multi-Master PostgreSQL no Ubuntu 22.04


PostgreSQL é um sistema de gerenciamento de banco de dados de código aberto com foco na extensibilidade e conformidade com SQL. PostgreSQL é um RDBMS (Sistema de gerenciamento de banco de dados relacional) avançado e de classe empresarial que oferece suporte a consultas SQL (relacionais) e JSON (não relacionais).

É um sistema de gerenciamento de banco de dados altamente estável e de nível empresarial que oferece diferentes soluções, permitindo configurar alta disponibilidade e failover. PostgreSQL é usado como banco de dados primário para aplicativos web, móveis e analíticos. Ele tem uma forte reputação por sua confiabilidade, flexibilidade, robustez de recursos e desempenho.

Este tutorial irá instalar o servidor de banco de dados PostgreSQL em servidores Ubuntu 22.04 e configurar a replicação Multi-Master com múltiplos servidores via Bucardo - um sistema de replicação assíncrona PostgreSQL -. Você instalará o PostgreSQL por meio do repositório oficial do PostgreSQL, compilará e instalará o bucardo e, em seguida, configurará a replicação multimestre entre os servidores PostgreSQL.

Bucardo é uma aplicação Perl que habilita o sistema de replicação assíncrona PostgreSQL e permite configurar operações multi-master e multi-source. Bucardo é gratuito e de código aberto, licenciado sob licença BSD.

Pré-requisitos

Você precisará de dois ou mais servidores Ubuntu 22.04 para concluir este tutorial. Você também precisará de um usuário não root com privilégios de administrador sudo/root em seus sistemas.

Este exemplo usará dois servidores Ubuntu 22.04 com os seguintes detalhes:

Hostname      IP Address
---------------------------
postgres01    192.168.5.121
postgres02    192.168.5.122

Quando todos os requisitos estiverem prontos, você poderá começar a instalar o servidor PostgreSQL.

Configure /etc/hosts e UFW

Nesta primeira seção, você configurará o '/etc/hosts' e o firewall UFW para abrir a porta padrão 5432 do PostgreSQL e permitir que uma sub-rede de rede específica acesse-a. Você deve configurar o arquivo /etc/hosts e o UFW em ambos os servidores.

Abra o arquivo /etc/hosts usando o seguinte comando do editor nano.

sudo nano /etc/hosts

Adicione as seguintes linhas ao arquivo e certifique-se de alterar os detalhes do endereço IP e do nome do host com seu ambiente de trabalho atual.

192.168.5.121    postgres01
192.168.5.122    postgres02

Salve e feche o arquivo quando terminar.

Em seguida, digite o seguinte comando 'ufw' para abrir a porta OpenSSH e a porta do servidor PostgreSQL 5432. Com isso, você abrirá a porta OpenSSH padrão 22, depois também abrirá a porta do servidor PostgreSQL 5432 e especificará o acesso apenas de redes confiáveis '192.168.5.0/24' .

sudo ufw allow OpenSSH
sudo ufw allow from 192.168.5.0/24 to any port 5432

Agora digite o seguinte comando para iniciar e habilitar o UFW. Quando solicitado, insira y para confirmar e pressione ENTER para continuar.

sudo ufw enable

Uma saída 'Firewall está ativo e habilitado na inicialização do sistema' confirma que o UFW está em execução e será iniciado automaticamente na inicialização do sistema.

Por último, verifique o status do firewall UFW usando o comando abaixo.

sudo ufw status

Você deverá receber uma saída como esta – O serviço OpenSSH foi adicionado e está disponível na lista de regras do UFW. Além disso, a porta 5432 do servidor PostgreSQL só pode ser acessada em '192.168.5.0/24'.

Instalando o servidor PostgreSQL

Primeiro, digite o comando ‘apt install’ para instalar algumas dependências básicas. Insira y quando solicitado e pressione ENTER para continuar.

sudo apt install wget gnupg2 lsb-release curl apt-transport-https ca-certificates

Em seguida, insira o comando 'curl' abaixo para baixar a chave GPG do repositório PostgreSQL, converta o arquivo .asc em .gpg por meio do comando 'gpg --dearmor' e adicione o repositório PostgreSQL.

curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /usr/share/keyrings/pgdg.gpg > /dev/null 2>&1
sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/pgdg.gpg] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'

Agora atualize e atualize seu pacote Ubuntu para aplicar o novo repositório PostgreSQL que você adicionou.

sudo apt update

Agora você pode instalar o servidor PostgreSQL através do comando ‘apt install’ abaixo. Com isso, você instalará a versão mais recente do servidor PostgreSQL, que é o PostgreSQL 15.

sudo apt install postgresql

Quando solicitado, insira y para confirmar e pressione ENTER para continuar.

Depois que o servidor PostgreSQL estiver instalado, insira o seguinte utilitário de comando systemctl para verificar o serviço PostgreSQL e garantir que ele esteja em execução e ativado.

sudo systemctl is-enabled postgresql
sudo systemctl status postgresql

Uma saída 'ativo (em execução)' confirma que o servidor PostgreSQL está em execução. E a saída 'enabled' confirma que o PostgreSQL será executado automaticamente na inicialização do sistema.

Por último, você também precisará instalar a extensão PostgreSQL 'plperl', que será necessária para o software Bucardo. Digite o seguinte comando ‘apt install’ para instalar a extensão ‘plperl’.

sudo apt install postgresql-plperl-15

A instalação deve começar automaticamente.

Com isso, você já instalou o PostgreSQL 15 em ambos os servidores Ubuntu 22.04, e também instalou a extensão PostgreSQL ‘plperl’ que será utilizada pelo Bucardo. No próximo passo, você irá configurar o usuário e banco de dados PostgreSQL que será utilizado pelo Bucardo, e também configurar o teste de banco de dados que será utilizado para testes de replicação.

Configurar banco de dados e usuário

Nesta seção você criará um novo banco de dados e usuário que será utilizado para a instalação do Bucardo. Você também criará um novo banco de dados com o esquema para testar a replicação do PostgreSQL. Certifique-se de executar o seguinte comando e consultas em servidores bot PostgreSQL.

Antes de começar, mova o diretório de trabalho para '/var/lib/postgresql'.

cd /var/lib/postgresql

Agora faça login no shell do PostgreSQL por meio do seguinte comando.

sudo -u postgres psql

Uma vez logado no shell do PostgreSQL, insira as seguintes consultas para criar um novo usuário e banco de dados chamado 'bucardo'. Este banco de dados será utilizado para armazenar dados do Bucardo, e o usuário 'bucardo' deverá ter o privilégio SUPERUSER.

CREATE USER bucardo WITH SUPERUSER;
CREATE DATABASE bucardo OWNER bucardo;

Agora insira as seguintes consultas para verificar a lista de bancos de dados e usuários no PostgreSQL. Se for bem-sucedido, você deverá ver o banco de dados e o usuário 'bucardo' escutando na saída.

\l
\du

Lista de bancos de dados no servidor PostgreSQL.

Lista de usuários no servidor PostgreSQL.

Após criar o banco de dados e o usuário para Bucardo, você criará em seguida um novo banco de dados para testar a replicação em seu servidor PostgreSQL.

Insira a seguinte consulta para criar um novo banco de dados 'testdb'. Em seguida, conecte-se ao banco de dados 'testdb' por meio da consulta '\c'.

CREATE DATABASE testdb;
\c testdb;

Agora insira a seguinte consulta para criar uma nova tabela 'usuários'.

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  first_name VARCHAR(255),
  last_name VARCHAR(255) NOT NULL,
  city VARCHAR(255)
);

Depois que a tabela for criada, insira as seguintes consultas para verificar o esquema da tabela 'usuários' e, em seguida, verifique a lista de dados disponíveis na tabela.

\dt
select * from users;

Configurar o servidor PostgreSQL

Nesta seção, você configurará ambos os servidores PostgreSQL para serem executados em um endereço IP interno. Além disso, você configurará a autenticação do PostgreSQL para permitir conexões entre servidores confiáveis para o PostgreSQL.

Abra a configuração padrão do PostgreSQL '/etc/postgresql/15/main/postgresql.conf' usando o seguinte comando do editor nano.

sudo nano /etc/postgresql/15/main/postgresql.conf

Remova o comentário do parâmetro 'listen_addresses' e adicione o endereço IP interno do seu servidor PostgreSQL. Com isso, você configurará o PostgreSQL para rodar em um endereço IP interno em cada servidor.

Abaixo está a configuração do servidor postgres01.

listen_addresses = 'localhost, 192.168.5.121'

E abaixo está a configuração do servidor postgres02.

listen_addresses = 'localhost, 192.168.5.122'

Salve e feche o arquivo quando terminar.

Em seguida, abra o arquivo de configuração de autenticação PostgreSQL padrão '/etc/postgresql/15/main/pg_hba.conf' usando o seguinte comando do editor nano.

sudo nano /etc/postgresql/15/main/pg_hba.conf

No servidor postgres01, adicione as seguintes configurações e certifique-se de alterar o endereço IP com o endereço IP do servidor postgres02. Com isso, quaisquer conexões locais e conexões do usuário bucardo serão confiáveis. Além disso, as conexões dos usuários postgres e bucardo provenientes do postgres02 são confiáveis.

# local connection and bucardo user
local    all             all                                    trust
local    all             bucardo                                trust
# Bucardo user remote connections
host    all             postgres         192.168.5.122/24       trust
host    all             bucardo          192.168.5.122/24       trust

Abaixo está a configuração do servidor postgres02. Certifique-se de alterar o endereço IP pelo endereço IP do servidor postgres01.

# local connection and bucardo user
local    all             all                                    trust
local    all             bucardo                                trust
# Bucardo user remote connections
host    all             postgres         192.168.5.121/24       trust
host    all             bucardo          192.168.5.121/24       trust

Salve e feche o arquivo quando terminar.

Agora insira o seguinte utilitário de comando systemctl para reiniciar o serviço PostgreSQL e aplicar as alterações.

sudo systemctl restart postgresql

Com isso, o servidor PostgreSQL deverá estar rodando no localhost e no endereço IP interno através do parâmetro 'listen_addresses'. Digite o seguinte comando para verificar a lista de portas abertas em cada servidor. Você verá que o PostgreSQL está sendo executado em um endereço IP interno dos servidores postgres01 e postgres02.

ss -tulpn | grep postgres

Por último, para verificar a autenticação, você pode inserir o seguinte comando para conectar-se ao shell do PostgreSQL.

No servidor postgres01, digite o seguinte comando. Quando for bem-sucedido, você deverá estar conectado ao shell PostgreSQL do servidor postgres02 sem qualquer autenticação, porque você está no host e no usuário confiáveis.

sudo -u postgres psql
sudo -u postgres psql -U bucardo -h 192.168.5.122

Para o servidor postgres02, você pode inserir o seguinte comando para conectar-se ao shell PostgreSQL em execução no servidor postgres01. Você terá um resultado semelhante: estará conectado ao servidor postgres01 sem autenticação de senha porque tanto o usuário quanto o conectado são confiáveis.

sudo -u postgres psql
sudo -u postgres psql -U bucardo -h 192.168.5.121

Com isso, você finalizou a instalação do servidor PostgreSQL 15, configurou o banco de dados e o usuário para Bucardo, e também configurou listen_addresses e autenticação do PostgreSQL.

Na próxima etapa, você irá compilar e instalar o Bucardo como um aplicativo que permite criar replicação Multi-Master PostgreSQL.

Instalando Bucardo

Bucardo é um aplicativo gratuito e de código aberto para a criação de sistemas de replicação PostgreSQL multi-source e multi-master. Nesta seção, você instalará o Bucardo manualmente a partir da fonte, além de não precisar instalar o Bucardo em todos os nós.

Você instalará o Bucardo apenas no servidor 'postgres01'. Portanto, certifique-se de executar todos os comandos a seguir no servidor postgres01.

Primeiro, digite o seguinte comando apt para instalar dependências de pacote para Bucardo. Insira y quando solicitado e pressione ENTER para continuar.

sudo apt install make libdbix-safe-perl libboolean-perl libdbd-mock-perl libdbd-pg-perl libanyevent-dbd-pg-perl libpg-hstore-perl libpgobject-perl libpod-parser-perl libencode-locale-perl

Agora baixe o código-fonte do Bucardo através do comando wget abaixo.

wget -q https://bucardo.org/downloads/Bucardo-5.6.0.tar.gz

Depois de baixado, extraia o código-fonte do Bucardo e mova-o para o diretório de trabalho do Bucardo.

tar xf Bucardo-5.6.0.tar.gz
cd Bucardo-*/

Agora digite o seguinte comando para compilar e instalar o Bucardo no servidor postgres01.

perl Makefile.PL
sudo make install

Verifique o caminho binário da aplicação 'bucardo' e verifique a versão do Bucardo através do seguinte comando.

which bucardo
bucardo --version

O arquivo binário 'bucardo' está localizado em '/usr/local/bin/bucardo', e a versão atualmente instalada é v5.6.0 .

Com o Bucaro instalado, você configurará a replicação PostgreSQL Multi-Master usando dois servidores PostgreSQL postgres01 e postgres02.

Configure a replicação multi-mestre com Bucardo

Os seguintes comandos devem ser executados no servidor postgres01.

Antes de começar, digite o seguinte comando para criar um novo diretório de dados e log para Bucardo.

sudo mkdir -p /var/run/bucardo /var/log/bucardo
touch /var/log/bucardo/log.bucardo

Execute o seguinte comando 'bucardo' para iniciar a instalação. Revise as configurações de conexão com o PostgreSQL e insira P para continuar.

bucardo install

Quando a instalação do Bucardo for bem-sucedida, você deverá receber uma mensagem de saída como 'A instalação foi concluída'.

Digite o seguinte comando para definir o servidor de banco de dados e o nome do banco de dados que será replicado. Essas informações serão armazenadas como 'server1' para o servidor PostgreSQL ppstgres01 e 'server2' para o servidor PostgreSQL postgres02.

bucardo add database server1 dbname=testdb
bucardo add database server2 dbname=testdb host=192.168.5.122

Adicione o esquema da tabela que você deseja replicar. neste exemplo, a tabela chamada 'usuários' será replicada e sincronizada entre servidores PostgreSQL.

bucardo add table public.users db=server1
bucardo add table public.users db=server2

Você também pode adicionar todas as tabelas do banco de dados através do comando 'bucardo adicionar todas as tabelas'. Com isso, você também criará um relgroup caso ele ainda não exista.

bucardo add all tables --her=testdbSrv1 db=server1
bucardo add all tables --her=testdbSrv2 db=server2

Digite o seguinte comando para verificar a lista de relgroup disponíveis.

bucardo list relgroup

Em seguida, verifique a lista de relgroup, você deverá ver a saída de detalhes como a seguir. Em cada relgroup, você verá o nome do relgroup seguido pelo servidor PostgreSQL e pela tabela disponível que é adicionada ao relgroup.

Com o relgroup e a tabela adicionados, você iniciará agora o processo de sincronização para ambos os servidores PostgreSQL. Insira o seguinte comando para criar uma nova sincronização 'testdbSrv1' que sincronizará 'server1' e 'server2'. E a sincronização é chamada de 'testdbSrv2', que sincronizará entre 'server2' e 'server1'.

bucardo add sync testdbSrv1 relgroup=testdbSrv1 db=server1,server2
bucardo add sync testdbSrv2 relgroup=testdbSrv2 db=server2,server1

Agora verifique a lista de sincronização no Bucardo digitando o seguinte comando.

bucardo list sync

Você verá a sincronização 'testdbSrv1' com o status 'Ativo' e a sincronização é de 'servidor1' como origem e 'server2' como nó de destino. Quanto à sincronização 'testdbSrv2', o status também é 'Ativo', mas a sincronização é do 'servidor2' como origem para o destino 'servidor1'.

Em seguida, insira o seguinte comando para reiniciar o processo de sincronização. E você deverá ver uma saída 'Iniciando Bucardo' quando for bem-sucedido.

bucardo restart sync

Por último, verifique o status da sincronização usando o seguinte comando 'bucardo'.

bucardo status

Você deve receber uma saída semelhante a esta - Ambos sincronizam 'testdbSrv1' e 'testdbSrv2' no estado 'Bom' que confirma que a sincronização está funcionando e sua configuração foi bem-sucedida.

Neste ponto, você configurou a replicação Multi-Master no PostgreSQL via Bucardo. Em seguida, você verificará a replicação Multi-Master adicionando novos dados de ambos os servidores e verificará a replicação entre servidores PostgreSQL.

Verifique a replicação multimestre PostgreSQL Server

Com o PostgreSQL Multi-Master configurado, isso significa que ambos os PostgreSQL estarão sincronizados entre si e os servidores bot aceitam operações READ e WRITE. Neste exemplo, você verificará a implantação multimestre do PostgreSQL inserindo novos dados no banco de dados 'teste'.

Primeiro, no servidor postgres01, faça login no shell do PostgreSQL e conecte-se ao banco de dados 'testdb.

sudo -u postgres psql
\c testdb

Insira as seguintes consultas para inserir novos dados na tabela 'usuários'.

INSERT INTO users(id, first_name, last_name, city)
VALUES 
(1, 'Alice', 'Wonderland', 'Sweden'),
(2, 'Bob', 'Rista', 'Romania'),
(3, 'John', 'Bonas', 'England');

Verifique e recupere seus dados por meio da consulta selecionada abaixo. Você verá que seus dados estão disponíveis.

select count(*) from users;
select * from users;

Digite 'quit' para sair do shell do PostgreSQL.

Em seguida, verifique o status de sincronização do Bucardo usando o comando 'bucardo' abaixo.

bucardo status

Na seção 'Último I/D', você verá a última sincronização de dados entre os servidores PostgreSQL.

Agora vá para o servidor postgres02, acesse o shell do PostgreSQL e conecte-se ao banco de dados 'testdb'.

sudo -u postgres psql
\c testdb

Recupere os dados que estão disponíveis na tabela 'usuários' usando a consulta a seguir. Você deverá ver que seus dados estão disponíveis e replicados no servidor postgres01.

select count(*) from users;
select * from users;

Em seguida, insira as seguintes consultas para adicionar outros dados e digite 'quit' para sair do shell do PostgreSQL.

INSERT INTO users(id, first_name, last_name, city)
VALUES 
(4, 'Ian', 'Gibson', 'Liverpool'),
(5, 'Tom', 'Riddle', 'Paris'),
(6, 'Jared', 'Dunn', 'New York');
quit

Agora volte para o servidor postgres01 e execute o seguinte comando bucardo para verificar o status da sincronização.

bucardo status

Você deverá ver que em 'testdbSrv2' a última sincronização é 3. Você pode ver isso na seção 'Último I/D'.

Agora faça login novamente no shell do PostgreSQL e conecte-se ao banco de dados ‘testdb’.

sudo -u postgres psql
\c testdb

Em seguida, verifique a lista de dados disponíveis na tabela 'usuários'. Você deverá ver dados adicionais adicionados do servidor postgres02.

select count(*) from users;
select * from users;

Com isso, você configurou replicações PostgreSQL multimestre via Bucardo em servidores Ubuntu 22.04.

Conclusão

Neste tutorial, você instalou o servidor PostgreSQL em servidores Ubuntu 22.04 e configurou a replicação multimestre via Bucardo usando dois servidores PostgreSQL. Você aprendeu como configurar o PostgreSQL para rodar em um endereço IP local, configurar a autenticação para usuários do PostgreSQL, compilar e instalar o Bucardo e, em seguida, como configurar a replicação multimestre com o Bucardo.

Além disso, você verificou a replicação multimestre no PostgreSQL inserindo novos dados dos servidores PostgreSQL para garantir que os bancos de dados e tabelas sejam replicados e sincronizados.

Com isso, agora você pode adicionar mais servidores PostgreSQL ao seu ambiente atual e também configurar o balanceamento de carga e o failover por meio de um aplicativo de terceiros, como o HAPROXY, ou usando o pgPool para gerenciar conexões de clientes. Para obter informações detalhadas sobre o PostgreSQL, visite a documentação oficial do PostgreSQL. Para Bucardo, visite a documentação oficial do Bucardo.

Artigos relacionados: