| Campo | Valor |
|---|---|
| ID del Runbook | RB-04 |
| Alcance | SQL Server primary failover — bases de datos de UMS |
| Responsable | DBA / Plataforma On-Call |
| Última Revisión | 2026-05-15 |
| Escenario | RTO Objetivo | RPO Objetivo | Acción |
|---|---|---|---|
| Primary pod crash (k8s) | < 60 s | 0 (replica sincrónica) | Automático via Patroni / operator |
| AZ-level failure | < 5 min | < 30 s | Promoción manual de standby |
| Region-level DR | < 30 min | < 5 min | Activación de runbook DR |
| Corruption / bad migration | Variable | Point-in-time | Restauración PITR |
El cluster de base de datos de UMS usa la topología de alta disponibilidad de SQL Server configurada para el entorno. El failover automático no requiere intervención manual.
# Verificar primary actual
kubectl get cluster ums-db-cluster -n ums-prod -o jsonpath='{.status.currentPrimary}'
# Ver salud del cluster
kubectl describe cluster ums-db-cluster -n ums-prod | grep -A 20 "Status:"
# Ver replication lag en replicas
kubectl exec -n ums-prod $(kubectl get pod -n ums-prod -l role=replica -o name | head -1) \
-- psql -U ums_app -d ums_prod \
-c "SELECT now() - pg_last_xact_replay_timestamp() AS replication_lag;"
# Paso 1: Identificar pods standby actuales
kubectl get pods -n ums-prod -l cnpg.io/cluster=ums-db-cluster
# Paso 2: Promover standby a primary
kubectl cnpg promote ums-db-cluster -n ums-prod
# Paso 3: Verificar promoción
kubectl get cluster ums-db-cluster -n ums-prod -o jsonpath='{.status.currentPrimary}'
# Paso 4: Actualizar connection string de aplicación si es necesario
kubectl get secret ums-db-cluster-app -n ums-prod -o yaml | grep host
# Restart auth API pods para forzar reset de connection pool
kubectl rollout restart deployment/ums-auth-api -n ums-prod
kubectl rollout restart deployment/ums-outbox-relay -n ums-prod
# Verificar conexiones establecidas
kubectl logs -n ums-prod deploy/ums-auth-api --tail=50 | grep -i "database\|connection\|ready"
# Ver conexiones DB activas
kubectl exec -n ums-prod ums-db-cluster-1 -- psql -U ums_app -d ums_prod \
-c "SELECT count(*), state FROM pg_stat_activity WHERE datname='ums_prod' GROUP BY state;"
Durante el failover, el worker de outbox relay puede haberse estancado. Verificar y recuperar:
# Ver backlog PENDING de outbox
kubectl exec -n ums-prod ums-db-cluster-1 -- psql -U ums_app -d ums_prod -c \
"SELECT status, count(*), min(created_at) AS oldest FROM outbox_events GROUP BY status;"
# Si conteo PENDING es alto, verificar que relay está procesando
kubectl logs -n ums-prod deploy/ums-outbox-relay --tail=100 | grep -i "relay\|publish\|error"
# Restart relay si está atascado
kubectl rollout restart deployment/ums-outbox-relay -n ums-prod
Último recurso. Solo si se perdió el primary y todas las replicas o los datos están corrupto.
# Listar WAL archives / snapshots disponibles
kubectl get secret ums-db-cluster-app -n ums-prod
# Restaurar a point in time (timestamp UTC)
kubectl apply -f - <<EOF
apiVersion: sqlserver.failover/v1
kind: Cluster
metadata:
name: ums-db-cluster-restored
namespace: ums-prod
spec:
bootstrap:
recovery:
source: ums-db-cluster
recoveryTarget:
targetTime: "2026-05-15T10:30:00Z"
externalClusters:
- name: ums-db-cluster
barmanObjectStore:
destinationPath: "s3://ums-backup/ums-db-cluster"
s3Credentials: ...
EOF
Después de que PITR completa:
npx typeorm migration:show para verificar estado del schema-- Verificar que RLS policies sobrevivieron el failover
SELECT schemaname, tablename, policyname, cmd, qual
FROM pg_policies
WHERE schemaname = 'ums'
ORDER BY tablename, policyname;
-- Testear enforcement de RLS
EXEC sp_set_session_context 'TenantId', 'tenant-test-1';
SELECT count(*) FROM ums.users; -- debe retornar solo filas de tenant-test-1
kubectl get cluster| Volver al Índice de Operaciones | Volver al Índice Maestro |