CLOUD SPANNER → STACKIT · ARCHITECTUUR

Migratiestrategieën voor Google Cloud Spanner

StackToIT deelt Spanner in als redesign en schrijft er geen Terraform voor, omdat horizontaal uitschalen met externe consistentie op STACKIT geen tegenhanger heeft. De echte vraag is hoeveel van die garantie uw workload gebruikt. Deze pagina zet vier opties naast elkaar, laat zien wat een run vastlegt voor een Spanner-omgeving en geeft de vragen die de keuze bepalen tussen PostgreSQL Flex, een gedistribueerde SQL-database die u zelf beheert, Spanner laten staan of de workload splitsen.

Wat de run doet met een Spanner-omgeving

Een demo-omgeving die voor deze pagina is geschreven en op 4 november 2026 door StackToIT is beoordeeld: één instance, een GoogleSQL-database met twee interleaved tabellen en een database met PostgreSQL-dialect, plus een leesrecht. Links: de instance en de eerste database uit de invoer. Rechts: drie letterlijke fragmenten van de eenheid in assessment.json (id, klasse en doel, reden), daarna twee consoleregels.

Voorbeeldinvoermain.tf
resource "google_spanner_instance" "ledger" {
  name             = "ledger"
  config           = "regional-europe-west3"
  display_name     = "Ledger"
  processing_units = 1000
}

resource "google_spanner_database" "accounts" {
  instance            = google_spanner_instance.ledger.name
  name                = "accounts"
  database_dialect    = "GOOGLE_STANDARD_SQL"
  deletion_protection = true
  version_retention_period = "3d"

  ddl = [
    "CREATE TABLE Accounts (AccountId STRING(36) NOT NULL, Owner STRING(128), Balance NUMERIC) PRIMARY KEY (AccountId)",
    "CREATE TABLE Entries (AccountId STRING(36) NOT NULL, EntryId STRING(36) NOT NULL, Amount NUMERIC, CreatedAt TIMESTAMP OPTIONS (allow_commit_timestamp=true)) PRIMARY KEY (AccountId, EntryId), INTERLEAVE IN PARENT Accounts ON DELETE CASCADE",
  ]
}
StackToIT-assessment (fragment)assessment.json
"id":"google_spanner_instance.ledger"
"class":"REDESIGN","confidence":"MEDIUM","target":{"service":"PostgreSQL Flex (single region) or a self-managed distributed SQL database — data-model redesign","resources":["stackit_postgresflex_instance"]
"reason":"Spanner's horizontal scale-out with external consistency (TrueTime) has no STACKIT counterpart. Workloads that fit one region move to PostgreSQL Flex (Spanner's PostgreSQL dialect eases this); truly global ones need a distributed SQL database operated on SKE."
Samenvatting in de console (geselecteerde regels)terminal output
Source        4 resources · 1 unit · visibility: Complete
Migration     0 drafted · 1 manual (of 1 units the draft considered)
  • Vier resources, één eenheid, geen concept

    De instance, beide databases en het leesrecht vormen samen één eenheid. De run schrijft er niets voor: nul eenheden als concept geschreven, één over voor de architect, en terraform/ bevat alleen het providerbestand, het variabelenbestand en een README die de eenheid vermeldt onder "Left for the architect".

  • De reden is de beslissing

    De klasse is REDESIGN met zekerheidsniveau MEDIUM. De genoemde reden is dat horizontaal uitschalen met externe consistentie, gebouwd op TrueTime, op STACKIT geen tegenhanger heeft. Workloads die in één regio passen, gaan naar PostgreSQL Flex; echt globale workloads vereisen een gedistribueerde SQL-database die u op SKE beheert.

  • Dataverplaatsing is nog niet beslist

    Het bestand over dataverplaatsing noemt de eenheid "decision required", met onbekend mechanisme. De omvang van de data, de wijzigingssnelheid, de downtime en het herstelpunt staan niet in de bron, en de run meldt dat hij nooit data verplaatst.

Regionaal of multiregionaal: de run maakt geen onderscheid

De demo is twee keer beoordeeld: één keer met een regionale configuratie en één keer, zonder het leesrecht, met de multiregionale configuratie nam-eur-asia1 over drie continenten en drie nodes. De documentatie van Google noemt die configuratie multiregionaal, met lees-schrijf-, alleen-lezen- en witness-replica's verspreid over continenten.

Invoer run 1main.tf
  name             = "ledger"
  config           = "regional-europe-west3"
  display_name     = "Ledger"
  processing_units = 1000
Invoer run 2main.tf
  name             = "ledger"
  config           = "nam-eur-asia1"
  display_name     = "Ledger"
  num_nodes = 3
Beide runs: dezelfde klasse, hetzelfde doel en dezelfde redenassessment.json
"id":"google_spanner_instance.ledger"
"class":"REDESIGN","confidence":"MEDIUM","target":{"service":"PostgreSQL Flex (single region) or a self-managed distributed SQL database — data-model redesign","resources":["stackit_postgresflex_instance"]
"reason":"Spanner's horizontal scale-out with external consistency (TrueTime) has no STACKIT counterpart. Workloads that fit one region move to PostgreSQL Flex (Spanner's PostgreSQL dialect eases this); truly global ones need a distributed SQL database operated on SKE."
  • Dezelfde uitvoer, andere workloads

    Klasse, doeldienst en reden waren in beide runs identiek. De configuratie staat als kritieke instelling voor dataresidentie in de lijst en de run kiest er geen optie op. Het lezen van de instanceconfiguratie is uw eerste ontwerpstap.

  • Waarop de keuze rust

    Spanner geeft aan dat externe consistentie de strengste garantie is, standaard toegepast of met serializable isolation, en dat TrueTime-tijdstempels clients in staat stellen consistent over een hele database te lezen, ook over regio's heen, zonder schrijfacties te blokkeren. Of uw applicatie daar over regio's heen op leunt of alleen binnen één regio, is het gegeven dat de opties van elkaar onderscheidt.

Vier opties vergeleken

OptieWaar het pastWat u op zich neemt
PostgreSQL Flex, één regioWorkloads die in één regio passen; het PostgreSQL-dialect van Spanner vergemakkelijkt de overstapQuery's en schema herschrijven; één regio; een replicaset van 3 nodes en dagelijkse back-ups met point-in-time recovery
Gedistribueerde SQL-database op SKEWorkloads die een gedistribueerde database met SQL nodig hebben, binnen STACKITU beheert het zelf: upgrades, back-ups, capaciteit, foutafhandeling; de run legt in de STACKIT-catalogus die hij controleerde geen zo'n managed service vast
Spanner laten staanEen datastore waarvan het consistentiemodel voor de applicatie onmisbaar isEen afhankelijkheid van Google Cloud blijft bestaan; netwerkpad, identiteit en latentie tussen clouds worden onderdeel van het ontwerp
De workload splitsenData die van nature regionaal is, zoals grootboeken per landRoutering en leesacties over regio's heen verhuizen naar de applicatie; algemene praktijk, geen resultaat van de engine

De feiten over PostgreSQL Flex komen van de architectuurpagina van STACKIT. De run noemt de eerste twee opties; de laatste twee zijn ontwerpkeuzes voor uw architect.

Wat de run aan u overlaat

De run laat negen kritieke semantische punten van de demo-eenheid open, die twaalf kritieke instellingen raken. Het rapport groepeert de instellingen in zes soorten, letterlijk in het paneel hieronder; dit zijn de beslissingen erachter.

  • Datamodel

    De keuze tussen de twee doelen en het redesign van het datamodel dat daarop volgt. Hier wordt niets als concept geschreven.

  • Dialect en DDL

    GoogleSQL of PostgreSQL-dialect bepaalt de SQL-syntaxis die de applicatie en de schemascripts gebruiken. De DDL wordt door een persoon opnieuw opgebouwd, omdat de doelen in de provider geen schema-resource hebben.

  • Versiebehoud

    Het point-in-time-venster van de Spanner-database, hier drie dagen, wordt het back-up- en herstelontwerp van wat Spanner vervangt.

  • Beveiliging tegen verwijderen

    deletion_protection is de eigen beveiliging van Terraform op de Spanner-database. Er is geen tegenhanger op STACKIT genoemd, dus beslis hierover samen met het gekozen doel.

  • Toegang

    Het leesrecht noemt een gebruiker en een rol. Het nieuwe doel heeft een eigen toegangsmodel, dus een persoon vertaalt het recht.

  • Namen en dataresidentie

    Databasenamen worden getoetst aan de applicaties die ze gebruiken, en de instanceconfiguratie aan uw eis voor dataresidentie.

De open instellingen en een schemaschets

Links: de gegroepeerde kritieke instellingen uit engineering/architect-report.md. Rechts: een handmatig geschreven schets van wat de twee interleaved tabellen op PostgreSQL worden. Het is geen uitvoer van de engine; de run noemt de DDL als instelling voor een persoon.

Kritieke instellingen die aan u zijn overgelatenengineering/architect-report.md
  - identity access (2; REVIEW 2): `google_spanner_database_iam_member.reader.member`, `google_spanner_database_iam_member.reader.role`
  - backup retention (1; REVIEW 1): `google_spanner_database.accounts.version_retention_period`
  - deletion protection (2; REVIEW 2): `google_spanner_database.accounts.deletion_protection`, `google_spanner_database.audit.deletion_protection`
  - residency compliance (1; REVIEW 1): `config`
  - workload compatibility (5; REVIEW 5): `name`, `google_spanner_database.accounts.database_dialect`, `google_spanner_database.accounts.name`, `google_spanner_database.audit.database_dialect`, `google_spanner_database.audit.name`
  - data semantics (1; REVIEW 1): `google_spanner_database.accounts.ddl`
Schemaschetsschema.sql
-- Sketch written by hand, not engine output.
-- Spanner DDL (input):  INTERLEAVE IN PARENT Accounts ON DELETE CASCADE
CREATE TABLE accounts (
  account_id varchar(36) PRIMARY KEY,
  owner      varchar(128),
  balance    numeric
);

CREATE TABLE entries (
  account_id varchar(36) NOT NULL REFERENCES accounts ON DELETE CASCADE,
  entry_id   varchar(36) NOT NULL,
  amount     numeric,
  created_at timestamptz,          -- was TIMESTAMP with allow_commit_timestamp
  PRIMARY KEY (account_id, entry_id)
);
  • Interleaving is fysiek, een foreign key is logisch

    Spanner-interleaving slaat onderliggende rijen naast de bovenliggende rij op en INTERLEAVE IN PARENT dwingt de relatie af. Een foreign key plaatst rijen niet bij elkaar. Op PostgreSQL blijft de relatie bestaan als constraint; het voordeel van nabijheid is een andere vraag.

  • Sleutels zijn voor Spanner ontworpen

    Spanner verdeelt data op sleutelbereik en de documentatie raadt gehashte, herordende of willekeurige sleutels aan om hotspots te vermijden. Die keuzes hebben uw sleutels gevormd; een primaire sleutel in PostgreSQL kent andere afwegingen, dus beoordeel de sleutels samen met het schema.

Zo beslist u, in volgorde

  1. Meet wat u werkelijk gebruikt

    Inventariseer welke transacties meerdere regio's omvatten en hoeveel verouderde data ze verdragen. Als alles binnen één regio blijft, staat de optie met één regio open.

  2. Leg de doelen voor beschikbaarheid en herstel vast

    Schrijf op welk herstelpunt en welke downtime het bedrijf accepteert. PostgreSQL Flex biedt een replicaset van 3 nodes, dagelijkse back-ups en point-in-time recovery vanuit de transactielogs; STACKIT geeft aan dat herstel naar een gekloonde instance gaat, niet naar de bestaande. Vergelijk dat met uw doel voordat u kiest.

  3. Reken het beheermodel door

    Een gedistribueerde database op SKE verlegt back-ups, upgrades en foutafhandeling naar uw team. Tel de mensen en de piketdienst mee, niet alleen de instances.

  4. Plan de dataverplaatsing

    Spanner kan een database via Dataflow als Avro-bestanden exporteren naar een Cloud Storage-bucket, desgewenst op een eerder tijdstip. Het laden in het doel, en het inhalen van wijzigingen na de export, is tooling die u zelf schrijft of kiest; de run kiest geen mechanisme.

  5. Pilot met één database

    Verplaats eerst één database met laag risico, met het gekozen doel en een rollback naar Spanner. Laat Spanner draaien totdat de nieuwe database echte belasting heeft verwerkt.

Vragen die architecten stellen

Waarom is er geen Terraform voor Spanner?

De eenheid is een redesign en de run schrijft er niets voor. De conceptmap bevat het providerbestand, de variabelen en een README die de instance noemt als punt dat aan de architect is overgelaten. Een doelresource verschijnt pas nadat u het doel hebt gekozen.

Maakt het PostgreSQL-dialect van Spanner van PostgreSQL Flex een drop-in?

Nee. Het dialect vergemakkelijkt de overstap, maar Google geeft aan dat sommige PostgreSQL-taalfuncties, zoals extensies, door de gebruiker gedefinieerde datatypen en stored procedures, niet worden ondersteund, en dat het dialect Spanner-specifieke uitbreidingen toevoegt, zoals interleaved tabellen en query hints. Code die voor Spanner is geschreven kan daarop steunen, dus die moet nog steeds worden getoetst aan standaard PostgreSQL.

Kunnen we Spanner houden en de rest op STACKIT draaien?

Ja, als ontwerpkeuze. De omgeving hangt dan voor die datastore af van Google Cloud, en het pad tussen clouds, de identiteit waarmee u erbij komt en de latentie worden onderdeel van het ontwerp. De run modelleert die optie niet.

Biedt STACKIT een globaal gedistribueerde relationele database?

De run legt vast dat de STACKIT-catalogus die hij controleerde er geen vermeldt; daarom is het tweede doel een database die u zelf op SKE beheert. Controleer de actuele STACKIT-catalogus wanneer u beslist.

Bronnen

Uw volgende stap: STACKIT.

Vertel ons over uw omgeving, dan laten wij zien wat StackToIT daarvoor oplevert: doelarchitectuur, Terraform-artefacten en een gestructureerd migratieplan.

Laat uw gegevens achter, onze specialisten nemen contact met u op.

Liever zelf een e-mail sturen? connect@stacktoit.com

Wij gebruiken uw gegevens alleen om dit verzoek te beantwoorden en een mogelijke pilot te bespreken. Privacyverklaring