Apache Cloudberry (Incubating)
Base de datos MPP de código abierto avanzada derivada de Greenplum con kernel PostgreSQL moderno, para analítica distribuida y cargas de trabajo AI/ML a escala petabyte.
¿Qué es Apache Cloudberry?
Apache Cloudberry es una base de datos MPP (Massively Parallel Processing) de código abierto avanzada y madura, derivada del código fuente de Greenplum Database 7 pero construida sobre un kernel PostgreSQL más moderno. Es un proyecto incubado en la Apache Software Foundation bajo el modelo Apache-2.0, garantizando gobernanza neutral y toma de decisiones basada en mérito.
Cloudberry puede servir como data warehouse y también para cargas de trabajo de analítica a gran escala e IA/ML. Soporta desde terabytes hasta petabytes de datos sobre hardware commodity, máquinas virtuales o nube pública.
¿Para quién es?
- Organizaciones que migran desde Greenplum Database y buscan compatibilidad operativa
- Equipos de analítica que requieren procesamiento paralelo distribuido
- Proyectos de IA/ML que necesitan machine learning in-database con Apache MADlib
- Entornos empresariales que valoran gobernanza Apache y neutralidad vendor
- Plataformas cloud (AWS, Azure, GCP) con despliegue en VMs o contenedores
Casos de uso principales
- Data Warehouse MPP: Almacenamiento y consulta distribuida de grandes volúmenes de datos con procesamiento paralelo.
- Analítica OLAP: Consultas complejas sobre datasets masivos con ejecución paralela en segmentos.
- Machine Learning In-Database: Uso de Apache MADlib para algoritmos ML directamente en la base de datos.
- Análisis Espacial: Extensiones PostGIS para consultas geoespaciales distribuidas.
- Migración desde Greenplum: Migración sencilla usando herramientas oficiales como cbcopy y gpbackup.
Arquitectura MPP
Apache Cloudberry utiliza arquitectura MPP (shared-nothing) con múltiples hosts que trabajan conjuntamente. Cada nodo tiene su propio procesador, memoria, disco y sistema operativo.
Nodos del sistema:
- Coordinator Node: Puerta de entrada que acepta conexiones de clientes y consultas SQL, asigna tareas a nodos de datos. Contiene tablas de sistema con metadatos pero NO almacena datos de usuario.
- Segment Nodes: Procesos Postgres individuales que almacenen porciones de los datos y ejecutan partes de las consultas. Típicamente 2-8 segmentos por host segment.
- Interconnect: Capa de red usando UDP con control de flujo (UDPIFC) por defecto, con verificación de paquetes que supera el alcance de UDP para equivalencia a TCP en fiabilidad.
El sistema utiliza Multiversion Concurrency Control (MVCC) para consistencia de datos y minimiza contention de locks. Los segmentos se distribuyen equitativamente para optimizar rendimiento.
Requisitos del Sistema
| Componente | Entorno Desarrollo | Entorno Producción |
|---|---|---|
| CPU | 4 cores | 16+ cores |
| Memoria | 8 GB | 32+ GB |
| Disco | SSD | SSD con RAID recomendado |
| Red | 10 Gbps NIC (2 preferido) | 10 Gbps NIC (2 preferido) |
| Sistema Operativo | Rocky Linux 8/9, Ubuntu 22.04/24.04, RHEL 8/9 | Mismo que desarrollo |
| Filesystem | XFS | XFS obligatorio |
Soporte de arquitectura: x86_64 (disponible desde 2.1+) y AARCH64 (planificado para 2.2).
Instalación y Despliegue
Vía RPM/DEB:
La instalación automática resuelve dependencias como bash, openssh, rsync, perl, python3, libcurl, libevent, libidn2, libselinux, libstdc++, libuuid, libuv, libxml2, libyaml, libzstd, lz4, openldap, openssl, pam, readline, pcre2, xz para RHEL/Rocky Linux.
Compilación desde fuente:
git clone https://github.com/apache/cloudberry.git
cd cloudberry
make
make installDocker (desarrollo/testing):
Existen imágenes Docker comunitarias en woblerr/docker-cloudberry para despliegues single-node y multi-node, aptas para desarrollo, testing y aprendizaje.
Persistencia de Datos
- Los datos se almacenan exclusivamente en nodos segment, NO en el coordinator
- Recomendado: 2 discos SAS independientes RAID1 para sistema + 10 discos SAS RAID5 para datos
- Usar LVM para gestión flexible de discos con volumes lógicos consecutivos (/data0, /data1, etc.)
- Capacidad máxima al 70% para archivos temporales y evitar degradación de rendimiento
- Network file systems NO soportados; storage compartido debe presentarse como block device
Configuración de Red
- Datos exchange network: 2 NICs de 10 Gbps con bonding (BONDING_OPTS='mode=4 miimon=100 xmit_hash_policy=layer3+4')
- Gateway por defecto debe usar bond0 del data exchange network
- TCP idle connection > 12 horas entre management console y database host
- Switch convergence ratio recomendado: 4:1 (saturación significativa a 6:1)
- Soporta IPv4 e IPv6
Seguridad
Cifrado de Datos:
Transparent Data Encryption (TDE) para proteger datos en reposo y en tránsito.
Autenticación:
- Passwords guardados como MD5 o SCRAM-SHA-256 hashes en pgauthid
- PermitEmptyPasswords deshabilitado por defecto
- UseDNS deshabilitado para evitar resolución DNS lenta
Auditoría:
Log auditing para detectar amenazas de seguridad.
Row-Level Security:
Políticas RLS permiten definir acceso a filas específicas por usuario.
Password Profiles:
Controlan políticas de contraseñas: bloqueo tras fallos de login, reutilización limitada.
Nota sobre endpoint security software: Software antivirus/protección puede interferir con operaciones. Testear en entorno no-producción.
Backup y Restauración
gpbackup/gprestore (paralelo):
- Usa ACCESS SHARE locks en lugar de EXCLUSIVE, permitiendo DDL durante backups
- Escala independientemente del número de segmentos
- Cada segment host escribe a disco local simultáneamente
- Archivos diseñados para restauración granular futura con dependencias
pg_dump/pg_restore (no-paralelo):
Solo para casos especiales. Más lento porque todos los datos pasan por el coordinator. Requiere modificar CREATE TABLE statements para incluir DISTRIBUTED clause.
# Backup paralelo completo
gpbackup -d postgresql://gpadmin@localhost:5432/postgres
# Restauración completa
gprestore -d postgresql://gpadmin@localhost:5432/postgresMigración y Actualización
cbcopy (herramienta oficial):
Utilidad poderosa para migración eficiente entre Greenplum 6.x/7.x → Cloudberry y actualizaciones 1.x → 2.x.
# Migrar metadata
cbcopy --source-host=127.0.0.1 --source-port=15432 \
--source-user=gpadmin --dest-host=127.0.0.1 \
--dest-port=25432 --dest-user=gpadmin \
--full --metadata-only --with-global-metadata
# Migrar datos
cbcopy --source-host=127.0.0.1 --source-port=15432 \
--source-user=gpadmin --dest-host=127.0.0.1 \
--dest-port=25432 --dest-user=gpadmin \
--full --data-only --truncate --copy-jobs=8Modos: --full, --dbname, --schema, --include-table, --append, --truncate.
Ventajas
- Kernel PostgreSQL moderno: Leverages upstream features y rich PostgreSQL ecosystem
- Compatibilidad Greenplum: Migración sencilla con gpbackup/cbcopy
- Vendor-neutral: Gobernanza Apache, decisiones merit-based
- Rendimiento escalable: Parallel query execution e incremental materialized views
- Multicarga de trabajo: PostGIS + MADlib en single MPP engine
- Seguridad empresarial: TDE, password policies, PAX storage engine, dynamic tables
Limitaciones
- No soporta network file systems (solo block devices presentados)
- Docker/Compose oficial no documentado; imágenes comunitarias solo para desarrollo/testing
- Requiere configuración manual de kernel parameters, SELinux, firewall, NTP
- Hyperthreading debe deshabilitarse en BIOS Intel para mejor isolation entre resource groups
- cbcopy es contribución comunitaria, no mantenido oficialmente por Apache
Preguntas Frecuentes
¿Puedo usar Cloudberry para reemplazar clusters Greenplum existentes?
Sí. Uno de los objetivos es compatibilidad con Greenplum. Migrar usando gpbackup o cbcopy.
¿Cuál es la diferencia con Greenplum Database?
Cloudberry toma el codebase de Greenplum 7 pero tiene kernel PostgreSQL más nuevo y moderno, con más features.
¿Soporta Docker Compose oficial?
No hay documentación oficial para Docker Compose. Existen imágenes comunitarias en woblerr/docker-cloudberry para desarrollo/testing.
¿Qué versiones de Java soporta?
Open JDK 8/11/17 y Oracle JDK 8/11/17 para PL/Java y PXF (AdoptOpenJDK recomendado).
¿Cómo validar una migración con cbcopy?
cbcopy valida automáticamente comparando row counts entre source y target. Logs de error en $USER/gpAdminLogs/cbcopy_$timestamp.log.