Não é possível aplicar a atualização de configuração do Postgres depois de configurar o diretório de dados personalizado

1

Estou provisionando um servidor de banco de dados que é executado em uma instância do AWS EC2 usando o Ubuntu 16.04 com base em uma imagem oficial da AMI da Canonical. Nesta instância, instalei o Postgres 9.6 do repositório xenial-pgdg , depois mudei o local do diretório de dados do diretório padrão, porque desejo usar um volume de capacidade maior para o cluster de banco de dados separado do volume raiz. Depois de alterar a localização do cluster de dados, parece que não consigo recarregar / reiniciar o serviço postgres com êxito para que qualquer alteração de configuração subsequente entre em vigor. No mínimo, preciso configurar os arquivos postgresql.conf e pg_hba.conf no diretório /etc/postgresql/9.6/main/ para permitir que um outro servidor específico se conecte a esse servidor de banco de dados.

Aqui estão informações básicas relevantes sobre a configuração do servidor.

Versão do SO:

ubuntu@ip-10-144-96-189:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.2 LTS
Release:    16.04
Codename:   xenial

Eu criei um usuário e grupo postgres linux. Montou a nova unidade para o cluster de banco de dados e tornou postgres o proprietário do diretório de dados. Adicionou o repositório xenial-pgdg e instalou os seguintes pacotes:

postgresql-9.6
postgresql-contrib-9.6
python-psycopg2
postgresql-9.6-postgis-2.3
libgeos-dev
postgresql-common
s3cmd

Baseado em este write-up descartei o cluster de banco de dados padrão e criei um novo no novo diretório de dados (comandos executados como postgres user):

pg_dropcluster --stop 9.6 main
pg_createcluster -d /mnt/pg_data/pg --start 9.6 main

Eu editei o arquivo /etc/postgresql/9.6/main/postgresql.conf para ouvir as conexões de localhost e um endereço IP sobre TCP na porta 5432:

listen_addresses = 'localhost, 10.112.190.57'     # what IP address(es) to listen on;
port = 5432                                       # (change requires restart)

Em seguida, após reiniciar o serviço postgresql, não havia nenhuma conexão TCP aberta ouvindo o endereço IP configurado, apenas no padrão localhost :

ubuntu@ip-10-144-96-189:~$ sudo systemctl restart postgresql
ubuntu@ip-10-144-96-189:~$ netstat -nlp
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       
PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -               
tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN      -               
tcp6       0      0 :::22                   :::*                    LISTEN      -               
udp        0      0 0.0.0.0:68              0.0.0.0:*                           -               
udp        0      0 10.144.96.189:123       0.0.0.0:*                           -               
udp        0      0 127.0.0.1:123           0.0.0.0:*                           -               
udp        0      0 0.0.0.0:123             0.0.0.0:*                           -               
udp6       0      0 fe80::2000:bff:fed5:123 :::*                                -               
udp6       0      0 ::1:123                 :::*                                -               
udp6       0      0 :::123                  :::*                                -               
Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node   PID/Program name    Path
unix  2      [ ACC ]     STREAM     LISTENING     166227   23611/systemd       /run/user/1000/systemd/private
unix  2      [ ACC ]     SEQPACKET  LISTENING     8758     -                   /run/udev/control
unix  2      [ ACC ]     STREAM     LISTENING     8754     -                   /run/systemd/private
unix  2      [ ACC ]     STREAM     LISTENING     8760     -                   /run/lvm/lvmpolld.socket
unix  2      [ ACC ]     STREAM     LISTENING     8765     -                   /run/systemd/journal/stdout
unix  2      [ ACC ]     STREAM     LISTENING     8891     -                   /run/lvm/lvmetad.socket
unix  2      [ ACC ]     STREAM     LISTENING     13009    -                   /run/snapd-snap.socket
unix  2      [ ACC ]     STREAM     LISTENING     13005    -                   /var/lib/lxd/unix.socket
unix  2      [ ACC ]     STREAM     LISTENING     13008    -                   /run/snapd.socket
unix  2      [ ACC ]     STREAM     LISTENING     13010    -                   /run/acpid.socket
unix  2      [ ACC ]     STREAM     LISTENING     13011    -                   /var/run/dbus/system_bus_socket
unix  2      [ ACC ]     STREAM     LISTENING     13012    -                   /run/uuidd/request
unix  2      [ ACC ]     STREAM     LISTENING     13169    -                   @ISCSIADM_ABSTRACT_NAMESPACE
unix  2      [ ACC ]     STREAM     LISTENING     148848   -                   /var/run/postgresql/.s.PGSQL.5432

A última linha na saída anterior também mostra o soquete Unix aberto para uma conexão local do Postgres. Eu também preciso configurar a autenticação do cliente a partir do endereço IP 10.112.190.57 no arquivo pg_hba.conf .

Pergunta: Quais etapas devo seguir para aplicar a nova configuração dos arquivos postgres.conf e pg_hba.conf ao serviço postgres?

Considerei personalizar os arquivos de serviço systemd e encontrei o seguinte arquivo de serviço recomendado no PostgreSQL website :

When using systemd, you can use the following service unit file (e.g., at /etc/systemd/system/postgresql.service):

[Unit]
Description=PostgreSQL database server
Documentation=man:postgres(1)

[Service]
Type=notify
User=postgres
ExecStart=/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
KillSignal=SIGINT
TimeoutSec=0

[Install]
WantedBy=multi-user.target

Infelizmente, a entrada ExecStart=/usr/local/pgsql/bin/postgres -D ... aponta para um comando que não existe no meu servidor.

Pergunta: Qual é a configuração equivalente do systemd que se aplica ao Ubuntu 16.04 com o PostgreSQL 9.6?

Por fim, aqui está o serviço postgres e o status do serviço de cluster:

ubuntu@ip-10-144-96-189:~$ systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
   Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
   Active: active (exited) since Wed 2017-12-06 18:44:43 UTC; 1 day 2h ago
  Process: 18307 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
 Main PID: 18307 (code=exited, status=0/SUCCESS)
    Tasks: 0
   Memory: 0B
      CPU: 0
   CGroup: /system.slice/postgresql.service

Dec 06 18:44:43 ip-10-144-96-189 systemd[1]: Starting PostgreSQL RDBMS...
Dec 06 18:44:43 ip-10-144-96-189 systemd[1]: Started PostgreSQL RDBMS.

ubuntu@ip-10-144-96-189:~$ systemctl status [email protected][email protected] - PostgreSQL Cluster 9.6-main
   Loaded: loaded (/lib/systemd/system/[email protected]; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2017-12-06 18:44:43 UTC; 1 day 2h ago
  Process: 18274 ExecStop=/usr/bin/pg_ctlcluster --skip-systemctl-redirect -m fast %i stop (code=exited, status=1/FAILURE)
  Process: 18281 ExecStart=postgresql@%i --skip-systemctl-redirect %i start (code=exited, status=0/SUCCESS)
 Main PID: 18290 (postgres)
   CGroup: /system.slice/system-postgresql.slice/[email protected]
           ├─18290 /usr/lib/postgresql/9.6/bin/postgres -D /mnt/pg_data/pg -c config_file=/etc/postgresql/9.6/main/postgresql.conf
           ├─18292 postgres: 9.6/main: checkpointer process                                                                       
           ├─18293 postgres: 9.6/main: writer process                                                                             
           ├─18294 postgres: 9.6/main: wal writer process                                                                         
           ├─18295 postgres: 9.6/main: autovacuum launcher process                                                                
           └─18296 postgres: 9.6/main: stats collector process                                                                    


Dec 06 18:44:40 ip-10-144-96-189 systemd[1]: Stopped PostgreSQL Cluster 9.6-main.
Dec 06 18:44:40 ip-10-144-96-189 systemd[1]: [email protected]: Unit entered failed state.
Dec 06 18:44:40 ip-10-144-96-189 systemd[1]: [email protected]: Failed with result 'exit-code'.
Dec 06 18:44:40 ip-10-144-96-189 systemd[1]: Starting PostgreSQL Cluster 9.6-main...
Dec 06 18:44:43 ip-10-144-96-189 systemd[1]: Started PostgreSQL Cluster 9.6-main.

Eu vejo as falhas no [email protected] status do processo, mas não tenho idéia do que elas significam e como corrigir essa situação.

    
por Dolgos 07.12.2017 / 22:31

1 resposta

1

Depois de algumas pesquisas, encontrei uma solução para provisionar um servidor de banco de dados Ubuntu 16.04 com PostgreSQL 9.6 que usa um local de cluster personalizado e que permite aplicar alterações de configuração subseqüentes.

No meu caso, uma instância do AWS EC2 foi provisionada, mas o processo deve ser o mesmo para qualquer host do Ubuntu 16.04. Também acabei usando o Ansible (v2.3.1) para automatizar o processo de provisionamento, mas a mesma sequência de operações executada pelo Ansible deve levar ao mesmo resultado. Aqui estão os principais passos:

  1. Instale o Python 2.7 no servidor Ubuntu (isso só é necessário pelo Ansible).

  2. Use o geerlingguy.postgresql Função Ansible, que fornece as etapas padrão para instalar o PostgreSQL 9.5 no sistema com o banco de dados cluster inicializado na localização padrão (diretório /var/lib/postgresql/9.5/main ). Essa função é totalmente parametrizada para facilitar a personalização. Eu modifiquei para instalar o PostgreSQL 9.6 com o postgis v2.3.

    • Altere __postgresql_version para "9,6" em vars / Ubuntu-16.yml .
    • Altere a lista __postgresql_packages para incluir nomes de pacotes v9.6 conforme necessário em vars / Ubuntu-16.yml . Adicione os pacotes de extensão necessários, como o postgis, à lista.
    • Modifique _tasks / setup_Debian.yml_ para adicionar o repositório xenial-pgdg , incluindo sua chave de repositório, antes de instalar a lista postgres_packages . Veja o link para detalhes.
    • Atualize o arquivo defaults / main.yml com suas informações de banco de dados, extensão e usuário do banco de dados. Você pode modificar o postgresql_global_config_options para personalizar o valor listen_addresses e modificar o postgresql_hba_entries com valores de conexão personalizados.
    • Em tasks / databases.yml após criar seu banco de dados, adicione quaisquer extensões ao seu banco de dados.

Depois de executar uma lista de reprodução Ansible que contenha as duas etapas acima, o servidor PostgreSQL estará ativo e em execução, permitindo que o usuário local postgres se conecte ao seu banco de dados. Você pode fazer alterações na configuração, como no arquivo /etc/postgresql/9.6/main/postgres.conf e usar o comando systemctl para reiniciar o serviço postgresql para aplicar as alterações.

A função geerlingguy.postgresql Ansible permite configurar o diretório de dados do PostgreSQL, mas ainda não tentei isso. Em vez disso, alterei com sucesso o diretório de dados após o processo descrito acima, seguindo as etapas no link artigo.

Espero que isto seja útil para alguém que esteja a caminho do PostgreSQL no Ubuntu 16.04.

    
por Dolgos 20.12.2017 / 04:16