Comment puis-je résoudre un PostgreSQL 9.3 de l'Esclave qui Ne peut pas Tenir avec le Maître?
Nous avons un maître-esclave de réplication de configuration comme suit.
Sur le maître:
postgresql.conf
a réplication configuré comme suit (en commentaire de la ligne pour des raisons de concision):
max_wal_senders = 1
wal_keep_segments = 8
Sur l'esclave:
Même postgresql.conf
que sur le maître. recovery.conf
ressemble à ceci:
standby_mode = 'on'
primary_conninfo = 'host=master1 port=5432 user=replication password=replication'
trigger_file = '/tmp/postgresql.trigger.5432'
Quand il a d'abord été de l'installation, nous avons effectué quelques tests simples et confirmé la réplication a de travail. Cependant, quand nous avons fait la première de chargement des données, seules les données de fait à l'esclave.
Esclave du journal est maintenant rempli avec des messages qui ressemblent à ceci:
< 2015-01-23 23:59:47.241 EST >LOG: started streaming WAL from primary at F/52000000 on timeline 1
< 2015-01-23 23:59:47.241 EST >FATAL: could not receive data from WAL stream: ERROR: requested WAL segment 000000010000000F00000052 has already been removed
< 2015-01-23 23:59:52.259 EST >LOG: started streaming WAL from primary at F/52000000 on timeline 1
< 2015-01-23 23:59:52.260 EST >FATAL: could not receive data from WAL stream: ERROR: requested WAL segment 000000010000000F00000052 has already been removed
< 2015-01-23 23:59:57.270 EST >LOG: started streaming WAL from primary at F/52000000 on timeline 1
< 2015-01-23 23:59:57.270 EST >FATAL: could not receive data from WAL stream: ERROR: requested WAL segment 000000010000000F00000052 has already been removed
Après une analyse et une aide sur l' #postgresql canal IRC, je suis venu à la conclusion que l'esclave ne peut pas tenir avec le maître. Ma solution proposée est la suivante.
Sur le maître:
- Ensemble
max_wal_senders=5
- Ensemble
wal_keep_segments=4000
. Oui je sais c'est très élevée, mais je tiens à surveiller la situation et voir ce qui se passe. J'ai de la place sur le maître.
Sur l'esclave:
- Enregistrer des fichiers de configuration dans le répertoire de données (c'est à dire
pg_hba.conf pg_ident.conf postgresql.conf recovery.conf
) - Effacer le répertoire de données (
rm -rf /var/lib/pgsql/9.3/data/*
) . Cela semble être requis parpg_basebackup
. - Exécutez la commande suivante:
pg_basebackup -h master -D /var/lib/pgsql/9.3/data --username=replication --password
Ai-je raté quelque chose ? Est-il un meilleur moyen d'apporter de l'esclave à jour w/o avoir à recharger toutes les données ?
Toute aide est grandement appréciée.
Ce sujet de recréer de l'esclave, est ma procédure proposée est-elle valide ?
OriginalL'auteur Oleg Dulin | 2015-01-28
Vous devez vous connecter pour publier un commentaire.
Les deux options pour traiter avec l' WAL pour réplication en continu:
wal_keep_segments
doit être suffisamment élevé pour permettre un esclave pour rattraper après un temps raisonnable de décalage (par exemple, mise à jour du volume, de l'esclave étant hors connexion, etc...).archive_mode
permet l'archivage des WAL qui peut être utilisé pour récupérer des fichiers de plus dewal_keep_segments
fournit. Les serveurs esclaves simplement besoin d'une méthode pour extraire les segments WAL. NFS est la méthode la plus simple, mais rien de scp à l'adresse http de bandes de travail tant qu'il peut être scripté.Lorsque l'esclave ne pouvez pas tirer le segment WAL directement à partir de le maître, il va tenter d'utiliser le
restore_command
pour le charger. Vous pouvez configurer l'esclave, de supprimer automatiquement les segments à l'aide de laarchive_cleanup_command
réglage.Si l'esclave arrive à une situation où la prochaine WAL segment est manquant à partir du capitaine et de l'archive, il n'y aura aucune façon de toujours récupérer la base de données. Le seulement raisonnable option est de les frotter le serveur et recommencer à partir d'une nouvelle
pg_basebackup
.OriginalL'auteur Ben Grimm
Comme Ben Grimm suggéré dans les commentaires, c'est une question de faire assurez-vous de définir des segments à la valeur maximale possible pour permettre à l'esclave de se rattraper.
OriginalL'auteur Oleg Dulin
en fait à récupérer, vous n'avez pas à déposer l'ensemble de la DB et de commencer à partir de zéro. depuis, le maître a up-to-date binaires, vous pouvez effectuer les opérations suivantes pour récupérer l'esclave et de les ramener à la synchronisation:
Remarque:
1. l'esclave doit être tourné vers le bas par
service stop
2. maître à son tour, en lecture seulement en raison de requête
pg_start_backup
3. maître puisse continuer à servir les requêtes en lecture seule
4. ramener des esclaves à la fin des étapes
Je l'ai fait en prod, il fonctionne parfaitement pour moi.
l'esclave et le maître sont synchronisés et il n'y a pas de perte de données.
OriginalL'auteur linehrr