Replicação PostgreSQL eslavo multi

Fonte: Pt Ikoula wiki
Ir para navegação Ir para pesquisar
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

pt:Replicação PostgreSQL eslavo multi en:Replication PostgreSQL Slavic multi he:שכפול מרובה PostgreSQL סלאבית ro:Replicare PostgreSQL slave multi ru:Multi PostgreSQL славянских репликации pl:Replikacja wielu słowiańskich PostgreSQL ja:レプリケーション PostgreSQL スラブ マルチ ar:النسخ المتماثل السلافية كيو متعدد zh:复制 PostgreSQL 斯拉夫语多 de:Replikation PostgreSQL slawischen multi nl:Replicatie PostgreSQL Slavische multi it:Replica PostgreSQL slavo multi es:Replicación multi de PostgreSQL Slavic fr:Replication PostgreSQL multi slaves

Este artigo foi traduzido por um sistema de tradução automática. Você pode visualizar a fonte do artigo aqui.

Introdução

Esta página aborda a implementação de um assíncrono PostgreSQL streaming de replicação com um mestre e dois escravos. Nosso eslavo será configurado como quente espera, isso quer dizer que será possível executar consultas (somente leitura ) sobre estes.


Contexto desta colocação :


Temos 3 Servidores Debian 8 (última atualização ) :

Postgres 01 (10.1.1.75) : será nosso mestre

Postgres02 (10.1.1.90) : será um escravo

Postgres03 (10.1.1.199) : será um escravo segundo


Especificado de comandos será executar como root quando eles são precedidos por "#" e como o usuário Postgres do sistema quando eles são precedidos por "$".

Instalação do PostgreSQL e pré-configuração dos três servidores

Todos os comandos nesta parte estão a ser feito em cada um dos servidores.

Como primeiro passo, é aconselhável ter um arquivo /etc/hosts preenchido com as correspondências de cada servidor, assim (adaptando-se com os nomes de host e os endereços ip dos seus próprios servidores ) :

# cat /etc/hosts
127.0.0.1       localhost

10.1.1.75       Postgres 01
10.1.1.90       Postgres 02
10.1.1.199      Postgres 03


Adicionar o depósito APT PostgreSQL :

# echo "deb http://apt.postgresql.org/pub/repos/apt/ jessie-pgdg main" > /etc/apt/sources.list.d/postgres.list


Nós importamos a chave pública deste depósito :

# gpg --keyserver pgpkeys.mit.edu --recv-key 7FCC7D46ACCC4CF8 && gpg -a --export 7FCC7D46ACCC4CF8 | apt-key add -
gpg: directory `/root/.gnupg' created
gpg: new configuration file `/root/.gnupg/gpg.conf' created
gpg: WARNING: options in `/root/.gnupg/gpg.conf' are not yet active during this run
gpg: keyring `/root/.gnupg/secring.gpg' created
gpg: keyring `/root/.gnupg/pubring.gpg' created
gpg: requesting key ACCC4CF8 from hkp server pgpkeys.mit.edu
gpg: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key ACCC4CF8: public key "PostgreSQL Debian Repository" imported
gpg: no ultimately trusted keys found
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
OK


Ele atualiza o cache do APT para levar em conta o depósito :

# apt-get update


Instalar o pacote postgresql (instalar a última versão estável é a 9.5 na época onde estas linhas são escritas ) :

# apt-get install postgresql


Definimos uma senha (da sua escolha mas seguro ) e gera um par de chave ssh (sem senha ) para o usuário postgres do sistema :

# passwd postgres
# su - postgres
$ ssh-keygen


Copiamos o usuário postgres de e entre cada servidor público ssh chave :


Desde o primeiro servidor (postgres01 no nosso caso ) para o segundo (postgres02 para nós ) e troisiseme (postgres03) :

root@postgres01:~# su - postgres
postgres@postgres01:~$ ssh-copy-id postgres02
postgres@postgres01:~$ ssh-copy-id postgres03


Do segundo para o primeiro e o terceiro servidor :

root@postgres02:~# su - postgres
postgres@postgres02:~$ ssh-copy-id postgres01
postgres@postgres02:~$ ssh-copy-id postgres03


Do terceiro para o primeiro e o segundo servidor :

root@postgres03:~# su - postgres
postgres@postgres03:~$ ssh-copy-id postgres01
postgres@postgres03:~$ ssh-copy-id postgres02

A configuração de Master

Fazer só no master (postgres01 no nosso caso ) :


Ele cria o papel /usuário de replicação :

# su - postgres
$ psql -c "CREATE USER repuser REPLICATION LOGIN CONNECTION LIMIT 2 ENCRYPTED PASSWORD '<mot de passe repuser>';"

Nota : Ele define um limite de conexão de 2 Porque temos 2 Eslava


Editando o arquivo de configuração principal do postgresql /etc/postgresql/9.5/main/postgresql.conf para configurar as seguintes directivas :

listen_addresses = '*'
wal_level = hot_standby
archive_mode = on
archive_command = 'rsync -av %p postgres@<ip du premier slave>:/var/lib/postgresql/wal_archive/%f'
max_wal_senders = 2
wal_keep_segments = 256
hot_standby = on

Nota : Podemos habilitar o arquivamento para nosso segundo servidor (Personalize o seu endereço de ip do servidor ) para ainda mais precauções. Podemos também definir os parâmetros hot_standby, bem isso ignorado em um mestre, onde ele deve ser rebaixado a escrava no futuro.


Agora editar o arquivo de autenticação do postgresql /etc/postgresql/9.5/main/pg_hba.conf para adicionar a permissão de nosso usuário de replicação se conectar de nosso eslavo ou a seguinte linha no final do arquivo :

hostssl replication     repuser <ip du réseau de vos serveurs>/24     md5

Por favor se adaptar a esta linha de acordo com o nome de seu usuário de rede e replicação (ou endereços ip respectivo ) de seu eslavo


Reinicia o serviço postgresql para levar em conta nossa configuração (na raiz ) :

# systemctl restart postgresql


Isso garante que o serviço é iniciado corretamente :

root@postgres01:~# systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
   Loaded: loaded (/lib/systemd/system/postgresql.service; enabled)
   Active: active (exited) since Thu 2016-06-02 12:06:28 CEST; 22s ago
  Process: 77056 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
 Main PID: 77056 (code=exited, status=0/SUCCESS)


root@postgres01:~# ps -u postgres u
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
postgres  77038  0.0  4.4 227300 21836 ?        S    12:06   0:00 /usr/lib/postgresql/9.5/bin/postgres -D /var/lib/postgresql/9.
postgres  77040  0.0  0.8 227300  4160 ?        Ss   12:06   0:00 postgres: checkpointer process
postgres  77041  0.0  1.0 227300  4968 ?        Ss   12:06   0:00 postgres: writer process
postgres  77042  0.0  1.7 227300  8776 ?        Ss   12:06   0:00 postgres: wal writer process
postgres  77043  0.0  1.3 227728  6708 ?        Ss   12:06   0:00 postgres: autovacuum launcher process
postgres  77044  0.0  0.6  82244  3392 ?        Ss   12:06   0:00 postgres: archiver process
postgres  77045  0.0  0.8  82244  4244 ?        Ss   12:06   0:00 postgres: stats collector process

Configuração dos eslavos

Sobre o primeiro escravo

Começamos por parar o serviço do postgresql :

# systemctl stop postgresql


Editando o arquivo de configuração principal do postgresql /etc/postgresql/9.5/main/postgresql.conf para configurar as mesmas diretrizes como o mestre, ajustando-se apenas o ip do primeiro escravo pelo segundo escravo no comando rsync para arquivar ou :

listen_addresses = '*'
wal_level = hot_standby
archive_mode = on
archive_command = 'rsync -av %p postgres@<ip du second slave>:/var/lib/postgresql/wal_archive/%f'
max_wal_senders = 2
wal_keep_segments = 256
hot_standby = on


Agora editar o arquivo de autenticação do postgresql /etc/postgresql/9.5/main/pg_hba.conf para adicionar a permissão de nosso usuário de replicação se conectar de nossos outros servidores (Isso será usado quando este escravo esperado promovido mestre ) :

hostssl replication     repuser <ip du réseau de vos serveurs>/24     md5

Nota : Com essa configuração semelhante ao nosso mestre isto permitirá facilmente promover este escravo como mestre em caso de necessidade.


Para as operações abaixo, faça login como usuário postgres do sistema :

# su – postgres


Nós criamos o diretório de destino para a wal de arquivos mestre :

$ mkdir /var/lib/postgresql/wal_archive


Ele remove o diretório de dados do postgresql :

$ rm -rf /var/lib/postgresql/9.5/main


Faz o backup de base (personalizar o ip de seu mestre e o nome do seu usuário de replicação ), a senha de seu usuário de replicação será solicitado :

$ pg_basebackup -h <ip de votre master> -D /var/lib/postgresql/9.5/main -U repuser -v -P --xlog


Criando o arquivo de configura a replicação /var/lib/postgresql/9.5/main/recovery.conf com os seguintes parâmetros :

standby_mode = on
primary_conninfo = 'host=<ip de votre master> port=5432 user=repuser password=<mot de passe de repuser> sslmode=require application_name=<hostname de votre slave>'
trigger_file = '/var/lib/postgresql/9.5/postgres.trigger'

Nota : O arquivo de gatilho é o arquivo que criamos quando queremos seu escravo replicação pára e vai começar aceitando inscrições — quando você deseja promovê-lo como mestre. Antes de promover um escravo em caso de queda de seu mestre, certifique-se de que o mestre inicial não subirá para evitar a corrupção.


Voltamos a raiz e começa o serviço :

# systemctl start postgresql


Isso garante que o serviço foi iniciado corretamente :

# systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
   Loaded: loaded (/lib/systemd/system/postgresql.service; enabled)
   Active: active (exited) since Thu 2016-06-02 12:53:42 CEST; 1min 6s ago
  Process: 8894 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
 Main PID: 8894 (code=exited, status=0/SUCCESS)


# ps -u postgres u
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
postgres   8878  0.0  4.4 227308 21892 ?        S    12:53   0:00 /usr/lib/postgresql/9.5/bin/postgres -D /var/lib/postgresql/9.
postgres   8879  0.0  1.1 227376  5700 ?        Ss   12:53   0:00 postgres: startup process   recovering 00000001000000000000000
postgres   8880  0.0  0.8 227308  4140 ?        Ss   12:53   0:00 postgres: checkpointer process
postgres   8881  0.0  1.0 227308  5236 ?        Ss   12:53   0:00 postgres: writer process
postgres   8882  0.0  0.6  82252  3316 ?        Ss   12:53   0:00 postgres: stats collector process
postgres   8883  0.0  1.7 238064  8520 ?        Ss   12:53   0:00 postgres: wal receiver process   streaming 0/30003E0


Se ele se conecta ao nosso mestre, já podemos verificar a replicação entre o mestre e o escravo primeiro é funcional :

Ele se conecta ao nosso mestre e ele se conecta no usuário postgres do sistema :

# su - postgres


Em seguida, conectar ao postgresql :

$ psql


Permite a exibição estendida e verificamos nossa replicação :

postgres=# \x
Expanded display is on.
postgres=# select * from pg_stat_replication;
-[ RECORD 1 ]----+------------------------------
pid              | 78879
usesysid         | 16384
usename          | repuser
application_name | postgres02
client_addr      | 10.1.1.90
client_hostname  |
client_port      | 49009
backend_start    | 2016-06-02 12:53:36.641823+02
backend_xmin     |
state            | streaming
sent_CRElocation    | 0/30004C0
write_location   | 0/30004C0
flush_location   | 0/30004C0
replay_location  | 0/30004C0
sync_priority    | 0
sync_state       | async

Nossa replicação assíncrona de fluxo contínuo com nosso primeiro escravo é bem feita. Esta fase tem um mestre replicação /Escravo clássico (um único escravo assíncrono de streaming )

No segundo slave

Nós Redid o mesmo que foi feito no primeiro slave obviamente adaptando seu hostname no arquivo recovery.conf e ip endereço no comando de arquivamento no arquivo de configuração principal, se você também deseja Habilitar arquivamento sobre este segundo escravo.

Verificação e ensaio de nosso multi mestre replicação eslavo

Ele se conecta ao mestre e é registrada no usuário postgres :

# su – postgres

Em seguida, conectar ao postgresql :

$ psql


Permite a exibição estendida e verificamos nossa replicação :

postgres=# \x
Expanded display is on.
postgres=# select * from pg_stat_replication;
-[ RECORD 1 ]----+------------------------------
pid              | 78879
usesysid         | 16384
usename          | repuser
application_name | postgres02
client_addr      | 10.1.1.90
client_hostname  |
client_port      | 49009
backend_start    | 2016-06-02 12:53:36.641823+02
backend_xmin     |
state            | streaming
sent_location    | 0/5000140
write_location   | 0/5000140
flush_location   | 0/5000140
replay_location  | 0/5000140
sync_priority    | 0
sync_state       | async
-[ RECORD 2 ]----+------------------------------
pid              | 82725
usesysid         | 16384
usename          | repuser
application_name | postgres03
client_addr      | 10.1.1.199
client_hostname  |
client_port      | 51754
backend_start    | 2016-06-02 14:31:43.759683+02
backend_xmin     |
state            | streaming
sent_location    | 0/5000140
write_location   | 0/5000140
flush_location   | 0/5000140
replay_location  | 0/5000140
sync_priority    | 0
sync_state       | async

Então lá bem nosso 2 replicação com nossos dois servidores eslavas (postgres02 e postgres 03).


Ainda ligado ao postgresql no mestre, ele cria um dados base (ex : checkrep ) :

postgres=# CREATE DATABASE checkrep;


Ele verifica que o banco de dados é bem replicado no nosso 2 Eslava :

root@postgres02:~# su - postgres
postgres@postgres02:~$ psql
psql (9.5.3)
Type "help" for help.

postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 checkrep  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(4 rows)


root@postgres03:~# su - postgres
postgres@postgres03:~$ psql
psql (9.5.3)
Type "help" for help.

postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 checkrep  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(4 rows)

É o banco de dados que criamos em nosso mestre é tão bem automaticamente replicada para nossos dois eslavo.


Para excluir, desde o mestre :

postgres=# DROP DATABASE checkrep;



Não tem permissão para colocar comentários.