2017-05-08 2 views
0

Je supporte une application hébergée par une petite entreprise, une application web ROR utilisant la base de données pgsql sur le backend.Réplication postgresql | l'application se bloque lorsque le serveur esclave/récupération tombe en panne

Postgres est configuré pour la réplication à un serveur de secours hors site, qui, autant que je peux dire fonctionne très bien, quand j'interroge le serveur distant, il montre qu'il est dans la récupération, etc.

De la ' maître serveur:

postgres=# table pg_stat_replication ; 
    pid | usesysid | usename | application_name | client_addr | client_hostname | client_port |   backend_start 
     | state | sent_location | write_location | flush_location | replay_location | sync_priority | sync_state 
-------+----------+---------+------------------+----------------+-----------------+-------------+----------------------- 
--------+-----------+---------------+----------------+----------------+-----------------+---------------+------------ 
18660 | 1281085 | rep  | postgresql2  | 192.168.81.155 |     |  43824 | 2017-05-07 11:42:43.15 
0057-04 | streaming | 3/B5243418 | 3/B5243418  | 3/B5243418  | 3/B5243150  |    1 | sync 
(1 row) 

... et sur le « esclave »:

postgres=# select pg_is_in_recovery(); 
pg_is_in_recovery 
------------------- 
t 
(1 row) 

postgres=# select now() - pg_last_xact_replay_timestamp() AS replication_delay; 
replication_delay 
------------------- 
01:02:14.885511 
(1 row) 

Je comprends le processus impliqué devrais-je promouvoir mon esclave DB distant au rôle du maître, bu Le problème semble être que 2 ou 3 fois le lien réseau vers le serveur esclave distant est tombé et que l'application se "bloque" complètement (par ex. charge la page mais ne permet pas aux utilisateurs de se connecter), malgré le fait que la base de données principale est toujours opérationnelle. J'ai l'archivage de wal activé pour m'assurer que quand quelque chose comme ceci se produit les données sont préservées jusqu'à ce que le lien soit reconstitué et les journaux de transaction peuvent être envoyés ... mais je ne comprends pas pourquoi mon instance principale de pgsql semble bloquer parce que l'esclave l'instance est déconnectée ... sorte de défait tout le concept de réplication, donc je suppose que je dois faire quelque chose de mal?

+0

s'il vous plaît fournir des erreurs du journal lorsque "ne pas autoriser les utilisateurs à se connecter" se produit. En outre, un décalage d'une heure est assez important pour m'inquiéter je pense –

+0

Pour autant que je pourrais dire, ce n'était pas une heure "décalage", mais plutôt juste été longtemps depuis que toutes les transactions avaient été faites à la base de données. – tmowbray

Répondre

1

L'explication la plus probable est que vous utilisez une réplication synchrone avec seulement deux nœuds.

Est-ce que synchronous_standby_names est défini sur le serveur maître?

Si le seul serveur de secours synchrone n'est pas disponible, aucune transaction ne peut être validée sur le maître, et les transactions de modification de données “ se bloqueront ”, ce qui expliquerait le comportement que vous observez.

Pour la réplication synchrone, vous avez besoin de deux esclaves.

+0

Merci pour les commentaires, il semble que c'était effectivement le problème. – tmowbray