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.
O que é Pgpool-II?
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
Replicação de streaming
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) .
Balanceamento de carga e pool de conexões
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.
Etapas a seguir para configurar e implementar o Pgpool-ll
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.
Configurar arquitetura mestre-escravo para servidores PostgreSQL
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.
Configurar o Mestre Escravo
Há quatro coisas que precisamos fazer no servidor Master:
- 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.
- 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.
- 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/16
bloco CIDR com senha criptografada md5. Você pode alterar o CIDR de acordo com seus requisitos.
- 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
Configurar o servidor escravo
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.
Para garantir que você pare o serviço PostgreSQL no servidor escravo. Execute
systemctl stop postgresql@16-main
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.
- 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.
- 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.
- 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.
- Reinicie o servidor escravo.
Use systemctl restart postgresql@16-main
para reiniciar o servidor escravo. Agora, podemos verificar a replicação entre eles.
Verifique a replicação mestre-escravo
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 .
Implementação do Pgpool-II
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.
Instalar Pgpool-II
Ubuntu:apt install pgpool2
Para qualquer outro sistema operacional, consulte este documento para instalar o Pgpool-II
Configurar Pgpool
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/16
como 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.
Autenticação
enable_pool_hba = on # Use pool_hba.conf for client authentication
pool_passwd = 'pool_passwd'
Aqui, enable_pool_hba = on
define Pgpool-II para usar pool_hba
para 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.conf
conexão, ela será rejeitada.
E pool_passwd = ‘pool_passwd’
especifica qual arquivo o Pgpool-II deve usar para autenticar o usuário. Este pool_passwd
arquivo terá a lista de usuários e suas senhas no formato md5.
Registre todas as declarações
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.
Saúde da replicação de streaming
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.
Parâmetros globais de verificação de saúde
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_passwd
qual 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_passwd
arquivo.
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.conf
configuraçã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 -W
para conectar através do Pgpool2 como fazemos com o PostgreSQL
(Já que configuramos a porta pgpool2 para 9999 no pg_pool.conf
arquivo 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.
Resumindo
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.
Nenhum comentário:
Postar um comentário