MIGRATIEDRAAIBOEK · DATA

Een praktisch draaiboek voor datamigratie naar STACKIT

Data naar STACKIT verplaatsen is per opslag één herhaalbare reeks: preflight, proefrun, kopie, schrijfstop, laatste synchronisatie, reconcile, opruimen. Wat verschilt tussen een PostgreSQL-database, een bucket, een volume en een cache is de methode. StackToIT verplaatst zelf nooit data; het somt de stateful eenheden van uw omgeving op, biedt per eenheid de gedocumenteerde methoden aan en schrijft de controles die moeten slagen voordat u de verplaatsing accepteert. Dit draaiboek doorloopt die reeks op een omgeving met vier opslagen.

De reeks, opslag voor opslag

  1. 1. Som de stateful eenheden op

    Begin bij migration/data-movement.md. Het noemt elke eenheid die eigen data bevat: een database, een cache, een blokvolume, een objectopslag. Wachtrijen en het systeem op de schijf van een server worden niet als stateful gelezen. De ingerichte capaciteit naast een eenheid is wat is ingericht, niet de omvang van de data.

  2. 2. Noem de cijfers die de bron niet kent

    Omvang van de data, wijzigingssnelheid, bandbreedte, herstelpunt, hersteltijd en toegestane downtime staan nooit in de Terraform. De run markeert elk als UNKNOWN totdat u die aanlevert, en een duur die de run afdrukt, is slechts een ondergrens van de overdracht. Zonder deze cijfers is niet aan te tonen dat een methode in een venster past.

  3. 3. Kies één methode per opslag

    Het plan noemt per eenheid kandidaatmethoden en markeert andere als niet ondersteund, met de reden. De keuze is een vastgelegde beslissing, geen standaardwaarde. De tabel hieronder toont de vier opslagen van deze run.

  4. 4. Preflight

    Los de voorwaarden op die de preflight controleert voordat er iets wordt gekopieerd: extensies, rollen en TLS op de database, versies en gearchiveerde objecten in de bucket, het bestandssysteem en de vrije ruimte op het volume, de commando's die de kopie nodig heeft en de client-TLS-instellingen op de cache. Enkele voorwaarden, zoals objectmetadata, worden juist tijdens de proefrun afgedekt.

  5. 5. Oefenen

    Kopieer één keer naar het lege doel terwijl de bron in bedrijf blijft en meet de werkelijke doorvoer. De proefrun is waar een inschatting van het venster een getal wordt dat u kunt verdedigen.

  6. 6. Schrijfstop, laatste synchronisatie

    Stop de schrijvers, kopieer wat sinds de laatste ronde is gewijzigd en laat de bron ongemoeid. Voor objectopslag legt het plan een eerste kopie en een deltasynchronisatie vóór de schrijfstop vast, zodat het bevroren deel kort is.

  7. 7. Reconcile

    Vergelijk beide kanten terwijl de schrijvers nog stilstaan: rijtellingen, checksums en sequences voor de database, objectaantallen en bytes voor de bucket, sleutelaantallen en sleutellijsten voor de cache. Accepteer de verplaatsing alleen na een vastgelegde GO.

  8. 8. Overschakelen, daarna opruimen

    Wijs de clients naar het doel, bewaar de bron gedurende de periode die de eigenaar vastlegt en verwijder daarna tijdelijke sleutels, dumpbestanden en de verplaatsingshost. De sleutel voor Object Storage is het belangrijkst: inloggegevens die in een project zijn aangemaakt, geven toegang tot elke bucket in dat project (docs).

Vier stateful eenheden, opgesomd

Een omgeving die voor deze pagina is geschreven en op 4 november 2026 door StackToIT is beoordeeld: een PostgreSQL-database, een bucket met versioning, een blokvolume en een cache. Eerste twee panelen: de blokken met data uit de invoer als twee letterlijke regelbereiken van main.tf, van de database tot het volume en daarna de cache (de netwerk-, server- en koppelblokken eromheen zijn weggelaten). Laatste venster: de tabel bovenaan migration/data-movement.md, ongewijzigd; op een smal scherm scrolt die zijwaarts.

Voorbeeldinvoermain.tf
resource "aws_db_instance" "orders" {
  identifier              = "orders-db"
  engine                  = "postgres"
  engine_version          = "15.7"
  instance_class          = "db.m5.large"
  allocated_storage       = 200
  storage_type            = "gp3"
  username                = "orders"
  password                = var.db_password
  db_subnet_group_name    = aws_db_subnet_group.main.name
  multi_az                = true
  backup_retention_period = 7
  skip_final_snapshot     = true
}

resource "aws_s3_bucket" "uploads" {
  bucket = "acme-orders-uploads"
}

resource "aws_s3_bucket_versioning" "uploads" {
  bucket = aws_s3_bucket.uploads.id
  versioning_configuration {
    status = "Enabled"
  }
}

resource "aws_ebs_volume" "reports" {
  availability_zone = "eu-central-1a"
  size              = 500
  type              = "gp3"
}
Voorbeeldinvoermain.tf
resource "aws_elasticache_cluster" "sessions" {
  cluster_id        = "sessions"
  engine            = "redis"
  engine_version    = "7.0"
  node_type         = "cache.t3.small"
  num_cache_nodes   = 1
  subnet_group_name = "sessions"
}
StackToIT-dataverplaatsingmigration/data-movement.md
| Unit | Source service | Target service | Application | Mechanism | State | Data class | RPO | Downtime tolerance |
|---|---|---|---|---|---|---|---|---|
| aws_db_instance.orders | aws_db_instance | STACKIT PostgreSQL Flex |  | UNKNOWN | DECISION_REQUIRED | NOT_PROVIDED | NOT_PROVIDED | NOT_PROVIDED |
| aws_ebs_volume.reports | aws_ebs_volume | STACKIT Block Storage |  | UNKNOWN | DECISION_REQUIRED | NOT_PROVIDED | NOT_PROVIDED | NOT_PROVIDED |
| aws_elasticache_cluster.sessions | aws_elasticache_cluster | STACKIT Key Value Store (Valkey) |  | UNKNOWN | DECISION_REQUIRED | NOT_PROVIDED | NOT_PROVIDED | NOT_PROVIDED |
| aws_s3_bucket.uploads | aws_s3_bucket | STACKIT Object Storage |  | UNKNOWN | DECISION_REQUIRED | NOT_PROVIDED | NOT_PROVIDED | NOT_PROVIDED |
  • Elk mechanisme begint als UNKNOWN

    Vier eenheden, vier DECISION_REQUIRED-statussen. De dataklasse, het herstelpunt en de toegestane downtime komen woordelijk uit het applicatiebestand van de klant; zonder bestand blijven ze NOT_PROVIDED en wordt geen standaardwaarde aangenomen.

  • Het volume heeft één open methode

    Voor het blokvolume wordt alleen een kopie op bestandsniveau tussen servers aangeboden, dus het uitvoeringsplan kiest die. De andere drie eenheden wachten op uw antwoord.

  • Er wordt niets uitgevoerd

    Het bestand zegt het in de eerste regels: StackToIT verplaatst nooit data. Elke stap in het plan is bedoeld voor een mens.

Welke methode voor welke opslag

Zoals de run ze noemt. Hulpmiddelen die in een methode worden genoemd, installeert en draait de operator zelf; het plan voert ze niet uit en verifieert ze niet.

Opslag en doelMethoden die het plan noemtNiet aangeboden, en waarom
PostgreSQL 15.7-database → PostgreSQL Flex (versies 14–18 aangeboden)Export en import met de engine-clients (dump en restore); logische replicatie; een eigen tool. Logische replicatie vereist dat de instelling voor logische replicatie van de bron aan staat, wat daar een parameterwijziging en een herstart betekent, en een ongelezen replicatieslot vult de opslag van de bron.Niets is doorgestreept. Schema, latere DDL, sequences en large objects worden niet door logische replicatie gerepliceerd: het schema wordt eerst gekopieerd en de sequences bij de schrijfstop.
Bucket met versioning → Object StorageKopiëren met rclone, of synchroniseren met de AWS-opdrachtregel; een eigen tool. Het plan legt een eerste kopie, een deltasynchronisatie, een schrijfstop en een laatste synchronisatie vast.S3-replicatie: de AWS-documentatie noemt alleen S3-buckets als bestemming, dus het plan biedt een kopie. Een kopie van de actuele objecten bevat geen oudere versies, delete markers, retentie, ACL's of policies; de voorwaarde voor versies staat op FAILS totdat u beslist dat de geschiedenis gewenst is.
Blokvolume van 500 GiB → Block StorageKopie op bestandsniveau tussen servers, bijvoorbeeld met rsync, met een ronde terwijl de services draaien en een laatste ronde binnen de schrijfstop.Imagekopie op blokniveau: geen enkele gelezen pagina zegt dat een image van een datadisk de bron van een STACKIT-volume kan zijn, en een AWS-snapshot heeft geen exportpad dat het plan kan noemen.
Redis 7.0-cache → Key Value Store (Valkey)Een client die sleutels kopieert (scan, dump, restore) binnen de schrijfstop, zoals in de STACKIT-tutorial, die als alternatief het commando MIGRATE en een script gebruikt.Een geëxporteerd back-upbestand laden en repliceren vanaf de oude primary: geen STACKIT-pagina of API die de run las, documenteert een van beide, en de cache in de bron biedt geen replicatiecommando's.

De methode voor de cache is afgeleid uit de procedure van de tutorial en is door StackToIT niet uitgevoerd tegen een Key Value Store, zoals het plan zelf vermeldt. De tutorial noemt gemiddeld ongeveer 50 seconden per gigabyte en waarschuwt dat sleutels met regeleinden de pipe van de opdrachtregel kunnen verbreken.

De stappen en de controles van één verplaatsing

Uit migration/data-movement-plan.json, voor de methode dump en restore van de database. Links: de zes stappen. Rechts: de controles op rijtellingen, checksums en sequences, met het exacte commando dat elke controle noemt.

Stappen van de methodemigration/data-movement-plan.json
          "steps": [
            {
              "kind": "preflight",
              "id": "MAN/data/aws_db_instance.orders/preflight",
              "in_plan": true
            },
            {
              "kind": "rehearsal",
              "id": "MAN/data/aws_db_instance.orders/rehearsal",
              "in_plan": true
            },
            {
              "kind": "write-freeze",
              "id": "MAN/data/aws_db_instance.orders/write-freeze/dump-restore",
              "in_plan": true
            },
            {
              "kind": "final-sync",
              "id": "MAN/data/aws_db_instance.orders/final-sync/dump-restore",
              "in_plan": true
            },
            {
              "kind": "reconcile",
              "id": "MAN/data/aws_db_instance.orders/reconcile/dump-restore",
              "in_plan": true
            },
            {
              "kind": "cleanup",
              "id": "MAN/data/aws_db_instance.orders/cleanup/dump-restore",
              "in_plan": true
            }
          ],
Controles na de overdrachtmigration/data-movement-plan.json
            {
              "id": "row-counts",
              "kind": "COUNT_COMPARISON",
              "mode": "COMMAND",
              "what": "Count the rows of every table on both sides, with the writers stopped (an exact count of each table; the estimates of pg_stat_user_tables are not counts).",
              "expected": "the same tables with the same number of rows on both sides",
              "command": "SELECT format('SELECT %L AS tbl, count(*) FROM %I.%I;', schemaname || '.' || tablename, schemaname, tablename) FROM pg_tables WHERE schemaname NOT IN ('pg_catalog', 'information_schema') \\gexec"
            },
            {
              "id": "table-checksums",
              "kind": "CONTENT_CHECK",
              "mode": "COMMAND",
              "what": "Take the md5 of the rows of every keyed table that matters on both sides, ordered by its key (a key range for a large table; DateStyle, TimeZone and extra_float_digits equal in both sessions).",
              "expected": "the row count and the md5 are equal on both sides for every table checked",
              "command": "SELECT count(*), md5(string_agg(t::text, ',' ORDER BY t.<key-column>)) FROM <schema>.<table> t;",
              "not_provided": [
                "the key column of each table (<key-column>)",
                "the tables that matter"
              ]
            },
            {
              "id": "sequences",
              "kind": "CONTENT_CHECK",
              "mode": "COMMAND",
              "what": "Compare the position of every sequence on both sides, so that the first insert on the target does not repeat a key.",
              "expected": "the positions are equal, or the target's is higher",
              "command": "SELECT sequencename, last_value FROM pg_sequences ORDER BY 1;"
            },
  • Controles vergelijken in plaats van te vertrouwen

    Elke controle vermeldt wat die vergelijkt en welk resultaat als gelijk telt. Rijtellingen gebruiken een exacte telling van elke tabel, niet de schattingen van de planner; checksums vereisen een sleutelkolom per tabel die u noemt.

  • Sommige controles liggen bewust bij u

    De applicatiecontrole en de rollbackgrens zijn als handmatig gemarkeerd: het lezen en het schrijven horen bij de applicatie, en hoe lang de bron wordt bewaard, is een beslissing van de eigenaar. Het plan noemt de grens en geen datum.

  • Rollback is de onaangeroerde bron

    Bij een NO-GO wijzen de clients nog naar de bron, die actueel is tot de schrijfstop. Tot het doel na de omschakeling de eerste schrijfactie accepteert, is een rollback slechts het terugzetten van de verbindingsinstellingen. Daarna maken de eigen dagelijkse back-ups van PostgreSQL Flex met transactielogs een point-in-time restore mogelijk, maar alleen in een nieuwe instance in hetzelfde project; een in-place restore bestaat niet, dus de clients worden opnieuw omgezet (docs).

Beslissingen die de architect neemt

  • Methode per opslag

    Dump en restore tegenover logische replicatie is een afweging tussen een langere schrijfstop en een wijziging aan de bron. Beslis zodra de omvang en de toegestane downtime zijn vastgesteld.

  • Versiegeschiedenis van de bucket

    Kopieer alleen actuele objecten, of plan de procedure voor versies en delete markers. De standaardkopie neemt geen geschiedenis mee.

  • Rechten en rollen

    Rollen, grants en extensies van de database worden op het doel opnieuw aangemaakt; het plan noemt de queries die ze uit de bron lezen.

  • Sessies in de cache

    Of een sessiecache het kopiëren waard is, of gebruikers gewoon opnieuw inloggen, is een zakelijke afweging. Die kijk op de zaak is gangbare praktijk, geen bevinding van de run.

  • Hoe lang de bron blijft

    De datum tot wanneer de bron wordt bewaard, en of schrijfacties op het doel worden teruggekopieerd of als verloren worden geaccepteerd.

Vragen over datamigratie

Kopieert StackToIT mijn data?

Nee. Het somt de stateful eenheden, de kandidaatmethoden, de voorwaarden en de controles op en maakt geen verbinding met uw data. Een mens of uw eigen tooling voert elke stap uit.

Hoe lang duurt de kopie?

De run kan dat niet zeggen. Een duur is een ondergrens, berekend uit de omvang van de data en de bandbreedte die u opgeeft, en geeft alleen aan of die ondergrens de geaccepteerde downtime al overschrijdt. Meet de doorvoer in de proefrun.

Kan ik de databases online houden tijdens de verplaatsing?

Logische replicatie houdt de bron in bedrijf tot de schrijfstop, ten koste van een herstart van de bron en een replicatieslot dat u moet bewaken. Dump en restore draaien binnen de schrijfstop, dus die duurt zo lang als de dump, de restore en de controles.

Wat gebeurt er met bucketversies en ACL's?

Een kopie van actuele objecten neemt geen van beide mee. Het plan markeert de voorwaarde voor versies en verwijst naar de controles die tonen of de bron ze heeft.

Hoe draai ik het terug?

Wijs vóór de eerste schrijfactie op het doel de clients terug naar de bron. Daarna bepaalt de vastgelegde rollbackgrens van de eigenaar of schrijfacties worden teruggekopieerd of verloren gaan.

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