Respaldo IBM Informix integrado con ON-Bar. Hot backup, dbspaces individuales, logical log streaming, PITR al log único, soporte alta-disponibilidad Continuous Log Restore (CLR).
- ON-Bar nativo — integración directa con el subsistema oficial Informix.
- Respaldo dbspace-level — backup y restore por dbspace, granularidad total.
- Logical log streaming — RPO cerca de cero.
- PITR al log único — restauración precisa.
- HDR y Enterprise Replication-aware — respaldo del secondary, cero overhead en primary.
Producción en 30 días, al menos 50% más barato. Trial gratuito, RPMs y DEBs firmados, soporte directo con Heitor Faria. Reemplace su licencia Veeam, Commvault o Bacula Enterprise sin romper la ventana nocturna.
Solicitar trial gratuito de 30 días →
🔴 AVISO COMERCIAL
Traiga su contrato o propuesta de renovación de Bacula Enterprise, Veeam, Commvault o Netbackup. Ofrecemos al menos 50% de descuento con características significativamente superiores.
Contacto: heitor@opentechs.lat | +1 786 726-1749 | +55 61 98268-4220 (WhatsApp)
Tabla de Contenidos
- Resumen Ejecutivo
- Caso de Negocio y TCO
- Descripción General de la Arquitectura
- Motores de Backup en Profundidad
- Capacidades de Replicación
- Características Avanzadas
- Seguridad y Cumplimiento
- Observabilidad
- Guía de Instalación
- Referencia de Configuración
- Procedimientos de Restauración y Casos de Uso
- Informes de Rendimiento
- Matriz de Compatibilidad
- Guía de Dimensionamiento
- Integración con Bacularis
- Migración desde TSM/ISP y ON-Bar PSM
- Resolución de Problemas
- Roadmap
- Evidencias de Validación (Resultados E2E)
1. Resumen Ejecutivo
El Plugin PodHeitor de Backup, Replicación y Conversión de Informix para Bacula es un plugin de nivel comercial y listo para entornos empresariales para HCL Informix Dynamic Server (IDS) 12.10 a 15.0, construido de forma nativa para PodHeitor Backup+. Escrito completamente en Rust, ofrece una sobrecarga de ejecución cercana a cero, seguridad de memoria y un diseño orientado al paralelismo — todo en un único paquete binario firmado que se instala en minutos.
La Brecha que Cubre
Bacula Enterprise no tiene un plugin dedicado para Informix. El catálogo de bases de datos Enterprise incluye DB2, MSSQL, MySQL, Oracle, PostgreSQL, Sybase y Amazon RDS — pero no Informix. Las organizaciones que ejecutan IDS hoy se ven obligadas a elegir entre el costoso IBM Spectrum Protect (TSM), scripts manuales de bpipe+ontape sin PITR ni seguridad de cadena, o el PSM de HCL que genera doble I/O en disco.
PodHeitor Informix es el primer plugin Informix nativo para Bacula, con soporte XBSA y basado en Rust disponible en el mercado.
Principales Diferenciadores
| Capacidad | Scripts manuales | TSM/PSM + Bacula | PodHeitor Informix |
|---|---|---|---|
| Costo | Gratuito, mantenimiento elevado | Muy costoso | Licencia única, sin tarifas por base de datos |
| XBSA nativo | No | Solo TSM | Sí — libpodheitor_xbsa.so |
| Paralelismo | Ninguno | Limitado | N stripes × M dbspaces |
| PITR | Manual | Sí | Envío continuo y automatizado de log lógico |
| Restauración de tabla individual | Ninguna | archecker manual | Integrado — mode=table_level |
| Conversión entre versiones | Arriesgada | No | mode=logical_dbexport de primera clase |
| Bootstrap HDR/RSS/SDS/ER | Horas de trabajo manual | Horas de trabajo manual | Un comando bconsole |
| Recuperación instantánea | No | No | IDS en línea en < 60 s via FUSE |
| Protección contra ransomware | No | No | ARD hook (IDS 14.10+) |
| Observabilidad | Ninguna | Dashboard TSM | Prometheus + OTLP |
| Nativo para Bacula | Parcial (bpipe) | Dos capas | XBSA directo + streaming |
Estado de Validación
E2E Lab (2026-04-29): PASS=22 FAIL=0 SKIP=0 TOTAL=22
Pruebas unitarias: PASS=80 FAIL=0
Los 22 escenarios end-to-end activos y aprobados en un laboratorio de 4 VMs (IDS primario, secundario HDR, secundario RSS, host de snapshot) con IDS 15.0.1.0.3 Developer Edition y PodHeitor Backup.
2. Caso de Negocio y TCO
2.1 Comparación de Costos (Anual, entorno Informix de 10 TB)
| Solución | Licencia | Infraestructura | Operacional | Total |
|---|---|---|---|---|
| IBM Spectrum Protect | ~US$ 80.000/año | Servidor TSM separado | DBA + administrador TSM (FTE) | ~US$ 140.000/año |
| Bacula Enterprise + scripts manuales | ~US$ 30.000/año | Ninguna | DBA FTE (scripts) | ~US$ 70.000/año |
| Veeam Enterprise (módulo DB) | ~US$ 25.000/año | Ninguna | Administrador FTE | ~US$ 55.000/año |
| PodHeitor Informix + PodHeitor Backup | Tarifa única | Infraestructura Bacula existente | Mínimo | < US$ 10.000 en total |
Contáctenos en heitor@opentechs.lat para precios. Ofrecemos al menos 50% de descuento en cualquier renovación de la competencia.
2.2 Reducción de Riesgos
| Riesgo | Sin PodHeitor | Con PodHeitor |
|---|---|---|
| Corrupción de la cadena de backup | Silenciosa — detectada en el momento de la restauración | Detectada de inmediato via chain_health_check + archecker |
| Cifrado por ransomware antes del backup | El backup captura datos cifrados | ARD hook aborta el backup ante una anomalía |
| Brecha en la recuperación point-in-time | Gestión manual de archivos de log lógico | Daemon de envío continuo de log lógico, RPO inferior a un minuto |
| Fallo en el bootstrap del secundario HDR | Horas de trabajo manual + riesgo de interrupción | Bootstrap automatizado con un único comando |
| Riesgo en la actualización entre versiones | dbexport/dbimport manual + tiempo de inactividad | mode=logical_dbexport en streaming, probado en E2E |
| DR de bare-metal (pérdida total del servidor) | Requiere reconstrucción manual de onconfig/sqlhosts | RestoreObject captura todos los metadatos automáticamente |
2.3 Ejemplo de Cálculo de ROI
Una institución financiera mediana ejecutando Informix 14.10 en 5 servidores, con backups diarios y un requisito de RTO de 4 horas:
- Licencia TSM + infraestructura: ~US$ 60.000/año
- Un incidente de recuperación de 4h × 3 DBAs: ~US$ 3.600 por incidente
- Migración a PodHeitor: costo único + PodHeitor Backup (gratuito)
- Período de recuperación de inversión: < 3 meses
3. Descripción General de la Arquitectura
3.1 Diagrama de Componentes
┌─────────────────────────────────────────────────────────────────────┐
│ Bacula Director 15.0.3 │
│ Job scheduler, catalog, pool management │
└──────────────────────────────┬──────────────────────────────────────┘
│ TCP/TLS PTCOMM
▼
┌─────────────────────────────────────────────────────────────────────┐
│ Bacula File Daemon (bacula-fd) │
│ │
│ Loads: podheitor-informix-fd.so │
│ ├── PLUGIN_PREFIX = "podheitor-informix:" │
│ ├── Namespace = "@informix/" │
│ ├── 64 backup parameters + 33 restore parameters │
│ └── PTCOMM binary protocol (streams D-packets to Director) │
└──────────────────────────────┬──────────────────────────────────────┘
│ Unix socket / stdin-stdout PTCOMM
▼
┌─────────────────────────────────────────────────────────────────────┐
│ podheitor-informix-backend (Rust static binary) │
│ │
│ ┌─── Engine Layer (mode=) ──────────────────────────────────────┐ │
│ │ xbsa onbar_psm ontape logical_dbexport │ │
│ │ (libxbsa.so) (FIFO drain) (STDIO) (dbexport stream) │ │
│ │ snapshot replicate_hdr replicate_rss replicate_er │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ ┌─── XBSA Library (libpodheitor_xbsa.so) ──────────────────────┐ │
│ │ BSAInit / BSABeginTxn / BSACreateObject / BSASendData │ │
│ │ BSAEndTxn / BSATerminate / BSAGetData / BSAQueryObject │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ ┌─── Daemon de Envío de Log Lógico ─────────────────────────────┐ │
│ │ Consulta sysmaster:syslogs cada N segundos │ │
│ │ Envía logs cerrados via PTCOMM — RPO inferior a un minuto │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ ┌─── Observabilidad ─────────────────────────────────────────────┐ │
│ │ Prometheus /metrics OpenTelemetry OTLP traces │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ ┌─── Seguridad ──────────────────────────────────────────────────┐ │
│ │ Captura/restauración DBCRYPT ARD ransomware hook Redacción│ │
│ └──────────────────────────────────────────────────────────────┘ │
└──────────────────────────────┬──────────────────────────────────────┘
│ XBSA ABI / pipes / sockets / SQL
▼
┌─────────────────────────────────────────────────────────────────────┐
│ HCL Informix Dynamic Server (12.10.FC12+ / 14.10 / 15.0) │
│ + sysmaster (bar_action, bar_object, syslogs, sysshmvals) │
│ + ON-Bar (onbar) + archecker + oncheck │
│ + topología de replicación HDR / RSS / SDS / ER │
│ + DBCRYPT keystore │
└─────────────────────────────────────────────────────────────────────┘
3.2 Flujo de Datos — Modo XBSA (Preferido)
ON-Bar invocado por el plugin
│
│ dlopen(libpodheitor_xbsa.so)
▼
libpodheitor_xbsa.so ──Unix socket──► podheitor-informix-backend
│ │
│ BSACreateObject(dbspace) │ compresión (zstd/lz4)
│ BSASendData(blocks) │ N streams PTCOMM en stripe
│ │ cálculo SHA-256
│ │ escritura de sidecar manifest
▼ ▼
BSAEndTxn Bacula Storage Daemon
(File, Tape, S3, Dedup)
3.3 Espacio de Nombres del Volumen de Backup
/@informix/<INSTANCE_UUID>/
├── __ph_manifest.json # manifest canónico del job (LSN, SHA256, lista de dbspace)
├── __ph_topology.json # snapshot de topología HDR/RSS/SDS/ER
├── __ph_dbcrypt.json # referencia del keystore cifrado (sin clave en texto plano)
├── __ph_layout.json # mapeo dbspace → chunk path
├── restoreobjects/
│ ├── onconfig
│ ├── sqlhosts
│ └── ixbar.<servernum> # archivo de arranque de emergencia de ON-Bar
├── dbspace/<name>/
│ ├── L0.<jobid>.s<N>.zst # stripe N nivel 0 (frame ZSTD)
│ ├── L1.<jobid>.s<N>.zst
│ └── manifest.<jobid>.json # LSN + SHA256 por dbspace
├── logs/
│ ├── log.<unique_id>.<lsn>.zst
│ └── continuous/<YYYY>/<MM>/<DD>/
└── logical/
├── dbexport.<db>.<jobid>.tar.zst
└── schema.<db>.<jobid>.sql
4. Motores de Backup en Profundidad
4.1 Modo xbsa — XBSA Nativo (Predeterminado en mode=auto)
El diferenciador estratégico. libpodheitor_xbsa.so implementa el ABI C completo de IBM XBSA, construido en Rust con memory-safety nativo. ON-Bar lo carga via BAR_BSALIB_PATH, convirtiendo a Bacula en un gestor de almacenamiento Informix de primera clase — sin staging, sin doble I/O, sin manipulación de FIFO.
Ventajas sobre todas las alternativas:
- El paralelismo nativo de ON-Bar (
BAR_MAX_BACKUP) se mapea 1:1 a streams PTCOMM - Acceso completo al catálogo de ON-Bar (
sysmaster:bar_action,bar_object) para captura de LSN - Soporte para verificación post-backup de archecker a través del registro estándar de ON-Bar
- Cero bytes escritos en el disco local del host FD (directorio de trabajo < 50 MB)
Funciones XBSA implementadas: BSAInit, BSABeginTxn, BSACreateObject, BSASendData, BSAEndTxn, BSATerminate, BSAGetData, BSAQueryObject, BSAEndData, BSADeleteObject
4.2 Modo onbar_psm — Fallback PSM
ON-Bar escribe en el HCL Primary Storage Manager (PSM) apuntando a un named pipe. El backend drena el pipe → PTCOMM. Se usa cuando la política de la organización prohíbe cargar bibliotecas XBSA de terceros.
4.3 Modo ontape — Legado/Simple
ontape -s -t STDIO -L 0|1|2. Solo servidor completo; sin granularidad por dbspace. Para desarrollo, instancias pequeñas o entornos sin ON-Bar configurado. Validado en E2E T16.
4.4 Modo logical_dbexport — Conversión Entre Versiones
dbexport <db> -ss -X -q transmitido a través de un pipeline asíncrono tar-on-the-fly → PTCOMM. La salida es un tar comprimido que contiene schema SQL + archivos de unload por tabla. Restaurable en cualquier versión de IDS con dbimport. Uso principal: migración de versión principal (12.10 → 14.10 → 15.0). Validado en E2E T12.
4.5 Modo snapshot — Quiesce LVM/ZFS
- Checkpoint
onmode -c - Pone los dbspaces en modo de backup (
BAR_BLOCK_BACKUP=1) - LVM
lvcreate --snapshot/ ZFSzfs snapshot - Libera el modo de backup — ventana de quiesce < 1 segundo
- Transmite bloques del snapshot via PTCOMM (chunking por contenido para dedup)
- Captura logs lógicos archivados via
onbar -b -l
Validado en E2E T13 usando LVM VG con loop-backed (ifxvg/ifxdata).
4.6 Mapeo de Nivel de Backup
| Nivel Bacula | Nivel ON-Bar | Comportamiento del Plugin |
|---|---|---|
| Full | onbar -b -L 0 |
Línea base nivel 0 del servidor completo. El manifest captura BAR_VERSION, INSTANCE_UUID, lista completa de dbspace, LSN. |
| Differential | onbar -b -L 1 |
Acumulativo desde L0. Promueve automáticamente a Full si chain_health_check detecta cadena rota. |
| Incremental | onbar -b -L 2 O solo log lógico |
Predeterminado: level_incr=logical_log para RPO inferior a un minuto. Envía solo archivos de log lógico recién cerrados. |
| VirtualFull | (sintético) | El plugin fusiona la cadena L0+L1+L2 en un nuevo stream L0 consumido por la consolidación de Bacula. |
5. Capacidades de Replicación
5.1 Bootstrap HDR (High-Availability Data Replication)
Problema: Configurar un secundario HDR hoy requiere onmode -d primary, onmode -d secondary manuales, configuración de red personalizada, frecuentemente horas de trabajo del DBA.
Solución PodHeitor: Un único job de restauración con mode=ag_seed ag_target_role=hdr_secondary:
- Restaura la cadena de backup más reciente en el destino con equivalente a
WITH NORECOVERY - Ajusta
DRAUTO/DRINTERVAL/DRTIMEOUTen el destino - Ejecuta
onmode -d primary <target_servernum>en el primario - Ejecuta
onmode -d secondary <primary_servernum>en el destino - Valida que el secundario alcance el estado
On-Line (Sec)
Validado en E2E T10 y T14.
5.2 Bootstrap RSS (Remote Standalone Secondary)
Mismo flujo con ag_target_role=rss. Usa onmode -d add RSS <name> en el primario + onmode -d RSS <primary_name> en el destino. Validado en E2E T11.
5.3 Attach SDS (Shared Disk Secondary)
Valida la topología de disco compartido, adjunta nuevo SDS via onmode -d set SDS PRIMARY <primary_name>.
5.4 Snapshot/Restauración de Topología Enterprise Replication (ER)
__ph_topology.json captura la malla ER completa: servidores, replicates, grids, suscripciones. En la restauración, cdr define server + cdr define replicate + cdr start replicate reconstituye la topología. Esencial para DR cuando toda la malla ER debe ser reconstruida.
5.5 Backup desde el Secundario (Descarga del Primario)
Plugin = "podheitor-informix: prefer_secondary_for_backup=yes hdr_role_check=secondary"
El plugin detecta el par HDR, se conecta al secundario y ejecuta ON-Bar allí. La CPU/I/O del primario permanece completamente sin impacto durante la ventana de backup.
6. Características Avanzadas
6.1 Envío Continuo de Log Lógico (RPO Inferior a Un Minuto)
Cuando continuous_log=yes, el backend crea un hilo daemon que:
- Consulta
sysmaster:syslogscadacontinuous_log_intervalsegundos (predeterminado: 60s, mínimo: 5s) - Detecta archivos de log lógico recién cerrados (estado
U → B) - Envía cada log atómicamente via un micro-job PTCOMM con verificación de integridad SHA-256
- Detecta y alerta sobre brechas en la secuencia de log lógico
RPO alcanzado: < 1 minuto en laboratorio; < 5 segundos con continuous_log_interval=5.
Validado en E2E T09-F (base) + T09-I (continuo).
6.2 Recuperación Point-in-Time (PITR)
podheitor-informix: mode=whole_server stop_at_time="2026-04-28 14:30:00"
point_in_time_tz=America/Sao_Paulo
Opciones:
stop_at_lsn=<N>— detiene la reproducción del log lógico en un LSN específicostop_at_time=<datetime>— detiene en un timestampstop_before_txn=<txnid>— detiene antes de una transacción específica (para rollback dirigido)
El plugin reproduce la cadena de backup L0 → L1 → L2 → logs lógicos hasta el punto elegido, luego ejecuta onmode -m para poner la instancia en línea. Validado en E2E T05.
6.3 Recuperación Instantánea (Montaje FUSE)
podheitor-informix: mode=instant instant_fuse_mount=/var/lib/podheitor-informix/instant
- Restaura encabezados de chunk y página 0 de cada dbspace
- El sistema de archivos FUSE presenta archivos de chunk virtuales respaldados por datos Bacula transmitidos de forma lazy
- IDS arranca via
oninit -PHYcontra los chunks montados via FUSE - Instancia consultable en < 60 segundos
- Los bloques restantes se transmiten en lazy en segundo plano mientras IDS atiende consultas
Caso de uso: continuidad inmediata del negocio mientras la restauración completa continúa en segundo plano. Validado en E2E T17 usando /dev/loop-control + /dev/fuse en la VM 189.
6.4 Extracción de Tabla Individual
podheitor-informix: mode=table_level table=app_db.dbo.orders
sandbox_docker_image=icr.io/informix/informix-developer-database:latest
single_item_export_dir=/tmp/restored
- Inicia un contenedor Podman/Docker Developer Edition efímero
- Restaura la cadena de backup completa en el sandbox
- Reproduce hasta el punto de tiempo solicitado
- Ejecuta
dbexport/unloadpara la tabla de destino - Copia la salida a
single_item_export_dir - Destruye el contenedor sandbox
Resultado: Tabla de destino extraída en < 5 min desde un backup de 100 GB, sin impacto en producción. Validado en E2E T07.
6.5 Aplicación de la Integridad de la Cadena
Por defecto (chain_health_check=yes), antes de cada Differential o Incremental:
- El plugin consulta
sysmaster:bar_actionpara el LSN del nivel 0 precedente - Valida la cadena de manifest (SHA-256 de cada sidecar)
- Compara con el historial de jobs del catálogo Bacula
Si la cadena está rota (job faltante, brecha de LSN, discrepancia de SHA), el job aborta antes de escribir cualquier dato, evitando un backup de falsa confianza. Los operadores son notificados con un error claro que explica la brecha.
6.6 Virtual Full (Full Sintético)
virtual_full=yes activa una fusión de cadena en el lado del servidor: el plugin lee los streams L0+L1+L2 de Bacula, los fusiona en un nuevo stream L0 que Bacula ingiere como un nuevo backup Full. Elimina cadenas largas de restauración (sin necesidad de aplicar Diff+Incr en la restauración) evitando otro backup completo desde el host IDS.
6.7 Recuperación de Desastre Bare-Metal
Cada backup captura automáticamente un RestoreObject que contiene:
onconfig(archivo ONCONFIG)sqlhosts(definiciones de conectividad)ixbar.<servernum>(archivo de arranque de emergencia de ON-Bar)
Al restaurar en un host nuevo sin instalación previa de IDS:
- Bacula restaura el RestoreObject primero
- El plugin reconstruye la estructura de directorios de IDS
- Ejecuta la inicialización estándar de
oninit - Restaura chunks y reproduce logs lógicos
No se requiere intervención manual del DBA. Validado en E2E T18.
7. Seguridad y Cumplimiento
7.1 Controles de Seguridad
| Superficie | Control | Predeterminado |
|---|---|---|
| Configuración del plugin | Ruta del passfile verificada para chmod 600; el backend aborta si es más permisivo |
Aplicado |
| Cadenas de conexión en logs | Redacción por regex de secretos en toda la salida del logger PTCOMM | redact_sysuser_passwords=yes |
| DBCRYPT keystore | Solo blob cifrado (puntero de hash) almacenado en __ph_dbcrypt.json; la clave en texto plano NUNCA se registra ni almacena |
dbcrypt_capture=yes |
| Ruta de carga de la biblioteca XBSA | Verificada contra /opt/podheitor-informix/lib/; LD_PRELOAD rechazado |
Aplicado |
| Directorio de trabajo | /var/run/podheitor-informix modo 0700 propiedad de informix |
Aplicado |
| Contenedor sandbox | Efímero, root --read-only + tmpfs; eliminado tras la extracción |
Aplicado |
| Montaje FUSE | Solo lectura; montado como informix:informix modo 0700 |
Aplicado |
| Códigos de salida de ON-Bar | Código distinto de cero genera fallo en el job | chain_health_check=yes |
| IDs de correlación | Todos los mensajes PTCOMM registrados con estructura con el JobId de Bacula | Siempre |
7.2 Soporte a DBCRYPT
La característica DBCRYPT de Informix cifra datos en reposo a nivel del motor de almacenamiento. PodHeitor:
- Captura los metadatos del keystore (no la clave) en
__ph_dbcrypt.json - Registra el label/alias de la clave para invocar el hook en la restauración
- En la restauración, invoca el hook de passphrase de DBCRYPT antes de
oninit - Resultado: las bases de datos cifradas en reposo hacen backup y restauración sin gestión manual de claves
Validado en E2E T15.
7.3 ARD Ransomware Hook
Cuando ransomware_hook=yes, el plugin ejecuta onstat -g ARD antes del backup y verifica:
- Anomalías de entropía en bloques de log lógico escritos recientemente
- Aumento repentino en las tasas de UPDATE/DELETE (Active Ransomware Detection, IDS 14.10+)
Si se detecta una anomalía, el backup aborta con una advertencia clara, impidiendo que el estado cifrado por ransomware sobrescriba un backup limpio.
7.4 Lista de Verificación de Endurecimiento de Permisos de Archivo
# Verificar permisos correctos tras la instalación
ls -la /opt/bacula/plugins/podheitor-informix-fd.so # -rwxr-xr-x root root
ls -la /opt/bacula/plugins/podheitor-informix-backend # -rwxr-x--- root informix
ls -la /opt/podheitor-informix/lib/libpodheitor_xbsa.so # -rwxr-x--- root informix
ls -la /opt/bacula/etc/podheitor-informix.conf # -rw------- informix informix
ls -la /var/run/podheitor-informix/ # drwx------ informix informix
8. Observabilidad
8.1 Métricas Prometheus
Cuando metrics_endpoint=localhost:9100 está configurado, el plugin expone un endpoint estándar Prometheus /metrics.
| Métrica | Tipo | Descripción |
|---|---|---|
podheitor_ifx_job_bytes_total |
Counter | Total de bytes transferidos en este job |
podheitor_ifx_job_throughput_bytes_sec |
Gauge | Tasa de transferencia actual |
podheitor_ifx_dbspace_progress_pct |
Gauge | Porcentaje de finalización por dbspace |
podheitor_ifx_logship_lag_seconds |
Gauge | Retraso en el envío de log lógico (modo continuous_log) |
podheitor_ifx_onbar_exit_code |
Gauge | Código de salida de la última invocación de ON-Bar |
podheitor_ifx_archecker_pass |
Gauge | 1=aprobado, 0=fallido (última ejecución de archecker) |
podheitor_ifx_queue_depth |
Gauge | Profundidad de la cola write-ahead de PTCOMM |
podheitor_ifx_active_stripes |
Gauge | Número actual de streams PTCOMM activos |
podheitor_ifx_xbsa_buffer_pool_used |
Gauge | Utilización del pool de buffers XBSA (bytes) |
Ejemplo de consulta Grafana para throughput:
rate(podheitor_ifx_job_bytes_total[1m])
Ejemplo de consulta Grafana para alerta de retraso en el envío de log lógico:
podheitor_ifx_logship_lag_seconds > 300
8.2 Trazas OpenTelemetry OTLP
Cuando otel_endpoint=http://collector:4317 está configurado, el plugin emite spans estructurados a un colector compatible con OTLP (Jaeger, Tempo, Honeycomb, etc.).
Jerarquía de spans:
backup.job (job_id=NNNNN, instance=ifxprod)
├── engine.xbsa.init
├── dbspace.rootdbs.backup (level=0)
│ ├── stripe.0.compress
│ └── stripe.0.ptcomm_write
├── dbspace.app_data.backup (level=0)
├── manifest.write
├── archecker.verify
└── topology.snapshot
9. Guía de Instalación
9.1 Requisitos Previos
Host del Bacula File Daemon (co-ubicado con IDS):
- SO: OL9/RHEL 8/9/Rocky 8/9/AlmaLinux 8/9, Ubuntu 20.04/22.04/24.04, Debian 11/12, SLES 15
- PodHeitor Backup FD 15.0.3+
- HCL Informix 12.10.FC12+ / 14.10.FCx / 15.0.x instalado
- Usuario/grupo
informixcon privilegios IDS estándar - Para
mode=snapshot: LVM o ZFS en los dispositivos dbspace,losetup+lvcreatedisponibles - Para
mode=instant:/dev/fuse+/dev/loop-controlaccesibles - Para
mode=table_level: Podman o Docker instalado
Bacula Director:
- Director 15.0.x con las definiciones de FileSet y Job (ver §10)
9.2 Instalación en EL8/EL9 (RPM)
# Descargue el RPM desde releases/
rpm -ivh podheitor-informix-plugin-0.1.0-1.el9.x86_64.rpm
# Verificar instalación
ls /opt/bacula/plugins/podheitor-informix-fd.so
ls /opt/bacula/plugins/podheitor-informix-backend
ls /opt/podheitor-informix/lib/libpodheitor_xbsa.so
ls /opt/bacula/etc/podheitor-informix.conf.sample
9.3 Instalación en Ubuntu 22.04 / Debian 12 (DEB)
# Descargue el DEB desde releases/
dpkg -i podheitor-informix-plugin_0.1.0-1_amd64.deb
# Verificar
dpkg -L podheitor-informix-plugin
9.4 Configurar el Plugin
# Copiar y editar la configuración de ejemplo
cp /opt/bacula/etc/podheitor-informix.conf.sample
/opt/bacula/etc/podheitor-informix.conf
chmod 600 /opt/bacula/etc/podheitor-informix.conf
chown informix:informix /opt/bacula/etc/podheitor-informix.conf
vi /opt/bacula/etc/podheitor-informix.conf
Configuraciones mínimas requeridas:
[connection]
informixdir = "/opt/ibm/informix"
informixserver = "ifxprod"
onconfig = "onconfig.std"
[engine]
mode = "auto" # xbsa si onbar está disponible, de lo contrario ontape
compress = "zstd"
compress_level = 3
9.5 Configurar el Entorno BAR
# /etc/sysconfig/podheitor-informix (leído por onbar y el backend)
cat > /etc/sysconfig/podheitor-informix << 'EOF'
INFORMIXDIR=/opt/ibm/informix
INFORMIXSERVER=ifxprod
ONCONFIG=onconfig.std
INFORMIXSQLHOSTS=/opt/ibm/informix/etc/sqlhosts
PATH=/opt/ibm/informix/bin:$PATH
BAR_BSALIB_PATH=/opt/podheitor-informix/lib/libpodheitor_xbsa.so
BAR_MAX_BACKUP=4
BAR_XFER_BUF_SIZE=1048576
BAR_NB_XPORT_COUNT=10
EOF
chmod 640 /etc/sysconfig/podheitor-informix
chown root:informix /etc/sysconfig/podheitor-informix
9.6 Verificación Preflight
/opt/bacula/plugins/podheitor-informix-backend --dry-run
/opt/bacula/etc/podheitor-informix.conf
Salida esperada:
[INFO] PodHeitor Informix v0.1.0 — preflight check
[INFO] IDS version: 15.0.1.0.3
[INFO] ON-Bar available: yes
[INFO] archecker available: yes
[INFO] XBSA library: /opt/podheitor-informix/lib/libpodheitor_xbsa.so [OK]
[INFO] BAR_BSALIB_PATH configured: yes
[INFO] Working dir: /var/run/podheitor-informix [created, mode 0700]
[INFO] Connectivity: ifxprod@localhost:9088 [OK]
[INFO] DRY-RUN COMPLETE — all checks passed
9.7 Reiniciar bacula-fd
systemctl restart bacula-fd
journalctl -u bacula-fd -n 50 | grep -i podheitor
# Esperado: "Loaded plugin: podheitor-informix v0.1.0"
10. Referencia de Configuración
10.1 Opciones de Backup
| # | Parámetro | Predeterminado | Tipo | Descripción |
|---|---|---|---|---|
| Conexión | ||||
| 1 | informixdir |
$INFORMIXDIR |
ruta | Directorio de instalación de IDS |
| 2 | informixserver |
$INFORMIXSERVER |
string | Nombre del servidor (entrada sqlhosts) |
| 3 | onconfig |
$ONCONFIG |
archivo | Override del archivo onconfig |
| 4 | sqlhosts |
$INFORMIXSQLHOSTS |
archivo | Override del archivo sqlhosts |
| 5 | user |
informix |
string | Usuario del SO para ejecución |
| 6 | passfile |
— | ruta | Archivo de credenciales (chmod 600) |
| 7 | kerberos_keytab |
— | ruta | Keytab Kerberos para Trusted Context |
| Motor | ||||
| 8 | mode |
auto |
enum | `auto | xbsa | onbar_psm | ontape | logical_dbexport | snapshot | replicate_hdr | replicate_rss | replicate_sds | replicate_er` |
| Alcance | ||||
| 9 | dbspace |
* |
glob | Qué dbspaces respaldar |
| 10 | include_dbspace |
— | glob (múltiple) | Lista de inclusión explícita |
| 11 | exclude_dbspace |
tempdb* |
glob (múltiple) | Lista de exclusión |
| 12 | database |
— | glob | Filtro de BD en modo lógico |
| 13 | whole_system |
yes |
bool | Servidor completo vs por dbspace |
| 14 | include_blobspace |
yes |
bool | Blobspaces tradicionales |
| 15 | include_sbspace |
yes |
bool | Sbspaces de smart-blob |
| 16 | include_external_dbspace |
no |
bool | Dbspaces externos (solo lectura) |
| 17 | include_temp_dbspace |
no |
bool | Dbspaces temporales |
| Niveles | ||||
| 18 | level_full |
0 |
int | Mapea Bacula Full → ON-Bar nivel 0 |
| 19 | level_diff |
1 |
int | Mapea Bacula Differential → nivel 1 |
| 20 | level_incr |
logical_log |
enum | `2 | logical_log` |
| 21 | force_full_after |
7 |
int | Promoción automática a Full tras N incrementales |
| 22 | chain_health_check |
yes |
bool | Verificar cadena antes de Diff/Incr |
| 23 | simulate_full |
no |
bool | Forzar nivel 0 independiente de la solicitud de Bacula |
| 24 | copy_only |
no |
bool | Backup fuera de banda (no altera la cadena) |
| Rendimiento | ||||
| 25 | bar_max_backup |
# núcleos CPU |
int | Define BAR_MAX_BACKUP (streams ON-Bar paralelos) |
| 26 | stripes |
1 |
int | Striping en N vías por stream (1–32) |
| 27 | parallel_dbspaces |
# núcleos CPU |
int | Backups de dbspace concurrentes |
| 28 | bar_xfer_buf_size |
1048576 |
bytes | Define BAR_XFER_BUF_SIZE |
| 29 | bar_nb_xport_count |
10 |
int | Define BAR_NB_XPORT_COUNT |
| 30 | xbsa_buffer_count |
8 |
int | Profundidad del pool de buffers compartidos XBSA |
| 31 | xbsa_block_size |
65536 |
bytes | Tamaño de bloque XBSA |
| 32 | compress |
zstd |
enum | `none | zstd | lz4` |
| 33 | compress_level |
3 |
int | Nivel de compresión ZSTD (1–22) |
| 34 | lob_chunked_streaming |
yes |
bool | Chunking por contenido para LOBs sbspace |
| 35 | max_rate_kbps |
0 |
int | Limitación de ancho de banda por job (0=ilimitado) |
| 36 | cpu_quota |
0 |
pct | Cuota de CPU cgroup para el proceso backend |
| Envío de Log Lógico | ||||
| 37 | continuous_log |
no |
bool | Daemon de envío de log lógico en segundo plano |
| 38 | continuous_log_interval |
60 |
segundos | Intervalo de polling (mínimo 5) |
| 39 | continuous_log_archive_only |
yes |
bool | Se detiene tras BAR_RETRY fallos |
| 40 | salvage_logs |
no |
bool | onbar -l -s recuperación tras fallo |
| Integridad | ||||
| 41 | oncheck_pre_backup |
no |
enum | `no | ce | cI | cD` |
| 42 | oncheck_post_backup |
no |
enum | `no | ce | cI | cD` |
| 43 | archecker_verify |
yes |
bool | Ejecutar archecker tras el backup |
| 44 | manifest_sha256 |
yes |
bool | SHA256 por stream en el manifest |
| 45 | verify_lsn_chain |
yes |
bool | Verificación cruzada de LSNs sysmaster:bar_action |
| Replicación | ||||
| 46 | topology_snapshot |
yes |
bool | Snapshot de topología HDR/RSS/SDS/ER |
| 47 | er_subscribe_snapshot |
yes |
bool | Captura replicates + grids ER |
| 48 | hdr_role_check |
any |
enum | `primary | secondary | any` |
| 49 | prefer_secondary_for_backup |
no |
bool | Respaldar desde el secundario HDR |
| Seguridad | ||||
| 50 | dbcrypt_capture |
yes |
bool | Capturar metadatos del DBCRYPT keystore |
| 51 | redact_sysuser_passwords |
yes |
bool | Filtrar sysmaster:sysuser de las exportaciones |
| 52 | audit_export |
no |
bool | Incluir registro de auditoría |
| 53 | ransomware_hook |
no |
bool | Abortar ante detección de anomalía ARD |
| Observabilidad | ||||
| 54 | metrics_endpoint |
— | host:puerto | Endpoint Prometheus /metrics |
| 55 | otel_endpoint |
— | URI | Colector de trazas OTLP |
| 56 | progress_report_interval |
30 |
segundos | Cadencia del progreso en el log del job |
| Operacional | ||||
| 57 | dry_run |
no |
bool | Solo preflight (sin escritura) |
| 58 | abort_on_chain_break |
yes |
bool | Rechazar Diff/Incr si la cadena está rota |
| 59 | working_dir |
/var/run/podheitor-informix |
ruta | Directorio FIFO + sentinel |
| 60 | config_file |
/opt/bacula/etc/podheitor-informix.conf |
ruta | Config TOML externa |
| 61 | cluster_id |
— | string | Separador de espacio de nombres multi-cluster |
| 62 | bar_ixbar_path |
$INFORMIXDIR/etc/ixbar.<servernum> |
ruta | Archivo de arranque de emergencia de ON-Bar |
| 63 | restore_object |
yes |
bool | Almacenar onconfig+sqlhosts+ixbar como RestoreObject |
| 64 | virtual_full |
no |
bool | Full sintético desde la cadena L0+L1+L2 |
10.2 Opciones de Restauración
| # | Parámetro | Predeterminado | Descripción |
|---|---|---|---|
| 1 | mode |
auto |
`auto | whole_server | in_place | new_instance | single_dbspace | table_level | instant | ag_seed | logical_import` |
| 2 | informixdir |
$INFORMIXDIR |
Directorio de instalación IDS de destino |
| 3 | informixserver |
(nombre de origen) | Nuevo nombre de servidor IDS |
| 4 | onconfig |
$ONCONFIG |
Archivo onconfig de destino |
| 5 | dbspace_relocation_map |
— | Archivo JSON para remapeo lógico→físico de chunk path |
| 6 | target_root_dbspace |
— | Override del chunk path del rootdbs |
| 7 | target_dbspace |
— | Destino en modo single-dbspace |
| 8 | dbspace |
* |
Qué dbspaces restaurar |
| 9 | database |
* |
Filtro de BD en modo lógico |
| 10 | table (múltiple) |
— | Tablas de destino para mode=table_level |
| 11 | column_filter |
— | Filtro opcional a nivel de columna (table_level) |
| 12 | recovery |
yes |
WITH RECOVERY (sí) vs NORECOVERY (para seed HDR) |
| 13 | stop_at_lsn |
— | Detiene la reproducción del log lógico en el LSN |
| 14 | stop_at_time |
— | Detiene la reproducción del log lógico en el timestamp |
| 15 | stop_before_txn |
— | Detiene antes de una transacción específica |
| 16 | point_in_time_tz |
UTC |
Zona horaria para stop_at_time |
| 17 | physical_only |
no |
Restaurar solo físicamente (omitir reproducción de log lógico) |
| 18 | drop_existing |
no |
`no | yes | only_if_match` |
| 19 | tail_log_before |
yes |
Recuperar logs lógicos actuales antes de restauración destructiva |
| 20 | verify_post |
archecker |
`no | oncheck | archecker | both` |
| 21 | dry_run |
no |
Preflight (validar manifest + rutas, sin escritura) |
| 22 | parallel_streams |
(valor del backup) | Streams de restauración concurrentes |
| 23 | stripes |
(valor del backup) | Coincidir stripes del backup |
| 24 | parallel_dbspaces |
# núcleos CPU |
Restauraciones de dbspace concurrentes |
| 25 | instant_fuse_mount |
/var/lib/podheitor-informix/instant |
Punto de montaje FUSE para recuperación instantánea |
| 26 | sandbox_docker_image |
icr.io/informix/informix-developer-database:latest |
Imagen sandbox para table_level |
| 27 | single_item_export_dir |
/var/lib/podheitor-informix/extracted |
Salida para table_level |
| 28 | ag_target_role |
— | `hdr_secondary | rss | sds` |
| 29 | ag_primary_host |
— | Primario al que conectarse tras el seed |
| 30 | dbcrypt_keystore |
— | Override de la ubicación del DBCRYPT keystore |
| 31 | dbcrypt_passphrase_file |
— | Passphrase para keystore sellado |
| 32 | progress_report_interval |
30 |
Cadencia de progreso |
| 33 | regexwhere |
— | Reubicación estándar por regex de Bacula |
10.3 Ejemplos de FileSet
Backup básico del servidor completo (XBSA, predeterminados):
FileSet {
Name = "Informix-Full"
Include {
Options { Signature = SHA256 }
Plugin = "podheitor-informix:"
}
}
Dbspaces específicos, con stripe y verificación:
FileSet {
Name = "Informix-AppData"
Include {
Plugin = "podheitor-informix: include_dbspace=app_data include_dbspace=app_index
exclude_dbspace=tempdb* archecker_verify=yes compress=zstd
stripes=4 parallel_dbspaces=2"
}
}
Envío continuo de log lógico (RPO inferior a un minuto):
FileSet {
Name = "Informix-LogShip"
Include {
Plugin = "podheitor-informix: continuous_log=yes continuous_log_interval=30"
}
}
Migración entre versiones:
FileSet {
Name = "Informix-Export"
Include {
Plugin = "podheitor-informix: mode=logical_dbexport database=app_db"
}
}
Modo snapshot (LVM):
FileSet {
Name = "Informix-Snapshot"
Include {
Plugin = "podheitor-informix: mode=snapshot snapshot_vg=ifxvg snapshot_lv=ifxdata snapshot_size=1G"
}
}
Backup de alto rendimiento VLDB (8 stripes, 4 dbspaces paralelos):
FileSet {
Name = "Informix-VLDB"
Include {
Plugin = "podheitor-informix: stripes=8 parallel_dbspaces=4 bar_max_backup=8
bar_xfer_buf_size=4194304 compress=zstd compress_level=3"
}
}
Backup desde el secundario HDR (descarga del primario):
FileSet {
Name = "Informix-HDR-Secondary"
Include {
Plugin = "podheitor-informix: prefer_secondary_for_backup=yes hdr_role_check=secondary"
}
}
10.4 Definiciones de Job
Job {
Name = "informix-prod-full"
JobDefs = "DefaultJob"
Type = Backup
Level = Full
FileSet = "Informix-Full"
Schedule = "WeeklyFull"
Client = "ifx-prod-fd"
Storage = "DiskStorage"
Pool = "Informix-Full"
}
Job {
Name = "informix-prod-diff"
JobDefs = "DefaultJob"
Type = Backup
Level = Differential
FileSet = "Informix-Full"
Schedule = "DailyDiff"
Client = "ifx-prod-fd"
Storage = "DiskStorage"
Pool = "Informix-Diff"
}
Job {
Name = "informix-prod-logship"
JobDefs = "DefaultJob"
Type = Backup
Level = Incremental
FileSet = "Informix-LogShip"
Schedule = "Every5Min"
Client = "ifx-prod-fd"
Storage = "DiskStorage"
Pool = "Informix-Logs"
Max Run Time = 10 minutes
}
11. Procedimientos de Restauración y Casos de Uso
11.1 Restauración Completa del Servidor (In-Place)
bconsole> restore client=ifx-prod-fd
[navegar y marcar]
bconsole> mod
Plugin Options: podheitor-informix: mode=in_place drop_existing=only_if_match
tail_log_before=yes verify_post=both
bconsole> yes
11.2 Restauración a Nueva Instancia (Recuperación de Desastre)
bconsole> restore client=ifx-prod-fd where=/
Plugin Options: podheitor-informix: mode=new_instance informixserver=ifxprod-dr
dbspace_relocation_map=/etc/podheitor-informix/dr-relocation.json
verify_post=archecker
11.3 Recuperación Point-in-Time
Plugin Options: podheitor-informix: mode=whole_server
stop_at_time="2026-04-28 14:30:00"
point_in_time_tz=America/Sao_Paulo
verify_post=both
11.4 Recuperación Instantánea
Plugin Options: podheitor-informix: mode=instant
instant_fuse_mount=/var/lib/podheitor-informix/instant
Línea de tiempo esperada:
- 0–15s: restaura encabezados de chunk + página 0
- 15–60s: IDS arranca contra el montaje FUSE
- 60s+: instancia en línea, streaming lazy continúa
11.5 Extracción de Tabla Individual
Plugin Options: podheitor-informix: mode=table_level
table=app_db.dbo.orders
stop_at_time="2026-04-28 12:00:00"
sandbox_docker_image=icr.io/informix/informix-developer-database:latest
single_item_export_dir=/tmp/orders-restored
11.6 Bootstrap de Secundario HDR
Plugin Options: podheitor-informix: mode=ag_seed
ag_target_role=hdr_secondary
ag_primary_host=ifx-prod:9088
recovery=no
11.7 Migración Entre Versiones (12.10 → 15.0)
Paso 1 — backup del origen (12.10):
Plugin = "podheitor-informix: mode=logical_dbexport database=app_db"
Paso 2 — restauración en el destino 15.0:
Plugin Options: podheitor-informix: mode=logical_import informixdir=/opt/ibm/informix
informixserver=ifxprod-new database=app_db
12. Informes de Rendimiento
12.1 Benchmarks de Throughput (Lab — OL9, IDS 15.0.1, red 1 Gbps)
| Tamaño de BD | Modo | stripes | parallel_dbspaces | Throughput | Tiempo total |
|---|---|---|---|---|---|
| 10 GB | xbsa (zstd-3) | 2 | 1 | 250 MB/s | 42 s |
| 10 GB | ontape (zstd-3) | 1 | n/a | 85 MB/s | 2 min |
| 50 GB | xbsa (zstd-3) | 4 | 2 | 420 MB/s | 2 min |
| 100 GB | xbsa (zstd-3) | 4 | 4 | 440 MB/s | 4 min |
| 100 GB | snapshot (zstd-3) | 4 | 4 | 520 MB/s | 3,5 min |
12.2 Comparación de Tasa de Compresión
| Tipo de Dato | zstd-3 | zstd-9 | lz4 | none |
|---|---|---|---|---|
| OLTP (mixto) | 2,8× | 3,5× | 2,2× | 1× |
| Texto/documentos | 6,2× | 8,0× | 4,5× | 1× |
| Dbspaces del sistema IDS | 3,1× | 4,0× | 2,4× | 1× |
| BLOBs binarios | 1,05× | 1,05× | 1,02× | 1× |
Recomendación: compress=zstd compress_level=3 para la mayoría de los entornos. Use lz4 para hosts con CPU limitada; zstd compress_level=9 para reducir el costo de almacenamiento de backup.
12.3 Objetivos de RPO / RTO
| Configuración | RPO | RTO |
|---|---|---|
| Solo Full diario | 24 h | 1–4 h |
| Full semanal + Diff diario | 24 h | 30 min–2 h |
| Full semanal + Diff diario + envío de log de 5 min | < 5 min | 1–3 h |
| Envío continuo de log lógico (predeterminado) | < 1 min | 1–3 h |
| Envío continuo de log lógico (interval=5) | < 5 s | 1–3 h |
| Secundario HDR + backup nocturno | segundos | < 5 min (failover) |
| Recuperación instantánea (FUSE) | igual que el backup | < 60 s |
| Snapshot + envío de log lógico | < 30 s | 30 min–2 h |
12.4 Consumo de Memoria
Configuración predeterminada: xbsa_buffer_count=8 × xbsa_block_size=64KiB × stripes=1 × parallel_dbspaces=# núcleos
| stripes | parallel_dbspaces | Techo de memoria |
|---|---|---|
| 1 | 1 | 0,5 MB |
| 4 | 4 | 8 MB |
| 8 | 8 | 32 MB |
| 32 | 16 | 256 MB |
Consumo de disco en el host FD: < 50 MB (FIFOs + sentinels + solo manifest). Nunca se escriben archivos de staging.
13. Matriz de Compatibilidad
13.1 Matriz de Versión IDS × Característica
| Característica | IDS 12.10.FC12 | IDS 14.10 | IDS 15.0 |
|---|---|---|---|
mode=xbsa |
✅ | ✅ | ✅ |
mode=ontape |
✅ | ✅ | ✅ |
mode=onbar_psm |
✅ | ✅ | ✅ |
mode=logical_dbexport |
✅ | ✅ | ✅ |
mode=snapshot |
✅ | ✅ | ✅ |
| Envío continuo de log lógico | ✅ | ✅ | ✅ |
| PITR (stop_at_lsn) | ✅ | ✅ | ✅ |
| Bootstrap HDR | ✅ | ✅ | ✅ |
| Bootstrap RSS | ✅ | ✅ | ✅ |
| ARD ransomware hook | ❌ (< 14.10) | ✅ | ✅ |
| Captura DBCRYPT | ✅ | ✅ | ✅ |
| Virtual Full | ✅ | ✅ | ✅ |
| Recuperación instantánea (FUSE) | ✅ | ✅ | ✅ |
13.2 SO × Disponibilidad de Paquete
| SO | RPM (el9) | DEB | Notas |
|---|---|---|---|
| Oracle Linux 9 | ✅ | — | Objetivo GA principal |
| RHEL 9 / Rocky 9 / AlmaLinux 9 | ✅ | — | GA |
| RHEL 8 / Rocky 8 | ✅ | — | GA (RPM el9 compatible) |
| Ubuntu 22.04 LTS | — | ✅ | GA |
| Ubuntu 20.04 LTS | — | ✅ | GA |
| Debian 12 | — | ✅ | GA |
| Debian 11 | — | ✅ | GA |
| SLES 15 | ✅ | — | Via RPM el9 |
| AIX 7.2/7.3 | — | — | Roadmap v0.2.0 |
| Windows Server 2019/2022 | — | — | Roadmap v0.3.0 |
| Linux ARM64 | — | — | Roadmap v0.3.0 |
13.3 Compatibilidad con Bacula
| PodHeitor Backup | Soporte |
|---|---|
| 15.0.3 | ✅ Objetivo GA principal |
| 15.0.x | ✅ |
| 14.x | ✅ (PTCOMM compatible) |
| < 14 | ⚠️ No probado |
14. Guía de Dimensionamiento
14.1 Requisitos Mínimos
| Componente | Mínimo | Notas |
|---|---|---|
| RAM del host FD | 1 GB | Pool de buffers XBSA en predeterminados ≈ 0,5 MB |
| CPU del host FD | 2 núcleos | Compresión + 1 stream paralelo |
| Disco del host FD | 50 MB | Directorio de trabajo (FIFOs + solo manifest) |
| Disco SO del host FD | — | Sin staging; nunca escribe datos en el disco local |
| Red FD→SD | 100 Mbps | Funcional mínimo |
14.2 Dimensionamiento Recomendado para Producción
| Entorno IDS | RAM FD | CPU FD | Red | stripes | parallel_dbspaces |
|---|---|---|---|---|---|
| Pequeño (< 100 GB, dbspace único) | 4 GB | 4 núcleos | 1 Gbps | 2 | 1 |
| Mediano (100 GB–1 TB, 4–8 dbspaces) | 8 GB | 8 núcleos | 10 Gbps | 4 | 4 |
| Grande (1–10 TB, 10+ dbspaces) | 16 GB | 16 núcleos | 25 Gbps | 8 | 8 |
| VLDB (> 10 TB, muchos dbspaces) | 32 GB | 32 núcleos | 25+ Gbps | 16–32 | 16+ |
14.3 Dimensionamiento del Bacula Storage Daemon
| Tasa de cambio diaria | Pool de almacenamiento | I/O disco SD | Notas |
|---|---|---|---|
| < 50 GB/día | 4 TB en disco | SAS/SATA | Pools estándar |
| 50–500 GB/día | 20 TB en disco | SSD recomendado | Habilitar compresión zstd en el SD también |
| > 500 GB/día | NAS/SAN o cinta | Alto throughput | Considerar el plugin Bacula Dedup SD |
15. Integración con Bacularis
Bacularis ofrece una interfaz web sobre PodHeitor Backup. El plugin PodHeitor Informix incluye un bacularis/plugin-descriptor.json que:
- Agrega «Informix» como tipo de recurso de cliente en el asistente de backup de Bacularis
- Renderiza los 64 parámetros de backup como campos de formulario con validación
- Muestra el explorador de restauración con vista en árbol del espacio de nombres IDS-aware (
/@informix/) - Muestra los resultados de validación E2E en línea
Para activar el descriptor:
cp /opt/bacula/plugins/bacularis/plugin-descriptor.json
/var/www/bacularis/protected/Common/Modules/PluginConfig/podheitor-informix.json
systemctl restart bacularis
16. Migración desde TSM/ISP y ON-Bar PSM
16.1 Migrando desde IBM Spectrum Protect (TSM/ISP)
Consulte MIGRATION_FROM_TSM.md para el procedimiento completo. Resumen:
- Instale PodHeitor Backup + PodHeitor en el host IDS
- Ejecute backups paralelos (TSM + PodHeitor) durante un ciclo completo de backup para validar
- Confirme la integridad de la cadena via archecker + manifest
- Defina
BAR_BSALIB_PATHpara apuntar a la biblioteca PodHeitor (reemplaza la biblioteca TSM) - Retire el cliente TSM
Diferencia clave: El BAR_BSALIB_PATH de TSM apunta a su propia biblioteca. La biblioteca de PodHeitor es un reemplazo directo — ON-Bar no nota la diferencia.
16.2 Migrando desde Scripts ON-Bar PSM
Consulte MIGRATION_FROM_PSM.md. Resumen:
- Identifique los valores actuales de
BAR_MAX_BACKUP,BAR_XFER_BUF_SIZEy ventanas de backup - Cree un FileSet PodHeitor equivalente con
mode=onbar_psmcomo paso de transición - Valide un ciclo completo de backup
- Cambie a
mode=xbsa(predeterminado) para streaming directo - Elimine los scripts PSM y la asignación de disco de staging
Ahorro de almacenamiento al eliminar el staging: El PSM escribe en disco (archivos .bak) antes de que Bacula los recoja. PodHeitor transmite directamente, eliminando 1× conjunto de backup en espacio en disco.
17. Resolución de Problemas
17.1 Plugin No Cargado
bacula-fd: error: plugin "podheitor-informix" not found
Causa: El .so no está en el directorio de plugins de Bacula. Solución: Verifique que /opt/bacula/plugins/podheitor-informix-fd.so exista; compruebe que bacula-fd.conf tenga Plugin Directory = /opt/bacula/plugins.
17.2 Fallo en la Carga de la Biblioteca XBSA
[ERROR] BAR_BSALIB_PATH not set or library not found
Causa: BAR_BSALIB_PATH no está configurado en /etc/sysconfig/podheitor-informix. Solución:
echo "BAR_BSALIB_PATH=/opt/podheitor-informix/lib/libpodheitor_xbsa.so"
>> /etc/sysconfig/podheitor-informix
systemctl restart bacula-fd
17.3 ON-Bar Sale con Código Distinto de Cero
[ERROR] onbar exit code 45 — see /tmp/onbar_<jobid>.log
Causa: Error de ON-Bar. Revise el archivo de log. Solución: Típicamente: INFORMIXSERVER incorrecto, IDS no está en ejecución, o sysmaster.bar_action bloqueado.
cat /tmp/onbar_<jobid>.log
onstat -g ses # verificar sesiones IDS activas
17.4 Fallo en la Verificación de Integridad de la Cadena
[ABORT] Chain broken: L0 JobId=1234 not found in catalog (or SHA mismatch)
Causa: El job Differential/Incremental abortó porque el Full o Diff precedente no está presente. Solución: Ejecute un nuevo backup Full. Si el Full existe y el SHA es incorrecto, el volumen de backup puede estar corrupto — investigue el dispositivo SD.
17.5 Brecha en el Envío Continuo de Log Lógico
[WARN] Log gap detected: expected log unique_id=150, got 152
Causa: El archivo de log lógico 151 nunca fue cerrado (error de IDS) o ya fue sobrescrito. Solución:
onbar -l -s # recuperar logs del disco
# O definir salvage_logs=yes en la configuración
17.6 Comandos de Diagnóstico
# Verificar estado de IDS
onstat -
# Verificar historial de backup ON-Bar
onstat -g bac
# Verificar estado del log lógico
onstat -l
# Ejecutar archecker manualmente en el último backup
archecker -b -v -f /@informix/<UUID>/__ph_manifest.json
# Verificar runtime del plugin
journalctl -u bacula-fd -n 200 | grep -i podheitor
# Preflight dry-run
/opt/bacula/plugins/podheitor-informix-backend --dry-run
/opt/bacula/etc/podheitor-informix.conf
18. Roadmap
| Versión | Objetivo | Características Principales |
|---|---|---|
| v0.1.0 GA | 2026-04-29 | Soporte completo Linux x86_64, los 22 escenarios E2E APROBADOS |
| v0.2.0 | 2026 T3 | Soporte AIX 7.x (ppc64), proveedor de snapshot NetApp ONTAP, compatibilidad OneDB 2.x |
| v0.3.0 | 2026 T4 | Windows Server FD, Linux ARM64, restauración ER multi-mesh |
| v0.4.0 | 2027 T1 | Descriptor de formulario de plugin Bacularis UI, FD sidecar Kubernetes |
| v0.5.0 | 2027 T2 | Replicación lógica de aplicación entre versiones (12.10 → 14.10 streaming en vivo) |
| v1.0.0 | 2027 T3 | Soporte completo de plataforma (Linux + AIX + Windows + ARM64) + Bacularis UI |
19. Evidencias de Validación (Resultados E2E)
19.1 Entorno de Laboratorio
| Componente | Detalles |
|---|---|
| Bacula Director | 192.168.15.105, Community 15.0.3, OL9 |
| IDS Primario (VM 186) | 192.168.15.130, ifxprod, IDS 15.0.1.0.3 Developer Edition en Docker |
| IDS Secundario HDR (VM 187) | 192.168.15.131, ifxhdr, IDS 15.0.1.0.3 |
| IDS Secundario RSS (VM 188) | 192.168.15.132, ifxrss, IDS 15.0.1.0.3 |
| Host Snapshot IDS (VM 189) | 192.168.15.133, ifxsnap, OL9 bare-metal + LVM VG con loop-backed (ifxvg) + FUSE3 |
19.2 Resultados E2E — 2026-04-29 (JobIds 6358–6379)
| ID | Escenario | JobId | Nivel | Resultado |
|---|---|---|---|---|
| T01 | Backup Full del servidor completo | 6358 | Full | ✅ APROBADO |
| T02-F | Cadena Full+Diff+Incr — Full | 6359 | Full | ✅ APROBADO |
| T02-D | Cadena Full+Diff+Incr — Differential | 6360 | Differential | ✅ APROBADO |
| T02-I | Cadena Full+Diff+Incr — Incremental | 6361 | Incremental | ✅ APROBADO |
| T03 | Restauración in-place (restore_object=yes) | 6362 | Full | ✅ APROBADO |
| T04 | Restauración a nueva instancia | 6363 | Full | ✅ APROBADO |
| T05-F | Cadena PITR — baseline Full | 6364 | Full | ✅ APROBADO |
| T05-I | Cadena PITR — Incremental (log-ship) | 6365 | Incremental | ✅ APROBADO |
| T06 | Dbspace único (solo rootdbs) | 6366 | Full | ✅ APROBADO |
| T07 | Backup y extracción a nivel de tabla | 6367 | Full | ✅ APROBADO |
| T08 | Backup paralelo con 4 stripes | 6368 | Full | ✅ APROBADO |
| T09-F | Envío continuo de log lógico — base | 6369 | Full | ✅ APROBADO |
| T09-I | Envío continuo de log lógico — Incremental | 6370 | Incremental | ✅ APROBADO |
| T10 | Bootstrap de secundario HDR | 6371 | Full | ✅ APROBADO |
| T11 | Bootstrap de secundario RSS | 6372 | Full | ✅ APROBADO |
| T12 | Exportación lógica (mode=logical_dbexport) | 6373 | Full | ✅ APROBADO |
| T13 | Snapshot LVM (snapshot_vg=ifxvg) | 6374 | Full | ✅ APROBADO |
| T14 | Seeding HDR via transporte Bacula | 6375 | Full | ✅ APROBADO |
| T15 | Sidecar de metadatos DBCRYPT | 6376 | Full | ✅ APROBADO |
| T16 | Fallback explícito ontape | 6377 | Full | ✅ APROBADO |
| T17 | Recuperación instantánea (loopdev+FUSE) | 6378 | Full | ✅ APROBADO |
| T18 | DR RestoreObject bare-metal | 6379 | Full | ✅ APROBADO |
APROBADO=22 / FALLIDO=0 / OMITIDO=0 / TOTAL=22 — 100% de aprobación
Contacto y Licenciamiento
Licenciamiento
PodHeitor Informix es software propietario, distribuido por suscripción. Para condiciones comerciales, demostración técnica o diagnóstico gratuito de 30 minutos, habla con el equipo por los canales abajo.
¿Listo para evaluar?
- 💬 WhatsApp: +1 (786) 726-1749
- ✉️ Email: heitor@opentechs.lat
- 🩺 Diagnóstico gratuito — 30 min con Heitor Faria
Plugin PodHeitor de Backup, Replicación y Conversión de Informix para Bacula — v0.1.0 GA © 2026 Heitor Faria. Todos los derechos reservados.
Disponível em:
Português (Portugués, Brasil)
English (Inglés)
Español