Pgpool-II com PostgreSQL

 

Pgpool-II com PostgreSQL

Neste artigo de Mithun K, engenheiro de software da Plataforma I na GeekyAnts, explore como o Pgpool-II pode aprimorar o PostgreSQL.

·

10 min de leitura

Pgpool-II é um middleware que pode ser executado em Linux e Solaris entre aplicativos e bancos de dados PostgreSQL .

Suas principais características incluem o seguinte:

  • Balanceamento de carga

  • Replicação

  • Pool de conexões

  • Failover automático

  • Recuperação on-line

O P gpool-II pode usar seus recursos de replicação ou aqueles fornecidos por outro software, mas a replicação de streaming do PostgreSQL é frequentemente recomendada. A replicação de streaming é um recurso que replica bancos de dados enviando logs de transação (WALs) do PostgreSQL (primário) para várias instâncias do PostgreSQL (standby) .

O scale-out é uma maneira de aumentar a capacidade de processamento de todo o sistema de banco de dados adicionando servidores. O PostgreSQL permite que você faça o scale-out usando replicação de streaming. Distribuir consultas de aplicativos para servidores de banco de dados de forma eficiente é essencial neste cenário. O PostgreSQL em si não tem um recurso de distribuição, mas você pode utilizar o balanceamento de carga do Pgpool-II, que distribui consultas somente leitura de forma eficiente para balancear a carga de trabalho.

Outro ótimo recurso do Pgpool-II é o pool de conexões . Usando o pool de conexões do Pgpool-II, as conexões podem ser retidas e reutilizadas, reduzindo a sobrecarga que ocorrerá ao conectar-se a servidores de banco de dados.

Neste artigo, nos concentramos principalmente nos recursos de replicação e balanceamento de carga do Pgpool-II.

Neste artigo, usei o sistema operacional Ubuntu-22. Se você estiver usando qualquer outro sistema operacional, consulte este documento .

Aqui, estamos usando o recurso do PostgreSQL chamado replicação de streaming, conforme mencionado acima, que configura um mestre escravo no qual estamos configurando o Pgpool-II.

Já que precisamos da replicação de streaming master-slave fornecida pelo PostgreSQL. Vamos ver o que é replicação de streaming e como podemos configurá-la.

O que é replicação mestre-escravo?

A replicação de banco de dados mestre-escravo é um processo de copiar (sincronizar) dados de um banco de dados em um servidor (o mestre) para um banco de dados em outro servidor (os escravos) e distribuir a carga de solicitação de leitura/gravação conforme os requisitos do sistema. Onde o mestre é responsável pelas operações de leitura/gravação no servidor e os escravos são responsáveis ​​pelas operações somente leitura nos servidores.

Neste artigo, usaremos o PostgreSQL Streaming Replication para desenvolver uma configuração master-slave. Mas antes de prosseguir com a configuração, tenho algumas perguntas.

O que é replicação de streaming?

A replicação de streaming permite que um servidor standby (escravo) fique mais atualizado do que é possível com o envio de log baseado em arquivo. O escravo se conecta ao mestre, que transmite registros WAL para o escravo assim que eles são gerados, sem esperar que o arquivo WAL seja preenchido.

Pré-requisito:

  • Instale o PostgreSQL em ambos os servidores, ou seja, mestre e escravo.

  • Ambos os servidores devem ser capazes de se comunicar entre si.

Se você não instalou o PostgreSQL em seus servidores, siga este passo a passo para instalá-lo.

  • Ubuntu:apt install postgresql

  • Alma / CentOS:yum install postgresql

Se você estiver usando qualquer outro sistema operacional, consulte este documento para instalar o PostgreSQL.

Há quatro coisas que precisamos fazer no servidor Master:

  1. Habilitar rede:

A primeira coisa é alterar postgresql.conf, O arquivo pode ser encontrado em /etc/postgresql/16/main/ do cluster principal. Aqui está como isso funciona:

Abra o arquivo conf usando vim /etc/postgresql/16/main/postgresql.conf.

(Este caminho pode variar de acordo com a versão do PostgreSQL que você está usando.)

Altere o listen_addresses = '*'que permite que o servidor escute todos os servidores da Internet.

  1. Crie um usuário de replicação:

Agora crie um usuário de replicação que será usado para replicação de dados no mestre.

Efetue login no terminal do PostgreSQL e execute o seguinte comando.

CREATE USER repuser WITH LOGIN REPLICATION;

Este comando pode criar um usuário para replicação com privilégios de login.

  1. Permitir acesso remoto:

Depois de criar com sucesso um usuário com permissão de REPLICAÇÃO, configure o arquivo pg_hba.conf localizado em /etc/postgresql/16/main/ .

host replication repuser 172.31.0.0/16 md5

Adicione a linha acima ao arquivo.

O que isso faz é permitir a replicação para o usuário de qualquer servidor que pertença ao 172.31.0.0/16bloco CIDR com senha criptografada md5. Você pode alterar o CIDR de acordo com seus requisitos.

  1. Reinicie o servidor mestre:

Ao reiniciar o servidor mestre, todas as novas alterações serão aplicadas ao servidor mestre.

systemctl restart postgresql@16-main

O próximo passo é criar o Slave. Há várias coisas que precisamos fazer para que isso funcione. Primeiro, garanta que a réplica esteja parada e o diretório de dados esteja vazio.

  1. Para garantir que você pare o serviço PostgreSQL no servidor escravo. Executesystemctl stop postgresql@16-main

  2. Em seguida, vá para /var/lib/postgresql/16/. Lembre-se de que o caminho pode variar para a versão que você está usando

É sempre recomendado criar um backup de segurança. Ou seja, se ocorrer alguma falha no processo, podemos ter os dados antigos que podemos usar para restaurar. Siga os passos abaixo para o processo de backup.

mv main main_backup

mkdir main

Abra o arquivo conf usando vim /etc/postgresql/16/main/postgresql.conf.

(Este caminho pode variar de acordo com a versão do PostgreSQL que você está usando.)

Altere o listen_addresses = '*'que permite que o servidor escute todos os servidores da Internet.

  1. Configure o arquivo pg_hba.conf localizado em /etc/postgresql/16/main/.

Altere o método de autenticação para trust conforme mostrado abaixo. Para que não tenhamos que usar senha para acessar o PostgreSQL no mesmo servidor.

  1. Comando para backup de base de replicação escrava e configuração.

pg_basebackup -h 172.31.3.42 -U repuser --checkpoint=fast -D /var/lib/postgresql/16/main/ -R --slot=replication -C --port=5432

Isso fará um backup em tempo real do servidor mestre e alocará um slot para replicação do servidor mestre para o servidor escravo atual.

  1. Como executamos esse comando como usuário root, precisamos alterar a permissão da pasta principal para o usuário Postgres para que o Postgres possa acessar os dados daqui.

Usarchown -R postgres:postgres /var/lib/postgresql/16/main

Isso alterará a permissão do usuário do Postgres.

  1. Reinicie o servidor escravo.

Use systemctl restart postgresql@16-mainpara reiniciar o servidor escravo. Agora, podemos verificar a replicação entre eles.

Execute o comando abaixo no servidor Master:

Faça login no serviço de banco de dados PostgreSQL.

SELECT * FROM pg_replication_slots WHERE active = true;

Você obterá os nomes de slot de qualquer um que esteja ativo. Se o slot que você criou existir, então a replicação foi bem-sucedida.

Você também pode tentar o comando abaixo para testá-lo.

select * from pg_stat_replication;

Execute este comando no servidor escravo:

Efetue login no serviço PostgreSQL e execute o comando abaixo.

select * from pg_stat_wal_receiver;

Você obterá uma saída parecida com a imagem abaixo. Você pode verificar a replicação consultando a linha conninfo .

Agora vamos começar com a configuração do Pgpool-II. Aqui estou configurando o Pgpool-II no próprio servidor mestre. Você pode configurá-lo em qualquer servidor, desde que ele possa se comunicar com os servidores PostgreSQL que você registrará no futuro. É recomendado usar uma rede privada para evitar vulnerabilidade.

Ubuntu:apt install pgpool2

Para qualquer outro sistema operacional, consulte este documento para instalar o Pgpool-II

Abra o arquivo /etc/postgresql/16/main/pg_hba.conf em servidores e adicione uma entrada para o servidor pgpool-II para se conectar ao seu servidor PostgreSQL.

No meu caso, é 172.31.0.0/16como se tanto o servidor mestre quanto o escravo estivessem sob esse bloco de rede CIDR. Agora, isso permite que todos os servidores neste bloco se conectem sem uma senha.

host all all 172.31.0.0/16 trust

Abra /etc/pgpool2/pgpool.conf e faremos muitas alterações no arquivo de configuração. Também lhe informarei o motivo.

Alterar os endereços de escuta padrão para '*'

listen_addresses=’*’;
port=’9999’;

Adicionando host - 0 (master no meu caso):

backend_hostname0 = '172.31.3.42' #master server information
backend_port0 = 5432
backend_weight0 = 0
backend_data_directory0 = '/var/lib/postgresql/16/main'
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_application_name0 = 'server0'

Adicionando host -1 (escravo no meu caso):

backend_hostname1 = '172.31.15.39' #slave server information
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/var/lib/postgresql/16/main'
backend_flag1 = 'ALLOW_TO_FAILOVER'
backend_application_name1 = 'server1'
  • Aqui, o nome do host se refere ao IP/nome do host do servidor que estamos tentando registrar no Pgpool-II.

  • Porta se refere à porta de escuta do servidor PostgreSQL e data_directory se refere à pasta onde os dados do banco de dados PostgreSQL estão localizados.

  • Peso se refere à proporção de como decidimos distribuir o tráfego entre os nós ou, digamos, servidores PostgreSQL.

  • Também podemos adicionar mais hosts adicionando sufixos às variáveis ​​de backend, por exemplo: backend_hostname2 e assim por diante.

Para adicionar autenticação ao Pgpool-II. Como estamos usando os servidores PostgreSQL em trust, é melhor usar o Pgpool-II com senha ou digamos autenticação. A solicitação é feita ao servidor Pgpool-II e o Pgpool-II redirecionará as solicitações para os hosts registrados.

enable_pool_hba = on                # Use pool_hba.conf for client authentication
pool_passwd = 'pool_passwd'

Aqui, enable_pool_hba = ondefine Pgpool-II para usar pool_hbapara verificar se o cliente solicitante tem permissão para enviar uma solicitação ou não. Se o cliente solicitante não tiver permissões registradas na pool_hba.confconexão, ela será rejeitada.

pool_passwd = ‘pool_passwd’especifica qual arquivo o Pgpool-II deve usar para autenticar o usuário. Este pool_passwdarquivo terá a lista de usuários e suas senhas no formato md5.

log_statement = on
log_per_node_statement = on
load_balance_mode = on

Isso nos permite obter os logs das instruções/solicitações executadas no servidor e também os logs de cada nó para as instruções/solicitações executadas no servidor.

sr_check_period = 10
sr_check_user = 'postgres'
sr_check_password = ''
sr_check_database = 'postgres'

Aqui, essas variáveis ​​ajudarão o Pgpool-II a saber o status de integridade da replicação de streaming, ou seja, se está ativo ou não.

health_check_period = 10
health_check_timeout = 20
health_check_user = 'postgres'
health_check_password = ''
health_check_database = 'postgres'

Estas são algumas das variáveis ​​que são usadas para executar verificações de integridade em todos os servidores pelo Pgpool-II para manter e descartar conexões de servidores ativos e inativos, respectivamente.

Agora que as alterações no arquivo de configuração estão completas. Vamos prosseguir para a autenticação Pgpool-II.

Como mencionamos acima no arquivo de configuração sobre o pool_passwdqual armazena a autenticação de senha. Aqui, mostrarei como criamos uma entrada de usuário e senha para este arquivo.

Use o seguinte comando para criar uma entrada de usuário e senha no pool_passwdarquivo.

Executar - pg_md5 --md5auth -f /etc/pgpool2/pgpool.conf -u postgres -p .

Isso solicitará que o usuário insira a senha para o usuário postgres. Ao inserir a senha, ele adicionará uma linha com o usuário postgres e sua senha inserida pelo usuário no formato md5.

Agora abra o /etc/pgpool2/pool_passwd. Você deverá ver o usuário do Postgres e sua senha criptografada neste arquivo.

Agora vamos começar com a pool_hba.confconfiguração do arquivo. Já que fizemos o enable_pool_hba = on, o Pgpool-II vai verificar se o cliente que está solicitando a conexão é válido ou não.

Abra o /etc/pgpool2/pool_hba.conf.

Adicionar a linha abaixo permite que o Pgpool-II aceite conexão de qualquer servidor, desde que eles solicitem uma senha correta. Como estamos usando md5 em vez de trust, ele exige senha.

host all all 0.0.0.0/0 md5

Reinicie o pgpool2.service

systemctl restart pgpool2.service

Por favor, use psql -p 9999 -u postgres -Wpara conectar através do Pgpool2 como fazemos com o PostgreSQL

(Já que configuramos a porta pgpool2 para 9999 no pg_pool.confarquivo de configuração.)

Aqui eu forneci uma imagem de referência abaixo. onde eu entrei no Pgpool-II e visualizei os nós disponíveis. Você pode usar SHOW POOL_NODES;para visualizar todos os nós e todas as suas informações.

Podemos iniciar o serviço pgpool usando o comando pgpool -n &ou systemctl start pgpool2.service.

Estou usando pgpool -n &(Isso nos fornecerá logs do Pgpool-II no terminal, que podemos usar como referência.)

Aqui, você pode ver abaixo como as instruções READ são redirecionadas para o escravo, e as instruções WRITE são enviadas para o mestre, mesmo que o peso do mestre esteja definido como 0.

Observação:

  • Aqui, estou usando peso 0 para o mestre e 1 para o escravo para conseguir enviar todas as solicitações de LEITURA para o escravo e solicitações de ESCRITA para o mestre.

  • Se especificarmos '1' como o peso para o mestre e o escravo, a solicitação de LEITURA também será enviada ao servidor mestre quando a carga no mestre for menor.

Neste artigo, exploramos apenas a Replicação e como usamos a replicação para balanceamento de carga das solicitações nos servidores manipulando o valor dos pesos. Depois que explorarmos todos os outros recursos do Pgpool-II, adicionarei um link para esses conceitos aqui.