Categories
Database Backup

**

Para os Administradores de Bases de Datos (DBAs) e enxeñeiros de DevOps que xestionan PostgreSQL en produción, acadar un Obxectivo de Punto de Recuperación (RPO) próximo a cero é un mandato primordial. No corazón das capacidades de recuperación ante desastres e recuperación puntual (PITR) de PostgreSQL atópase o Write-Ahead Logging (WAL). Aínda que o WAL garante o cumprimento ACID rexistrando as transaccións antes de que se escriban nos ficheiros de datos, o arquivado de WAL é o mecanismo que preserva estes rexistros para copias de seguridade e replicación a longo prazo.

Non obstante, configurar o arquivado de WAL non é unha operación de “configurar e esquecer”. As configuracións incorrectas, os fallos silenciosos e os malentendidos arquitectónicos poden levar a unha perda de datos catastrófica, escenarios de “split-brain” ou interrupcións completas da base de datos.

Nesta guía exhaustiva, exploraremos a arquitectura do arquivado de WAL de PostgreSQL, identificaremos as trampas máis comúns que levan á perda de datos e describiremos as mellores prácticas de nivel de produción para garantir que a súa base de datos permaneza resiliente.

Comprendendo a arquitectura WAL de PostgreSQL

Antes de afondar nas trampas, é fundamental entender como PostgreSQL manexa os rexistros de transaccións.

PostgreSQL escribe todas as modificacións en segmentos WAL (por defecto ficheiros de 16 MB) situados no directorio pg_wal (anteriormente pg_xlog en versións anteriores á 10). Cada transacción rexístrase secuencialmente, marcada por un Número de Secuencia de Rexistro (LSN).

Cando un segmento WAL se enche, PostgreSQL cambia a un novo. Para evitar que o directorio pg_wal medre infinitamente, PostgreSQL recicla ou elimina os segmentos WAL antigos unha vez que xa non son necesarios para a recuperación ante fallos ou a replicación.

O arquivado de WAL intercepta este proceso de reciclaxe. Cando archive_mode está activado, PostgreSQL executa un archive_command definido polo usuario (ou utiliza unha archive_library en PostgreSQL 15+) para copiar o segmento WAL completado a unha localización secundaria segura antes de que sexa eliminado ou sobrescrito.

Para realizar unha recuperación puntual (PITR), precisa dous compoñentes:
1. Unha copia de seguridade base válida.
2. Unha cadea ininterrompida de ficheiros WAL arquivados desde o momento da copia de seguridade base ata o seu tempo de recuperación obxectivo.

Se esa cadea WAL se rompe, o seu PITR falla.

Configurando o arquivado de WAL para produción

Para activar o arquivado de WAL, debe modificar o seu ficheiro postgresql.conf. Unha configuración básica require establecer o wal_level, activar archive_mode e definir o archive_command.

# postgresql.conf
wal_level = replica             # 'replica' ou 'logical' é necesario para o arquivado
archive_mode = on               # Activa o proceso de arquivado
archive_command = 'test ! -f /mnt/nfs/archive/%f && cp %p /mnt/nfs/archive/%f'
archive_timeout = 600           # Forzar un cambio de WAL cada 10 minutos

No archive_command:
* %p representa a ruta completa ao ficheiro WAL que se vai arquivar.
* %f representa o nome do ficheiro WAL.

Aínda que a configuración anterior parece sinxela, confiar en comandos de shell simples en contornas empresariais introduce riscos significativos.

Trampas comúns no arquivado de WAL

Trampa 1: O “éxito silencioso” de archive_command

PostgreSQL confía totalmente no código de saída do archive_command. Se o comando devolve 0, PostgreSQL asume que o ficheiro WAL está arquivado de forma segura e procede a reciclar o ficheiro orixinal.

Un erro común é usar un comando que devolve 0 mesmo se os datos non se descargan de forma segura no almacenamento persistente. Por exemplo, un comando cp simple pode devolver éxito en canto os datos chegan á caché de páxinas do SO no servidor de destino. Se o servidor de destino perde a enerxía antes de que a caché se descargue no disco, o ficheiro WAL pérdese, pero PostgreSQL xa eliminou a súa copia local.

O risco: Unha cadea WAL rota e a incapacidade de realizar PITR, descuberta só durante un escenario de recuperación ante desastres.

A mitigación: Asegúrese de que o seu script de arquivado aplique escrituras síncronas. Se usa comandos de shell estándar, utilice ferramentas que garantan que os datos se descarguen, ou escriba un script envolvente que verifique o tamaño do ficheiro e a suma de comprobación tras a transferencia.

Trampa 2: Esgotamento da partición pg_wal (WAL Bloat)

Se o archive_command falla (devolve un código de saída distinto de cero)—debido a cortes de rede, permisos incorrectos ou un disco de destino cheo—PostgreSQL retendrá o ficheiro WAL no directorio pg_wal e reintentará o comando indefinidamente.

Aínda que isto evita a perda de datos ao non eliminar os WAL non arquivados, introduce un grave risco de dispoñibilidade. Se o directorio pg_wal reside nunha partición que se enche ao 100%, PostgreSQL emitirá un PANIC e bloquearase. A base de datos non volverá iniciar ata que se libere espazo.

O risco: Tempo de inactividade completo da base de datos debido a unha partición pg_wal chea.

A mitigación:
1. Coloque sempre pg_wal nunha partición de disco dedicada.
2. Implemente unha monitorización agresiva do tamaño do directorio pg_wal.
3. Monitorice a vista pg_stat_archiver para detectar comandos de arquivo que fallan inmediatamente.

Trampa 3: Copias de seguridade base incompletas

Unha copia de seguridade base é inútil sen os ficheiros WAL xerados durante o proceso de copia de seguridade. Se realiza unha instantánea a nivel de sistema de ficheiros ou usa pg_basebackup sen transmitir os WAL (-X stream), debe asegurarse de que os ficheiros WAL xerados entre o inicio e o final da copia de seguridade se arquiven correctamente.

Se o seu arquivador ten atrasos ou falla, e eses ficheiros WAL específicos pérdense, a copia de seguridade base non se pode levar a un estado consistente.

O risco: Copias de seguridade base corrompidas ou irrecuperables.

A mitigación: Use pg_basebackup -X stream para incluír os ficheiros WAL necesarios dentro da propia carga útil da copia de seguridade, ou utilice solucións de copia de seguridade empresariais que xestionen automaticamente a dependencia entre as copias de seguridade base e os segmentos WAL.

Trampa 4: Confusión de liñas temporais e escenarios de “split-brain”

Cando un servidor en espera (standby) é promovido a primario, PostgreSQL incrementa o “ID da liña temporal” (a primeira parte do nome do ficheiro WAL, p. ex., 0000000200000001000000A4). Isto evita que o novo primario sobrescriba o historial WAL do antigo primario.

Non obstante, se o antigo primario se inicia accidentalmente sen estar debidamente illado (un escenario de “split-brain”), pode intentar enviar ficheiros WAL á mesma localización de arquivo usando a antiga liña temporal. Se o seu archive_command sobrescribe ficheiros cegamente, podería corromper o seu repositorio de arquivos.

O risco: Ficheiros WAL sobrescritos, arquivos corrompidos e bases de datos irrecuperables.

A mitigación: O seu archive_command nunca debe sobrescribir un ficheiro existente. Observe na configuración básica anterior que usamos test ! -f /mnt/nfs/archive/%f para fallar explicitamente se o ficheiro xa existe.

Mitigando os riscos de perda de datos: Mellores prácticas de produción

Para fortalecer a súa estratexia de arquivado de PostgreSQL, implemente as seguintes mellores prácticas.

1. Monitorice o proceso de arquivado de forma nativa

PostgreSQL ofrece unha vista integrada, pg_stat_archiver, que rastrexa o éxito e o fallo do seu proceso de arquivado. Debe integrar esta vista na súa pila de observabilidade (p. ex., Prometheus, Datadog ou Zabbix).

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

Limiares de alerta a configurar:
* Alerta se failed_count aumenta.
* Alerta se a diferenza de tempo entre now() e last_archived_time supera o seu limiar de RPO (p. ex., 15 minutos), tendo en conta que as bases de datos de baixo tráfico poden ter atrasos naturalmente a menos que se configure archive_timeout.

2. Aproveite archive_timeout

En bases de datos con baixo volume de escritura, un ficheiro WAL de 16 MB pode tardar horas en encherse. Ata que se enche, non se arquiva. Se o servidor falla e o disco local se perde, perde horas de transaccións.

Configurar archive_timeout = 600 (10 minutos) forza a PostgreSQL a cambiar a un novo ficheiro WAL e arquivar o actual, mesmo se non está cheo. Isto garante que o seu RPO non supere os 10 minutos, a costa dun uso de almacenamento lixeiramente maior debido aos ficheiros WAL parcialmente cheos.

3. Transición a archive_library (PostgreSQL 15+)

Historicamente, archive_command xeraba un novo proceso de shell para cada ficheiro WAL. En contornas de alto rendemento que xeran centos de ficheiros WAL por minuto, a sobrecarga de crear procesos de shell convértese nun pescozo de botella de rendemento.

PostgreSQL 15 introduciu o parámetro archive_library, permitindo que o arquivado de WAL sexa xestionado por módulos C cargados dinámicamente. Isto elimina a sobrecarga de creación de shell e proporciona un mecanismo de arquivado moito máis robusto e de alto rendemento. Se está en PostgreSQL 15 ou superior, busque ferramentas de copia de seguridade que admitan módulos de arquivo personalizados.

4. Probe regularmente a recuperación puntual (PITR)

Unha copia de seguridade non probada non é unha copia de seguridade; é un desexo. A única forma de verificar que o seu arquivado de WAL funciona correctamente, que a súa cadea WAL está ininterrompida e que as súas copias de seguridade base son consistentes, é realizar probas de PITR rutineiras e automatizadas.

Inicie unha instancia temporal, restaure a copia de seguridade base, configure restore_command para extraer do seu arquivo e recupere ata unha marca de tempo específica. Verifique que a base de datos alcanza un estado consistente e se abre para conexións.

Copia de seguridade e recuperación empresarial con CloudSave

Xestionar scripts de shell personalizados para archive_command, manexar a deduplicación de WAL e garantir un almacenamento seguro fóra do sitio para os rexistros de transaccións pode converterse rapidamente nunha carga operativa para os equipos de TI.

Aquí é onde CloudSave achega un valor significativo para as contornas empresariais de PostgreSQL. CloudSave intégrase directamente coas APIs nativas de copia de seguridade e arquivado de WAL de PostgreSQL para eliminar as trampas manuais discutidas anteriormente.

En lugar de escribir scripts bash fráxiles, CloudSave ofrece unha integración robusta, baseada en axentes ou sen axentes, que:
* Garante a entrega: Substitúe os comandos de shell estándar por transferencias verificadas e validadas por suma de comprobación a un almacenamento seguro fóra do sitio ou na nube.
* Evita o “WAL Bloat”: Monitoriza activamente o directorio pg_wal e alerta aos administradores moito antes de que se produza o esgotamento da partición.
* Automatiza o PITR: Simplifica a recuperación puntual a través dunha interface intuitiva. Selecciona o minuto exacto ao que quere recuperar, e CloudSave recupera automaticamente a copia de seguridade base correcta e transmite a secuencia exacta de ficheiros WAL necesarios para alcanzar ese estado.
* Xestiona liñas temporais: Xestiona de forma intelixente os historiais de liñas temporais de PostgreSQL, garantindo que as conmutacións por erro e os escenarios de “split-brain” non corrompan o seu repositorio de copias de seguridade.

Ao descargar o traballo pesado da xestión de WAL en CloudSave, os DBAs poden centrarse na optimización de consultas e no rendemento da base de datos, sabendo que os seus SLA de RPO e RTO están protexidos por unha plataforma de nivel empresarial.

Conclusión

O arquivado de WAL de PostgreSQL é a columna vertebral da recuperación ante desastres da base de datos. Aínda que o concepto de copiar un ficheiro dun directorio a outro parece sinxelo, os casos límite—fallos silenciosos, esgotamento do disco e diverxencia de liñas temporais—supoñen riscos graves para a integridade dos datos.

Ao comprender a arquitectura de pg_wal, evitar estritamente as configuracións destrutivas de archive_command, monitorizar pg_stat_archiver e aproveitar plataformas de copia de seguridade empresariais como CloudSave, pode construír unha infraestrutura de PostgreSQL resiliente capaz de sobrevivir a fallos de hardware, erros humanos e interrupcións catastróficas sen perder unha soa transacción confirmada.

Descubra as trampas comúns do arquivado de WAL de PostgreSQL que levan á perda de datos. Aprenda as mellores prácticas de expertos DBAs, consellos de configuración e como garantir unha recuperación puntual (PITR) fiable para bases de datos empresariais.