Tämä jää helposti alkuvaiheessa taka-alalle. Vanha tietokanta kopioidaan uuteen ympäristöön ja ensimmäinen tarkistus näyttää hyvältä. Rivimäärät täsmäävät, sovellus käynnistyy ja muutama testi menee läpi.
Sitten joku muuttaa tuotteen hintaa vanhassa järjestelmässä.
Uudessa ympäristössä on edelleen vanha hinta.
Siitä alkaa varsinainen migraatio-ongelma.
Tietojen siirtäminen kerran on eri asia kuin kahden ympäristön pitäminen ajan tasalla toistensa kanssa. Jälkimmäisessä pitää tietää, mitä muuttui, milloin muutos tapahtui, missä se käsiteltiin ja mitä tehdään, jos sama muutos epäonnistuu matkalla.
Juuri näissä kohdissa pilvimigraatioissa tulee yleensä eniten yllätyksiä.
Ennen synkronointiratkaisun valintaa kannattaa selvittää, mistä muutokset oikeasti tulevat.
Tämä kuulostaa itsestään selvältä, mutta yrityksen järjestelmäympäristössä vastaus ei välttämättä ole “käyttäjä muuttaa tiedon tässä sovelluksessa”.
Asiakastieto voi tulla verkkopalvelusta. Myynti voi päivittää sitä CRM-järjestelmässä. Taloushallinto voi muuttaa laskutustietoa. Taustalla voi olla vielä integraatio, joka tuo tietoja toisesta järjestelmästä.
Jos uusi pilvijärjestelmä ottaa yhden näistä rooleista itselleen, samalla pitää päättää, mitä vanhoille kirjoituspoluille tapahtuu.
Muuten päädytään helposti tilanteeseen, jossa sama asiakas muuttuu kahdessa paikassa.
Esimerkiksi:
Mikä on lopullinen arvo?
Jos tähän ei ole vastausta, tekninen synkronointiratkaisu ei ratkaise ongelmaa. Se vain siirtää epäselvyyden järjestelmästä toiseen.
Kaksisuuntainen synkronointi kuulostaa aluksi joustavalta.
Todellisuudessa se voi tehdä migraatiosta huomattavasti vaikeamman.
Jos vanha järjestelmä kirjoittaa uuteen ympäristöön ja uusi ympäristö kirjoittaa takaisin vanhaan, jokaiselle tietotyypille pitää pystyä vastaamaan esimerkiksi seuraaviin kysymyksiin:
Jos liiketoiminta sallii sen, yksisuuntainen malli on usein helpompi hallita. Vanha järjestelmä voi olla jonkin aikaa ainoa kirjoittaja ja uusi ympäristö vastaanottaa muutokset. Myöhemmin kirjoitukset voidaan siirtää uuteen järjestelmään.
Se ei sovi jokaiseen ympäristöön, mutta se on usein helpompi kuin rakentaa heti täysi kaksisuuntainen synkronointi.
Tämä on yksi niistä ongelmista, joita ei välttämättä huomata pienessä testissä.
Asiakkaan tila muuttuu näin: pending → approved → completed
Jos nämä kolme muutosta käsitellään samassa järjestyksessä, ongelmaa ei ole.
Mutta jos completed saapuu ensin ja approved vasta sen jälkeen, uusi järjestelmä voi kirjoittaa asiakkaalle vanhemman tilan.
Siksi tapahtuman mukana tarvitaan usein jonkinlainen järjestystä kuvaava tieto.
Se voi olla versionumero, sequence number, tietokannan oma muutosjärjestys tai muu lähdejärjestelmän tarjoama mekanismi.
Aikaleimaan kannattaa suhtautua varauksella. Se ei yksinään välttämättä kerro tapahtumien todellista järjestystä, varsinkaan jos mukana on useita palvelimia tai järjestelmiä.
Viesti- ja tapahtumapohjaisissa järjestelmissä kannattaa olettaa, että viesti voidaan vastaanottaa uudelleen.
Tämä ei ole välttämättä virhe.
Jos käsittely on esimerkiksi: lisää tilaukseen 100 euroa
sama tapahtuma kahdesti voi aiheuttaa ongelman.
Jos käsittely taas on: aseta tilauksen kokonaissummaksi 100 euroa
toinen käsittely ei välttämättä muuta lopputulosta.
Tässä on idempotenssin käytännön merkitys.
Migraation aikana tätä ei kannata jättää myöhemmäksi. Kun vanhaa ja uutta järjestelmää ajetaan rinnakkain, uudelleenlähetyksiä ja korjaustilanteita tulee ennemmin tai myöhemmin vastaan.
Yksi yleinen tapa on käyttää tapahtuman yksilöllistä tunnistetta ja säilyttää tieto jo käsitellyistä tapahtumista. Toteutus riippuu järjestelmästä, mutta periaate on sama: vastaanottajan pitää pystyä tunnistamaan, että sama asia on jo käsitelty.
Pienen tietokannan kanssa lähes mikä tahansa järkevä siirtotapa voi tuntua toimivalta.
Kun rivejä on kymmeniä tai satoja miljoonia, tilanne muuttuu.
Kaikkea ei ehkä voida siirtää yhdellä kertaa. Siirto voidaan joutua tekemään erissä esimerkiksi tunnisteen, päivämäärän tai muun avaimen perusteella.
Tällöin pitää myös tietää, missä kohtaa siirto on menossa.
Jos prosessi pysähtyy 67 prosentin kohdalla, sen pitäisi pystyä jatkamaan siitä eikä aloittaa kaikkea alusta.
Myös tämä vaikuttaa synkronointiin. Samaan aikaan kun vanhaa dataa kopioidaan, uutta dataa syntyy jatkuvasti.
Siksi alkuperäinen siirto ja muuttuneiden tietojen seuranta pitää sovittaa yhteen.
“Kaikki rivit täsmäävät” ei tarkoita, että data on oikein
Tämä on tärkeä ero.
Kuvitellaan, että molemmissa järjestelmissä on miljoona tilausta.
Rivimäärä täsmää.
Silti yksi tilaus voi olla väärässä tilassa, yhden asiakkaan laskutustiedot voivat puuttua ja joidenkin tuotteiden hinnat voivat olla vanhoja.
Siksi täsmäytyksessä kannattaa verrata myös sisältöä.
Kaikkea ei tarvitse vertailla joka kerta yksittäinen kenttä kerrallaan. Käytännössä voidaan käyttää esimerkiksi tarkistussummia, aggregaatteja, versiotietoja tai valittuja liiketoimintakriittisiä kenttiä.
Talousdatassa voidaan verrata summia. Varastotiedoissa saldoja. Tilauksissa tilajakaumaa. Asiakasdatassa tietueiden määrää ja viimeisimpien muutosten ajankohtaa.
Tarkistus pitää valita datan mukaan.
Yksi huonoimmista vaihtoehdoista on tämä:
Lokissa voi näkyä virhe, mutta data on silti kadonnut synkronoinnista.
Parempi ratkaisu on pitää epäonnistunut tapahtuma tallessa, jotta se voidaan käsitellä uudelleen.
Tässä viestijono tai muu pysyvä välityskerros voi olla hyödyllinen. Myös dead-letter-mekanismi voi olla tarpeen, jos tietty tapahtuma epäonnistuu toistuvasti.
Mutta myöskään dead-letter-jono ei ole paikka, johon ongelmat voidaan vain unohtaa.
Jonossa pitää olla seuranta. Muuten siellä voi olla kuukausien ajan vanhoja tapahtumia, joita kukaan ei huomaa.
Kehitysympäristössä synkronointi voi toimia hyvin, koska dataa on vähän ja tapahtumia tulee harvoin.
Tuotannossa sama putki voi joutua käsittelemään tuhansia muutoksia minuutissa.
Lisäksi tuotannossa mukana ovat oikeat integraatiot, oikeat käyttäjät ja kaikki ne pienet poikkeamat, joita testidatassa ei ollut.
Siksi synkronointia pitäisi testata myös kuormalla.
Esimerkiksi:
Näihin testeihin kannattaa käyttää aikaa ennen varsinaista siirtymää.
Reaaliaikaisuudesta on tullut monessa arkkitehtuurissa oletus.
Migraatiossa se ei aina ole tarpeen.
Jos esimerkiksi vanhaa raportointijärjestelmää käytetään kerran tunnissa, jatkuva sekuntitason synkronointi voi tuoda enemmän teknistä monimutkaisuutta kuin hyötyä.
Toisaalta tilaustenkäsittelyssä tai maksamiseen liittyvässä tiedossa muutaman tunnin viive voi olla täysin mahdoton.
Synkronointivaatimus kannattaa siis johtaa liiketoiminnasta.
Ei siitä, mitä pilviarkkitehtuurissa sattuu olemaan tarjolla.
Teknologia voi olla kunnossa ja synkronointi silti epäonnistua.
Syynä voi olla esimerkiksi se, ettei kukaan tiedä, kuka tarkistaa täsmäytyksen. Tai virhejonossa oleville tapahtumille ei ole sovittu omistajaa.
Tuotantoon siirryttäessä pitäisi olla selvää:
Nämä eivät ole vain projektinhallinnan kysymyksiä. Ne vaikuttavat suoraan siihen, voidaanko migraatio tehdä turvallisesti.
Jos tietokanta voidaan pysäyttää lyhyeksi aikaa ja koko siirto voidaan tehdä hallitusti, jatkuvan synkronoinnin rakentaminen ei välttämättä ole järkevää.
Jos käyttökatkoa ei voida hyväksyä, tilanne on toinen.
Silloin voidaan käyttää esimerkiksi vaiheittaista migraatiota, CDC:tä, tapahtumapohjaista siirtoa tai näiden yhdistelmää.
Joskus paras ratkaisu on aloittaa pienestä osasta dataa. Ensin siirretään yksi liiketoimintakokonaisuus, seurataan sitä tuotannossa ja vasta sen jälkeen laajennetaan.
Tämä antaa myös mahdollisuuden löytää virheitä silloin, kun niiden vaikutus on vielä rajallinen.
Pilvimigraation datan synkronointi on ennen kaikkea jatkuvan muutoksen hallintaa.
Alkuperäinen datasiirto on vain yksi vaihe. Sen jälkeen järjestelmien pitää selvitä päivityksistä, virheistä, katkoista, järjestysongelmista ja mahdollisesti muuttuvasta tietomallista.
Jos nämä asiat suunnitellaan vasta migraation loppuvaiheessa, vaihtoehdot ovat usein jo vähissä.
Parempi hetki on silloin, kun päätetään, miten vanha ja uusi ympäristö toimivat rinnakkain.
Silloin voidaan vielä päättää, kumpi järjestelmä kirjoittaa, miten muutokset havaitaan, kuinka niitä voidaan palauttaa ja miten tiedetään, että data on lopulta sama.
Se tekee migraatiosta paljon rauhallisemman myös tuotantopäivänä.