Modernizzazione Database Relazionali su Google Cloud: AlloyDB vs Cloud SQL nel confronto su RPO zero, disaccoppiamento storage e DORA
Relational Database Modernization on Google Cloud: AlloyDB vs Cloud SQL on Zero RPO, Disaggregated Storage, and DORA

Nel percorso di modernizzazione applicativa e migrazione al cloud delle grandi organizzazioni bancarie ed enterprise, i database relazionali transazionali (OLTP) rappresentano da sempre il carico più critico, complesso e vincolante. La transizione da sistemi monolitici on-premise — come cluster Oracle RAC su appliance ingegnerizzate, IBM Db2 o cluster PostgreSQL virtualizzati su hypervisor VMware/KVM attestati su storage SAN enterprise — verso il cloud pubblico impone scelte architetturali che vanno ben oltre il mero dimensionamento di CPU e memoria.
Su Google Cloud, il catalogo per i motori compatibili con PostgreSQL offre due soluzioni pienamente gestite (fully managed): Cloud SQL for PostgreSQL e AlloyDB for PostgreSQL. Spesso valutate superficialmente come opzioni differenziate solo dal livello di prezzo e dalla capacità di calcolo, le due piattaforme poggiano in realtà su paradigmi architetturali antitetici: un'architettura a disco condiviso convenzionale (monolithic storage) contro un'architettura cloud-native a calcolo e storage disaccoppiati (disaggregated compute and storage).
Alla luce dei rigorosi requisiti imposti dal regolamento europeo DORA (Digital Operational Resilience Act) e dalle linee guida EBA sulla continuità operativa — che richiedono Recovery Point Objective (RPO) prossimo allo zero, Recovery Time Objective (RTO) deterministico e capacità di Disaster Recovery multi-regione testabili — comprendere i trade-off profondi tra Cloud SQL e AlloyDB è fondamentale per un Cloud Architect.
Architettura a Confronto: Persistent Disk vs Disaggregated Storage
La differenza sostanziale tra le due piattaforme non risiede nel motore di esecuzione SQL (entrambe garantiscono piena compatibilità PostgreSQL), ma nel modo in cui gestiscono l'I/O, i log transazionali (Write-Ahead Log - WAL) e la persistenza dei blocchi dati.
1. Cloud SQL: La Virtualizzazione della Macchina su Persistent Disk
Cloud SQL implementa un pattern classico: esegue PostgreSQL all'interno di una macchina virtuale Compute Engine gestita, collegata a volumi Regional Persistent Disk (Regional PD):
- Doppio Carico di I/O (Write Amplification): Il processo PostgreSQL primario deve scrivere sul disco sia i record WAL sia le pagine di memoria modificate (dirty buffer pool pages) durante le operazioni di checkpoint.
- Failover Zonale: L'Alta Disponibilità (HA) è implementata a livello di blocco di archiviazione. In caso di disservizio della zona primaria, Google Cloud avvia un'istanza standby nella seconda zona, aggancia il Regional PD e avvia il motore PostgreSQL. Questo processo richiede tra i 60 e i 120 secondi per completare l'aggancio del disco, l'inizializzazione del database e il crash recovery dei log non consolidati.
- Repliche di Lettura: Ciascuna read replica è un'istanza autonoma con il proprio Persistent Disk dedicato, che riceve gli aggiornamenti dal primario tramite lo streaming replication convenzionale di PostgreSQL su rete. In presenza di picchi di scrittura massivi, le repliche possono accumulare un sensibile replication lag, compromettendo la coerenza delle letture analitiche.
2. AlloyDB: Il Principio "The Log is the Database"
AlloyDB adotta un'architettura a calcolo e storage disaccoppiati (disaggregated storage), concettualmente analoga ad Amazon Aurora ma ingegnerizzata nativamente sull'infrastruttura Google:
- Separazione Netta di Calcolo e Memoria: Il nodo di calcolo (Compute Instance) non esegue checkpoint di pagine disco verso lo storage. Invia unicamente il flusso compresso dei record WAL a uno Storage Engine distribuito intelligente, costruito direttamente sopra Colossus, il file system distribuito planetario di Google. Colossus assicura replica continua multi-zona, throughput elastico e durabilità enterprise a livello hardware.
- Elaborazione Asincrona dei Log (Log Processing Service): Il layer di storage incorpora microservizi distribuiti (Log Processing Service) che processano i record WAL in background e mantengono aggiornati i blocchi dati su unità NVMe ultra-veloci gestite da Colossus, sollevando la CPU primaria dall'I/O di checkpoint.
- Failover Zonale Sub-Secondo: Tutte le istanze di lettura (Read Pool) condividono direttamente lo stesso storage distribuito. Se l'istanza primaria collassa, una delle repliche del read pool viene promossa a primario in meno di 1 secondo, poiché non deve riprodurre gigabyte di WAL da disco né attendere lo switch di volumi fisici.
- AlloyDB Columnar Engine: Consente di mantenere in memoria cache una rappresentazione colonnare vettoriale dei dati transazionali per query analitiche e reportistiche (HTAP), accelerando le scansioni tabellari fino a 100 volte senza gravare sull'elaborazione OLTP.
Continuità Operativa e Conformità DORA nel Banking
Il regolamento europeo DORA impone requisiti stringenti di resilienza per le istituzioni finanziarie:
- RPO (Recovery Point Objective): Riduzione quasi a zero della perdita di dati ammissibile in caso di disservizio catastrofico.
- RTO (Recovery Time Objective): Ripristino rapido e prevedibile del servizio core banking.
- Disaster Recovery Multi-Regione: Capacità di eseguire failover cross-region senza impattare l'integrità del dato contabile.
Il Confronto Multi-Regione
Nelle architetture multi-regione per la mitigazione del rischio sistemico:
- Cloud SQL Cross-Region Read Replica: La replica su una seconda regione è asincrona. In caso di outage regionale completo della primary region, la replica secondaria deve essere "promossa" a database standalone. Questa operazione è irreversibile: scollega l'istanza dalla topologia di replica, richiede la riconfigurazione manuale o via Terraform delle connessioni applicative e rende estremamente complessa la procedura di failback non appena la regione principale torna operativa.
- AlloyDB Secondary Cluster: AlloyDB introduce il concetto di Secondary Cluster multi-regione. La sincronizzazione tra cluster primario e secondario avviene direttamente a livello di layer di storage Colossus, con un RPO target nell'ordine di pochi secondi (e tipicamente sub-secondo in condizioni standard di carico). La promozione del cluster secondario a primario può essere gestita in modo pulito e, soprattutto, l'architettura supporta il failback controllato: il vecchio cluster primario può essere re-integrato come secondario senza dover rieseguire il restore completo da backup.
Per gli audit di conformità DORA (RTS on Business Continuity Management), la capacità di dimostrare test di disaster recovery non distruttivi e con RPO misurabile nell'ordine dei secondi posiziona AlloyDB come lo standard de facto per i carichi di Core Banking e Payment Processing su Google Cloud.
Matrice Comparativa: Cloud SQL vs AlloyDB
| Dimensione Architetturale | Cloud SQL for PostgreSQL | AlloyDB for PostgreSQL |
|---|---|---|
| Paradigma di Storage | Monolitico su Regional Persistent Disk | Disaccoppiato su Google Colossus (Log-centric a 3 zone) |
| Throughput Transazionale OLTP | Baseline standard PostgreSQL | Fino a 4x superiore rispetto a Cloud SQL standard |
| Accelerazione Analitica (HTAP) | Assente (richiede esportazione o ETL su BigQuery) | Columnar Engine nativo integrato in-memory (fino a 100x) |
| RTO Failover Zonale (HA) | 60 – 120 secondi (aggancio PD e crash recovery) | < 1 secondo (promozione immediata su storage condiviso) |
| RPO Failover Zonale (HA) | 0 (scrittura sincrona su Regional PD) | 0 (scrittura replicata su storage Colossus distribuito) |
| RPO Disaster Recovery Regionale | Da decine di secondi a minuti (PostgreSQL WAL streaming lag) | Pochi secondi (continuous storage replication su Google backbone) |
| Complessità Failback Cross-Region | Elevata (promozione distruttiva, re-seed manuale) | Nativa (inversione dei ruoli tra cluster primario e secondario) |
| Finestre di Manutenzione e Downtime | 30 – 60 secondi di interruzione del servizio | Sub-secondo nella maggioranza degli upgrade di manutenzione |
| Modello di Costo | VM vCPU/RAM + Storage PD allocato | Calcolo vCPU/RAM + Storage effettivo consumato |
Implementazione Infrastructure as Code con Terraform
Di seguito è riportato il modulo Terraform per il deployment di un cluster AlloyDB ad alta resilienza enterprise con nodo primario HA, read pool con columnar engine abilitato e secondary cluster multi-regione per disaster recovery conforme a DORA.
terraform {
required_version = ">= 1.14.0"
required_providers {
google = {
source = "hashicorp/google"
version = "~> 6.0"
}
}
}
# 1. Cluster Primario ad Alta Disponibilità (Regione Primaria: europe-west8 - Milano)
resource "google_alloydb_cluster" "primary" {
cluster_id = "alloydb-banking-primary"
location = var.primary_region # europe-west8 (Milano)
network_config {
network = var.vpc_network_id
}
initial_user {
user = "dba_admin"
password = var.db_admin_password
}
automated_backup_policy {
enabled = true
weekly_schedule {
days_of_week = ["MONDAY", "WEDNESDAY", "FRIDAY", "SUNDAY"]
start_times {
hours = 2
minutes = 0
}
}
retention_period = "2592000s" # 30 giorni di retention conforme alle policy bancarie
location = var.dr_region # Replica geografica dei backup su europe-west12
}
}
# Istanza Primaria Write-Read
resource "google_alloydb_instance" "primary_instance" {
cluster = google_alloydb_cluster.primary.name
instance_id = "primary-instance-01"
instance_type = "PRIMARY"
machine_config {
cpu_count = 16 # 16 vCPU, 128 GB RAM per workload OLTP intensivo
}
availability_type = "REGIONAL" # Alta disponibilità zonale garantita
database_flags = {
"google_columnar_engine.enabled" = "on"
"google_columnar_engine.memory_size_in_mb" = "32768"
"password.enforce_complexity" = "on"
}
}
# 2. Cluster Secondario di Disaster Recovery (Regione Secondaria: europe-west12 - Torino)
resource "google_alloydb_cluster" "secondary_dr" {
cluster_id = "alloydb-banking-secondary-dr"
location = var.dr_region # europe-west12 (Torino)
cluster_type = "SECONDARY"
network_config {
network = var.vpc_network_id
}
secondary_config {
primary_cluster_name = google_alloydb_cluster.primary.name
}
depends_on = [google_alloydb_instance.primary_instance]
}
# Istanza di Failover nel Cluster Secondario
resource "google_alloydb_instance" "secondary_instance" {
cluster = google_alloydb_cluster.secondary_dr.name
instance_id = "secondary-instance-01"
instance_type = "SECONDARY"
machine_config {
cpu_count = 16
}
availability_type = "REGIONAL"
}
Poiché la Virtual Private Cloud (VPC) su Google Cloud è globale per natura, la replica cross-region tra Milano (europe-west8) e Torino (europe-west12) transita direttamente sulla rete in fibra privata globale di Google (backbone Jupiter). Non è necessario configurare né VPN né router BGP inter-regionali: i cluster comunicano tramite gli indirizzi IP interni allocati nella Service Networking connection (Private Services Access).
Guida alla Scelta: Quando Adottare Cloud SQL o AlloyDB
La scelta tra le due tecnologie deve essere guidata dal profilo di rischio e dalle caratteristiche del carico:
Quando scegliere Cloud SQL for PostgreSQL
- Workload dipartimentali o non critici: Ambienti di sviluppo, staging o microservizi satellite con requisiti di RTO permissivi (> 60 secondi).
- Volumetrie e I/O moderati: Database con dataset inferiori a 1 TB e traffico di scrittura non concorrenziale.
- Costi infrastrutturali base contenuti: Esigenza di ridurre i costi fissi tramite istanze entry-level a 1–2 vCPU con dischi ridotti.
Quando scegliere AlloyDB for PostgreSQL
- Sistemi Core Banking e Payment Processing: Piattaforme transazionali e ledger contabili dove anche 60–120 secondi di failover zonale violano gli SLA o incorrono in sanzioni regolamentari.
- Carichi ad alta intensità di scrittura: Applicazioni OLTP con frequenti update concorrenziali che soffrirebbero del collo di bottiglia dei checkpoint disco di PostgreSQL tradizionale.
- Analitica e reportistica real-time (HTAP): Necessità di interrogare i dati di produzione ad alta velocità tramite il Columnar Engine senza sviluppare pipeline ETL intermedie.
- Piani di Disaster Recovery multi-regione verificabili: Architetture di continuità operativa conformi a DORA con RPO target rigorosamente nell'ordine dei secondi e failback non distruttivo.
In enterprise application modernization and cloud migration initiatives across large banking and financial institutions, transactional relational databases (OLTP) represent the most critical, complex, and constrained tier. Transitioning from legacy on-premises monoliths — such as Oracle RAC clusters on engineered appliances, IBM Db2, or PostgreSQL clusters virtualized on VMware/KVM hypervisors backed by enterprise SAN storage — to the public cloud requires architectural decisions extending far beyond simple CPU and memory sizing.
On Google Cloud, the PostgreSQL-compatible portfolio offers two fully managed solutions: Cloud SQL for PostgreSQL and AlloyDB for PostgreSQL. Frequently evaluated through a narrow lens focusing solely on pricing tiers and vCPU capacities, the two engines actually rest on fundamentally opposing architectural paradigms: a conventional shared-disk architecture (monolithic storage) versus a cloud-native architecture with decoupled compute and storage (disaggregated compute and storage).
Under the stringent mandates imposed by the European Union's DORA (Digital Operational Resilience Act) and EBA guidelines on business continuity — demanding near-zero Recovery Point Objectives (RPO), deterministic Recovery Time Objectives (RTO), and testable multi-region Disaster Recovery capabilities — evaluating the deep trade-offs between Cloud SQL and AlloyDB is a vital prerequisite for any Cloud Architect.
Architectural Comparison: Persistent Disk vs Disaggregated Storage
The decisive difference between both platforms does not lie in the SQL execution engine (both guarantee full PostgreSQL compatibility), but in how they handle I/O throughput, transaction logging (Write-Ahead Log - WAL), and data block persistence.
1. Cloud SQL: Machine Virtualization Over Persistent Disk
Cloud SQL adheres to a traditional pattern: running PostgreSQL inside a managed Compute Engine virtual machine backed by Regional Persistent Disk (Regional PD):
- Dual I/O Burden (Write Amplification): The primary PostgreSQL process must flush both WAL records and modified in-memory pages (dirty buffer pool pages) to disk during periodic checkpoint operations.
- Zonal Failover Dynamics: High Availability (HA) is implemented at the block-storage layer. Upon a primary zone outage, Google Cloud provisions a standby VM in the secondary zone, attaches the Regional PD, and initializes PostgreSQL. This failover lifecycle typically takes 60 to 120 seconds to complete volume attachment, database initialization, and crash recovery of uncommitted WAL logs.
- Read Scaling Overhead: Each read replica operates as an autonomous virtual instance backed by its own dedicated Persistent Disk, receiving stream updates from the primary node via standard PostgreSQL network streaming replication. Under heavy transactional write spikes, read replicas can experience significant replication lag, degrading analytical read consistency.
2. AlloyDB: The Principle That "The Log is the Database"
AlloyDB introduces a modern decoupled compute and storage architecture (disaggregated storage), conceptually similar to Amazon Aurora but engineered directly atop Google's high-performance internal infrastructure:
- Strict Compute and Storage Decoupling: The compute instance never writes dirty database buffer pages back to storage during checkpoints. It streams only compressed WAL delta records to an Intelligent Distributed Storage Engine, built directly upon Google's planetary distributed file system (Colossus). Colossus delivers continuous multi-zone replication, elastic throughput, and hardware-level fault tolerance.
- Asynchronous Log Processing (Log Processing Service): The storage layer incorporates dedicated background microservices (Log Processing Service) that ingest WAL records asynchronously and maintain updated data blocks on ultra-fast NVMe arrays managed by Colossus, offloading checkpoint I/O from the primary compute CPU.
- Sub-Second Zonal Failover: All read instances (Read Pool) share direct read access to the exact same distributed storage fabric. If the primary write instance fails, an existing read replica is promoted to primary in less than 1 second, because it needs neither to replay gigabytes of disk WAL nor wait for storage volume detachment and reattachment.
- AlloyDB Columnar Engine: Keeps an in-memory vectorized columnar representation of transactional tables for reporting and analytical queries (HTAP), accelerating sequential scans by up to 100x without consuming resources from primary OLTP write processing.
Operational Continuity and DORA Compliance in Financial Services
The European DORA framework establishes uncompromising digital operational resilience standards for financial entities:
- RPO (Recovery Point Objective): Near-zero permissible data loss during catastrophic regional infrastructure failures.
- RTO (Recovery Time Objective): Rapid, bounded restoration of core banking service availability.
- Multi-Region Disaster Recovery: The proven capability to execute cross-region failover while guaranteeing ledger and data integrity.
Multi-Region Resilience Compared
When architecting multi-region topologies to mitigate systemic cloud provider risk:
- Cloud SQL Cross-Region Read Replica: Replication to a secondary region is asynchronous. In the event of a total primary region outage, the secondary replica must be manually or programmatically "promoted" to a standalone database. This operation is destructive and irreversible: it severs the instance from the replication topology, demands complex endpoint reconfiguration across applications, and makes subsequent failback back to the primary region difficult.
- AlloyDB Secondary Cluster: AlloyDB provides native multi-region Secondary Clusters. Synchronization between primary and secondary clusters operates continuously at the storage engine level on Colossus, yielding a target RPO in the order of a few seconds (and typically sub-second under standard operational load). Secondary cluster promotion is fully integrated, and crucially, supports clean bidirectional switchover: the former primary cluster can be re-attached as a secondary replica without triggering an expensive full restore from backup.
Under DORA regulatory audits (specifically RTS on Business Continuity Management), demonstrating non-destructive disaster recovery drill capabilities with verified low-seconds RPO firmly establishes AlloyDB as the modern cloud standard for Tier-1 Core Banking and Payment Processing workloads on Google Cloud.
Comparative Matrix: Cloud SQL vs AlloyDB
| Architectural Dimension | Cloud SQL for PostgreSQL | AlloyDB for PostgreSQL |
|---|---|---|
| Storage Paradigm | Monolithic over Regional Persistent Disk | Decoupled over Google Colossus (3-zone log-centric engine) |
| OLTP Transactional Throughput | Standard PostgreSQL baseline | Up to 4x higher than standard Cloud SQL |
| Analytical Acceleration (HTAP) | None (requires ETL extraction to BigQuery) | Native In-Memory Columnar Engine (up to 100x speedup) |
| Zonal Failover RTO (HA) | 60 – 120 seconds (PD attach and crash recovery) | < 1 second (immediate promotion on shared storage) |
| Zonal Failover RPO (HA) | 0 (synchronous Regional PD block writes) | 0 (replicated distributed storage on Colossus) |
| Regional Disaster Recovery RPO | Tens of seconds to minutes (PostgreSQL WAL streaming lag) | Few seconds (continuous storage replication over Google backbone) |
| Cross-Region Failback Complexity | High (irreversible promotion, manual re-seed) | Native (seamless role reversal between primary and secondary) |
| Maintenance Downtime Impact | 30 – 60 seconds of client disruption | Sub-second for the majority of engine patch cycles |
| Cost Structure | Provisioned VM vCPU/RAM + Allocated PD capacity | Compute vCPU/RAM + Actual dynamically consumed storage |
Infrastructure as Code Implementation with Terraform
Below is an enterprise-grade Terraform module deploying an AlloyDB cluster featuring regional High Availability, an analytical read pool with the Columnar Engine enabled, and a multi-region secondary cluster for DORA-compliant Disaster Recovery.
terraform {
required_version = ">= 1.14.0"
required_providers {
google = {
source = "hashicorp/google"
version = "~> 6.0"
}
}
}
# 1. High-Availability Primary Cluster (Primary Region: europe-west8 - Milan)
resource "google_alloydb_cluster" "primary" {
cluster_id = "alloydb-banking-primary"
location = var.primary_region # europe-west8 (Milan)
network_config {
network = var.vpc_network_id
}
initial_user {
user = "dba_admin"
password = var.db_admin_password
}
automated_backup_policy {
enabled = true
weekly_schedule {
days_of_week = ["MONDAY", "WEDNESDAY", "FRIDAY", "SUNDAY"]
start_times {
hours = 2
minutes = 0
}
}
retention_period = "2592000s" # 30 days retention per banking regulatory policies
location = var.dr_region # Geographic backup replication to europe-west12
}
}
# Primary Read-Write Compute Instance
resource "google_alloydb_instance" "primary_instance" {
cluster = google_alloydb_cluster.primary.name
instance_id = "primary-instance-01"
instance_type = "PRIMARY"
machine_config {
cpu_count = 16 # 16 vCPU, 128 GB RAM for high-throughput OLTP workloads
}
availability_type = "REGIONAL" # Ensures automated multi-zone High Availability
database_flags = {
"google_columnar_engine.enabled" = "on"
"google_columnar_engine.memory_size_in_mb" = "32768"
"password.enforce_complexity" = "on"
}
}
# 2. Multi-Region Disaster Recovery Secondary Cluster (DR Region: europe-west12 - Turin)
resource "google_alloydb_cluster" "secondary_dr" {
cluster_id = "alloydb-banking-secondary-dr"
location = var.dr_region # europe-west12 (Turin)
cluster_type = "SECONDARY"
network_config {
network = var.vpc_network_id
}
secondary_config {
primary_cluster_name = google_alloydb_cluster.primary.name
}
depends_on = [google_alloydb_instance.primary_instance]
}
# Failover Compute Instance in Secondary DR Cluster
resource "google_alloydb_instance" "secondary_instance" {
cluster = google_alloydb_cluster.secondary_dr.name
instance_id = "secondary-instance-01"
instance_type = "SECONDARY"
machine_config {
cpu_count = 16
}
availability_type = "REGIONAL"
}
Because Virtual Private Cloud (VPC) in Google Cloud is global by design, cross-region replication between Milan (europe-west8) and Turin (europe-west12) flows directly across Google's private global fiber network (Jupiter backbone). No inter-region VPN or BGP routers are required: both clusters communicate using internal private IP addresses allocated via Service Networking (Private Services Access).
Architectural Decision Framework: When to Choose Cloud SQL vs AlloyDB
The architectural choice between both engines should be guided by workload characteristics and organizational risk appetite:
When to Select Cloud SQL for PostgreSQL
- Departmental or non-critical workloads: Internal tooling, development/staging tiers, or satellite microservices with relaxed RTO expectations (> 60 seconds).
- Moderate database size and I/O: Workloads with datasets under 1 TB and moderate, non-congested write traffic.
- Low baseline infrastructure cost: Projects requiring minimal fixed expenditure through small 1–2 vCPU shapes and modest disk allocation.
When to Select AlloyDB for PostgreSQL
- Core Banking and Payment Processing Systems: Transactional platforms and financial ledgers where even 60–120 seconds of zonal failover violates regulatory SLAs or incurs financial penalties.
- High-concurrency, write-heavy workloads: OLTP applications with frequent concurrent updates that would bottleneck on traditional PostgreSQL disk checkpointing.
- Real-time operational analytics (HTAP): Workloads requiring direct, high-speed analytical queries on production data via the Columnar Engine without implementing complex ETL pipelines.
- Verifiable multi-region Disaster Recovery: Resilient architectures designed for DORA compliance with low-seconds RPO targets and non-destructive bidirectional switchover.