Categories
Database Backup

**

Per als administradors de bases de dades (DBA) i els enginyers de DevOps que gestionen PostgreSQL en producció, aconseguir un Objectiu de Punt de Recuperació (RPO) proper a zero és un mandat principal. Al cor de les capacitats de recuperació davant desastres i de recuperació en un punt en el temps (PITR) de PostgreSQL es troba el Write-Ahead Logging (WAL). Tot i que el WAL garanteix el compliment ACID registrant les transaccions abans que s’escriguin als fitxers de dades, l’arxivatge de WAL és el mecanisme que preserva aquests registres per a còpies de seguretat i replicació a llarg termini.

Tanmateix, configurar l’arxivatge de WAL no és una operació de «configurar i oblidar». Les configuracions errònies, les fallades silencioses i els malentesos arquitectònics poden provocar pèrdues de dades catastròfiques, escenaris de «split-brain» o interrupcions completes de la base de dades.

En aquesta guia exhaustiva, explorarem l’arquitectura de l’arxivatge de WAL de PostgreSQL, identificarem els errors més comuns que condueixen a la pèrdua de dades i descriurem les millors pràctiques de nivell de producció per garantir que la vostra base de dades es mantingui resilient.

Comprendre l’arquitectura WAL de PostgreSQL

Abans d’aprofundir en els errors, és fonamental entendre com gestiona PostgreSQL els registres de transaccions.

PostgreSQL escriu totes les modificacions en segments WAL (per defecte fitxers de 16 MB) situats al directori pg_wal (anteriorment pg_xlog en versions anteriors a la 10). Cada transacció es registra seqüencialment, marcada per un número de seqüència de registre (LSN).

Quan un segment WAL s’omple, PostgreSQL canvia a un de nou. Per evitar que el directori pg_wal creixi infinitament, PostgreSQL recicla o elimina els segments WAL antics un cop ja no són necessaris per a la recuperació davant fallades o la replicació.

L’arxivatge de WAL intercepta aquest procés de reciclatge. Quan archive_mode està activat, PostgreSQL executa un archive_command definit per l’usuari (o utilitza una archive_library a PostgreSQL 15+) per copiar el segment WAL completat a una ubicació secundària segura abans que s’elimini o se sobreescrigui.

Per realitzar una recuperació en un punt en el temps (PITR), necessiteu dos components:
1. Una còpia de seguretat base vàlida.
2. Una cadena ininterrompuda de fitxers WAL arxivats des del moment de la còpia de seguretat base fins al vostre temps de recuperació objectiu.

Si aquesta cadena WAL es trenca, el vostre PITR fallarà.

Configuració de l’arxivatge de WAL per a producció

Per habilitar l’arxivatge de WAL, heu de modificar el vostre fitxer postgresql.conf. Una configuració bàsica requereix establir el wal_level, habilitar archive_mode i definir l’archive_command.

# postgresql.conf
wal_level = replica             # 'replica' o 'logical' és necessari per a l'arxivatge
archive_mode = on               # Habilita el procés d'arxivatge
archive_command = 'test ! -f /mnt/nfs/archive/%f && cp %p /mnt/nfs/archive/%f'
archive_timeout = 600           # Força un canvi de WAL cada 10 minuts

A l’archive_command:
* %p representa el camí complet al fitxer WAL a arxivar.
* %f representa el nom del fitxer WAL.

Tot i que la configuració anterior sembla senzilla, confiar en ordres de shell simples en entorns empresarials comporta riscos significatius.

Errors comuns en l’arxivatge de WAL

Error 1: L'»èxit silenciós» de l’archive_command

PostgreSQL depèn completament del codi de sortida de l’archive_command. Si l’ordre retorna 0, PostgreSQL assumeix que el fitxer WAL està arxivats de manera segura i procedeix a reciclar el fitxer original.

Un error comú és utilitzar una ordre que retorna 0 fins i tot si les dades no s’han buidat de manera segura a l’emmagatzematge persistent. Per exemple, una ordre cp simple podria retornar èxit tan bon punt les dades arriben a la memòria cau de pàgines del sistema operatiu al servidor de destinació. Si el servidor de destinació perd l’alimentació abans que la memòria cau es buidi al disc, el fitxer WAL es perd, però PostgreSQL ja ha eliminat la seva còpia local.

El risc: Una cadena WAL trencada i la impossibilitat de realitzar un PITR, descobert només durant un escenari de recuperació davant desastres.

La mitigació: Assegureu-vos que el vostre script d’arxivatge apliqui escriptures síncrones. Si utilitzeu ordres de shell estàndard, utilitzeu eines que garanteixin que les dades es buidin, o escriviu un script embolcall que verifiqui la mida del fitxer i la suma de comprovació després de la transferència.

Error 2: Esgotament de la partició pg_wal (inflament de WAL)

Si l’archive_command falla (retorna un codi de sortida diferent de zero)—a causa d’interrupcions de xarxa, permisos incorrectes o un disc de destinació ple—PostgreSQL conservarà el fitxer WAL al directori pg_wal i tornarà a intentar l’ordre indefinidament.

Tot i que això evita la pèrdua de dades en no eliminar els WAL no arxivats, introdueix un risc greu de disponibilitat. Si el directori pg_wal resideix en una partició que s’omple al 100%, PostgreSQL emetrà un PANIC i es bloquejarà. La base de dades no es tornarà a iniciar fins que s’alliberi espai.

El risc: Temps d’inactivitat complet de la base de dades a causa d’una partició pg_wal plena.

La mitigació:
1. Col·loqueu sempre pg_wal en una partició de disc dedicada.
2. Implementeu un seguiment agressiu de la mida del directori pg_wal.
3. Superviseu la vista pg_stat_archiver per detectar immediatament les ordres d’arxivatge que fallen.

Error 3: Còpies de seguretat base incompletes

Una còpia de seguretat base és inútil sense els fitxers WAL generats durant el procés de còpia de seguretat. Si feu una instantània a nivell de sistema de fitxers o utilitzeu pg_basebackup sense transmetre els WAL (-X stream), heu d’assegurar-vos que els fitxers WAL generats entre l’inici i el final de la còpia de seguretat s’arxiven correctament.

Si el vostre arxiver va amb retard o falla, i aquests fitxers WAL específics es perden, la còpia de seguretat base no es pot portar a un estat consistent.

El risc: Còpies de seguretat base corruptes o irrecuperables.

La mitigació: Utilitzeu pg_basebackup -X stream per incloure els fitxers WAL necessaris dins de la mateixa càrrega útil de la còpia de seguretat, o utilitzeu solucions de còpia de seguretat empresarials que gestionin automàticament la dependència entre les còpies de seguretat base i els segments WAL.

Error 4: Confusió de línia de temps i escenaris de «split-brain»

Quan un servidor en espera (standby) es promociona a primari, PostgreSQL incrementa l'»ID de línia de temps» (la primera part del nom del fitxer WAL, p. ex., 0000000200000001000000A4). Això evita que el nou primari sobreescrigui l’historial WAL de l’antic primari.

Tanmateix, si l’antic primari s’inicia accidentalment sense estar correctament protegit (un escenari de «split-brain»), pot intentar enviar fitxers WAL a la mateixa ubicació d’arxiu utilitzant l’antiga línia de temps. Si el vostre archive_command sobreescriu fitxers a cegues, podríeu corrompre el vostre repositori d’arxius.

El risc: Fitxers WAL sobreescrits, arxius corruptes i bases de dades irrecuperables.

La mitigació: El vostre archive_command no ha de sobreescriure mai un fitxer existent. Observeu que en la configuració bàsica anterior, hem utilitzat test ! -f /mnt/nfs/archive/%f per fallar explícitament si el fitxer ja existeix.

Mitigació dels riscos de pèrdua de dades: Millors pràctiques de producció

Per endurir la vostra estratègia d’arxivatge de PostgreSQL, implementeu les següents millors pràctiques.

1. Superviseu el procés d’arxivatge de manera nativa

PostgreSQL proporciona una vista integrada, pg_stat_archiver, que fa un seguiment de l’èxit i el fracàs del vostre procés d’arxivatge. Hauríeu d’integrar aquesta vista a la vostra pila d’observabilitat (p. ex., Prometheus, Datadog o Zabbix).

SELECT 
    archived_count,
    last_archived_wal,
    last_archived_time,
    failed_count,
    last_failed_wal,
    last_failed_time,
    stats_reset
FROM pg_stat_archiver;

Llindars d’alerta a configurar:
* Alerta si failed_count augmenta.
* Alerta si la diferència de temps entre now() i last_archived_time supera el vostre llindar d’RPO (p. ex., 15 minuts), tenint en compte que les bases de dades amb poc trànsit poden tenir retards naturalment tret que s’estableixi archive_timeout.

2. Aprofiteu archive_timeout

En bases de dades amb un volum d’escriptura baix, un fitxer WAL de 16 MB pot trigar hores a omplir-se. Fins que no s’omple, no s’arxiva. Si el servidor falla i es perd el disc local, perdeu hores de transaccions.

Establir archive_timeout = 600 (10 minuts) força PostgreSQL a canviar a un nou fitxer WAL i arxivar l’actual, fins i tot si no està ple. Això garanteix que el vostre RPO no superi els 10 minuts, a costa d’un ús d’emmagatzematge lleugerament superior a causa dels fitxers WAL parcialment plens.

3. Transició a archive_library (PostgreSQL 15+)

Històricament, archive_command generava un nou procés de shell per a cada fitxer WAL. En entorns d’alt rendiment que generen centenars de fitxers WAL per minut, la sobrecàrrega de crear processos de shell es converteix en un coll de botella de rendiment.

PostgreSQL 15 va introduir el paràmetre archive_library, que permet que l’arxivatge de WAL sigui gestionat per mòduls C carregats dinàmicament. Això elimina la sobrecàrrega de creació de shell i proporciona un mecanisme d’arxivatge molt més robust i d’alt rendiment. Si utilitzeu PostgreSQL 15 o superior, busqueu eines de còpia de seguretat que admetin mòduls d’arxiu personalitzats.

4. Proveu regularment la recuperació en un punt en el temps

Una còpia de seguretat no provada no és una còpia de seguretat; és un desig. L’única manera de verificar que el vostre arxivatge de WAL funciona correctament, que la vostra cadena WAL no està trencada i que les vostres còpies de seguretat base són consistents, és realitzar proves de PITR rutinàries i automatitzades.

Inicieu una instància temporal, restaureu la còpia de seguretat base, configureu restore_command per extreure del vostre arxiu i recupereu fins a una marca de temps específica. Verifiqueu que la base de dades arribi a un estat consistent i s’obri per a connexions.

Còpia de seguretat i recuperació empresarial amb CloudSave

Gestionar scripts de shell personalitzats per a archive_command, gestionar la desduplicació de WAL i garantir un emmagatzematge segur fora del lloc per als registres de transaccions pot convertir-se ràpidament en una càrrega operativa per als equips de TI.

Aquí és on CloudSave aporta un valor significatiu per als entorns empresarials de PostgreSQL. CloudSave s’integra directament amb les API natives de còpia de seguretat i arxivatge de WAL de PostgreSQL per eliminar els errors manuals comentats anteriorment.

En lloc d’escriure scripts bash fràgils, CloudSave proporciona una integració robusta, basada en agents o sense agents, que:
* Garanteix el lliurament: Substitueix les ordres de shell estàndard per transferències verificades i validades per suma de comprovació a un emmagatzematge segur fora del lloc o al núvol.
* Evita l’inflament de WAL: Superviseu activament el directori pg_wal i aviseu els administradors molt abans que es produeixi l’esgotament de la partició.
* Automatitza el PITR: Simplifica la recuperació en un punt en el temps mitjançant una interfície intuïtiva. Seleccioneu el minut exacte al qual voleu recuperar, i CloudSave recupera automàticament la còpia de seguretat base correcta i transmet la seqüència exacta de fitxers WAL necessaris per arribar a aquest estat.
* Gestiona les línies de temps: Gestiona de manera intel·ligent els historials de línies de temps de PostgreSQL, garantint que les fallades i els escenaris de «split-brain» no corrompin el vostre repositori de còpies de seguretat.

En descarregar el treball pesat de la gestió de WAL a CloudSave, els DBA poden centrar-se en l’optimització de consultes i el rendiment de la base de dades, sabent que els seus SLA d’RPO i RTO estan protegits per una plataforma de nivell empresarial.

Conclusió

L’arxivatge de WAL de PostgreSQL és l’espina dorsal de la recuperació davant desastres de la base de dades. Tot i que el concepte de copiar un fitxer d’un directori a un altre sembla senzill, els casos límit (fallades silencioses, esgotament del disc i divergència de línies de temps) plantegen riscos greus per a la integritat de les dades.

En comprendre l’arquitectura de pg_wal, evitar estrictament les configuracions destructives d’archive_command, supervisar pg_stat_archiver i aprofitar plataformes de còpia de seguretat empresarials com CloudSave, podeu construir una infraestructura de PostgreSQL resilient capaç de sobreviure a fallades de maquinari, errors humans i interrupcions catastròfiques sense perdre una sola transacció confirmada.

Descobriu els errors comuns de l’arxivatge de WAL de PostgreSQL que condueixen a la pèrdua de dades. Apreneu les millors pràctiques d’experts DBA, consells de configuració i com garantir una recuperació en un punt en el temps (PITR) fiable per a bases de dades empresarials.