Zero Downtime Deployment ma Databases

Zero Downtime Deployment ma Databases

O lenei tusiga o loʻo faʻamatalaina auiliili pe faʻafefea ona foia faʻafitauli fesoʻotaʻiga faʻamaumauga i le faʻapipiʻiina. Matou te taʻuina atu ia te oe le mea e mafai ona tupu i au gaosiga o talosaga pe afai e te taumafai e faʻapipiʻi e aunoa ma se sauniuniga muamua. Ona matou uia lea i laasaga o le olaga o le talosaga e manaʻomia ina ia leai se taimi faʻaletonu (tusa. laina: toe - leai se taimi malolo). O le taunuuga oa tatou gaioiga o le a faʻaaogaina le suiga o faʻamaumauga tuʻufaʻatasiga i tua i se auala e fetaui i tua.

Afai e te manaʻo e malamalama i faʻataʻitaʻiga code mai le tusiga, e mafai ona e mauaina i latou i GitHub.

Faatomuaga

Le fa'atinoina ole taimi fa'aletonu

Oka se mea lilo leai se taimi malolo fa'agaioiina? E mafai ona e fai atu o le taimi lea e faʻapipiʻiina ai lau talosaga i se auala e mafai ai ona e faʻafeiloaʻi ma le manuia se faʻamatalaga fou o le talosaga i le gaosiga, ae e le o iloa e le tagata faʻaoga lona le avanoa. Mai se tagata faʻaoga ma le kamupani, o le faʻataʻitaʻiga sili lea ona mafai ona tuʻuina atu aua e mafai ai ona faʻaalia foliga fou ma faʻapipiʻi faʻamau e aunoa ma le faʻalavelave.

E faapefea ona ausia lenei mea? E tele auala, o se tasi lenei:

  • fa'atino le numera 1 o lau 'au'aunaga
  • faia se femalaga'iga fa'amaumauga
  • Fa'atu le fa'asologa #2 o lau 'au'aunaga fa'atasi ma le version #1
  • o le taimi lava e te vaʻai ai o loʻo galue le numera Nu. 2 e pei ona tatau ai, aveese le numera Nu. 1
  • sauni!

Faigofie, a ea? Ae paga lea, e le faigofie tele, ma o le a tatou tilotilo i ai i se auiliiliga mulimuli ane. Ia se'i o tatou siaki le isi faiga masani fa'apipi'i - blue green deployment.

Na e faʻalogo ile fa'apipi'i lanu meamata lanumoana? Cloud Foundry e matua faigofie lava. Na'o le vaai lenei tusitusiga, lea matou te faʻamatalaina atili ai lenei mea. Ina ia otootoina faapuupuu, sei matou faamanatu atu ia te oe le auala e fai ai le faʻapipiʻiina o lanu meamata lanumoana:

  • fa'amautinoa e lua kopi o lau fa'ailoga ("lanumoana" ma le "lanumeamata") e galue;
  • faʻatonu auala uma i le siosiomaga lanumoana, i.e. ina ia fa'asino i ai URL o le gaosiga;
  • fa'apipi'i ma fa'ata'ita'i suiga uma o talosaga i se si'osi'omaga lanu meamata;
  • sui urls mai le lanumoana ile si'osi'omaga lanu meamata

Blue green deployment o se auala e mafai ai ona faigofie ona faʻaalia foliga fou e aunoa ma le popole e uiga i le gau o gaosiga. E mafua ona o le mea moni e tusa lava pe tupu se mea, e faigofie lava ona e toe foʻi i tua i le siʻosiʻomaga talu ai i le na o le "faʻafefe o se ki."

A maeʻa ona e faitauina mea uma o loʻo i luga, e mafai ona e fesiligia le fesili: O le a le mea e fai e leai se taimi e faʻaogaina ai le Blue green deployment?

Ia, e tele naua mea e tutusa ai, talu ai o le tausia o kopi e lua o le siosiomaga e tasi e manaʻomia ai le faaluaina o taumafaiga e tausia ai. O le mea lea e fai mai ai nisi 'au Matini Fowler, mulimuli i se fesuiaiga o lenei auala:

O le isi filifiliga o le faʻaogaina lea o faʻamaumauga e tasi, fatuina o lanu lanumoana-lanumeamata mo le upega tafaʻilagi ma faʻasalalauga. I lenei faiga, o le database e masani ona avea ma faʻafitauli, aemaise lava pe a manaʻomia le suia o lana fuafuaga e lagolago ai se faʻamatalaga fou o le polokalama.

Ma o iinei tatou te oʻo mai i le faʻafitauli autu i lenei tusiga. Faʻamaumauga. Se'i toe va'ai i le fasifuaitau lea.

faia se femalaga'iga fa'amaumauga.

O lea la e tatau ona e fesili ifo ia te oe lava i le fesili - fa'afefea pe afai e le fetaui i tua le suiga o le database? E le malepe la'u lomiga muamua o le app? O le mea moni, o le mea tonu lava lea o le a tupu ...

O lea la, e ui lava i le tele o faʻamanuiaga o le zero downtime / blue green deployment, e masani ona mulimulitaʻi kamupani i le auala sili atu ona saogalemu mo le faʻaogaina oa latou talosaga:

  • saunia se afifi ma se lomiga fou o le talosaga
  • tapuni se tusi talosaga
  • fa'agasolo tusitusiga e fa'asolo ai le fa'amaumauga
  • fa'apipi'i ma fa'alauiloa se lomiga fou o le talosaga

I totonu o lenei tusiga, matou te faʻamatalaina pe faʻafefea ona e galue ma lau faʻamaumauga ma faʻailoga e faʻaoga lelei ai le faʻaogaina o le taimi e leai se taimi.

Fa'afitauli fa'amaumauga

Afai ei ai sau talosaga e leai ni setete e le teuina ni faʻamatalaga i totonu o faʻamaumauga, e mafai ona e maua le leai o se taimi faʻapipiʻi vave. Ae paga lea, o le tele o polokalama e manaʻomia le teuina o faʻamatalaga i se mea. Ole mea lea e tatau ai ona e mafaufau faalua aʻo leʻi faia ni suiga ile matagaluega. Ae tatou te le'i o'o i fa'amatalaga i le auala e sui ai le fuafuaga ina ia leai se taimi malolo deployment e mafai, se'i o tatou taula'i muamua i le fa'aliliuga schema.

Faiga fa'aliliuga

I lenei tusiga o le a matou faʻaaogaina Auala lele e fai ma meafaigaluega e pulea fa'aliliuga (tusa. Fa'aliliuga: o lo'o matou talanoa e uiga i femalagaiga fa'amaumauga). E masani lava, o le a matou tusia foi se talosaga Spring Boot lea ua fausia i totonu o le Flyway lagolago ma o le a fa'atinoina le schema migration a'o fa'atūina le fa'asologa o talosaga. A faʻaaogaina Flyway, e mafai ona e teuina faʻamaumauga o femalagaiga i totonu o lau faila o galuega (e ala i le faaletonu ile classpath:db/migration). O iinei e mafai ona e vaʻai i se faʻataʻitaʻiga o ia faila femalagaiga

└── db
 └── migration
     ├── V1__init.sql
     ├── V2__Add_surname.sql
     ├── V3__Final_migration.sql
     └── V4__Remove_lastname.sql

I lenei faʻataʻitaʻiga tatou te vaʻai i 4 migration scripts, afai e leʻi faia muamua, o le a faʻataunuʻuina le tasi ma le isi pe a amata le talosaga. Sei o tatou tilotilo i se tasi o faila (V1__init.sql) e fai ma fa'ata'ita'iga.

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

O mea uma lava e fa'amalamalama lelei: e mafai ona e fa'aogaina le SQL e fa'amatala ai pe fa'afefea ona suia lau fa'amaumauga. Mo nisi fa'amatalaga e uiga i Spring Boot ma Flyway, siaki Spring Boot Docs.

I le faʻaaogaina o se mea e faʻatonutonu ai punaoa ma Spring Boot, e te maua ai ni faʻamanuiaga tetele se 2:

  • e te tu'u'ese'ese suiga fa'amaumauga mai suiga fa'ailoga
  • O femalaga'iga fa'amaumauga e tupu fa'atasi ma le fa'agasolo atu o lau talosaga, i.e. ua fa'afaigofieina lou fa'agaioiina

Fa'afitauli fa'afitauli fa'amaumauga

I le isi vaega o le tusiga, o le a tatou taulai atu i le vaʻavaʻai i auala e lua i suiga o faʻamaumauga.

  • le fetaui i tua
  • fetaui i tua

O le mea muamua o le a manatu o se lapataiga e le tatau ona e faia le zero downtime deployment e aunoa ma le sauniuni muamua ... O le lona lua e ofoina atu se fofo ile auala e mafai ai ona e faia se faʻapipiʻi e aunoa ma le faʻalavelave ma i le taimi lava e tasi e faʻatumauina le fetaui i tua.

O la matou poloketi o le a matou galulue ai o se talosaga faigofie Spring Boot Flyway lea e iai Person с first_name и last_name i totonu o fa'amaumauga (tusa. fa'aliliuga: Person o se laulau ma first_name и last_name - o fanua ia i totonu). Matou te fia toe faaigoa last_name в surname.

Mafaufauga

Ae tatou te leʻi oʻo i faʻamatalaga, e iai ni manatu se lua e manaʻomia ona tatou faia e uiga ia tatou talosaga. O le taunuuga autu tatou te mananao e ausia o le a fai lava si faigofie faiga.

Zametka. Pisinisi PRO-TIP. O le fa'afaigofieina o faiga e mafai ona fa'asaoina ai oe i le tele o tupe i le lagolago (o le tele o tagata o lo'o e faigaluega mo lau kamupani, o le tele foi lea o le tupe e mafai ona e fa'asaoina)!

Leai se mana'omia e toe fa'afo'i le fa'amaumauga

E fa'afaigofieina le fa'agaioiina o le fa'agaioiga (o nisi fa'amaumauga fa'amaumauga e toetoe a le mafai, e pei o le tapeina o le solomuli). Matou te fiafia e toe fa'afo'i na'o talosaga. I lenei auala, e tusa lava pe i ai au faʻamaumauga eseese (mo se faʻataʻitaʻiga, SQL ma NoSQL), o lau paipa faʻapipiʻi o le a foliga tutusa.

E tatau ona mafai pea ona toe fa'afo'i le talosaga ile tasi fa'asologa i tua (leai se toe)

E tatau ona toe fa'afo'i pe a mana'omia. Afai ei ai se pusa i le lomiga o loʻo i ai nei e le faigofie ona faʻaleleia, e tatau ona mafai ona tatou toe foʻi i le lomiga fou o galuega. Matou te manatu o lenei faʻamatalaga galue fou o le mea muamua lea. O le fa'atumauina o le fa'aogaina o fa'amaumauga ma fa'amaumauga mo le sili atu ma le tasi le fa'asalalauga o le a matua faigata ma taugata.

O le tusi. Mo le sili atu le faigofie ona faitau, i lenei tusiga o le a tatou suia le tele o faʻamatalaga o le talosaga.

Laasaga 1: Tulaga Muamua

Fa'asologa o polokalame: 1.0.0
DB version: v1

manatu

Ole tulaga muamua lea ole talosaga.

Suiga fa'amaumauga

DB e iai last_name.

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

Suiga code

O lo'o teuina e le talosaga fa'amaumauga a Tagata i totonu last_name:

/*
 * Copyright 2012-2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package sample.flyway;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String lastName;

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return this.lastName;
    }

    public void setLastName(String lastname) {
        this.lastName = lastname;
    }

    @Override
    public String toString() {
        return "Person [firstName=" + this.firstName + ", lastName=" + this.lastName
                + "]";
    }
}

Toe fa'aigoaina koluma e le fetaui i tua

Se'i o tatou va'ai i se fa'ata'ita'iga pe fa'afefea ona sui se igoa koluma:

Faalogo O le faʻataʻitaʻiga o loʻo mulimuli mai o le a malepe ma le loto i ai. Matou te faʻaalia lenei mea e faʻaalia ai le faʻafitauli o fesoʻotaʻiga faʻamaumauga.

Fa'asologa o polokalame: 2.0.0.BAD

DB version: v2bad

manatu

O suiga o lo'o iai nei e LE fa'atagaina i matou e fa'atino ni fa'ata'ita'iga se lua (tua ma fou) i le taimi e tasi. O le mea lea, o le leai o se downtime deployment o le a faigata ona ausia (afai e amanaia manatu, e matua le mafai lava).

Su'ega A/B

O le tulaga o loʻo i ai nei o loʻo i ai le matou faʻaoga talosaga 1.0.0, deployed i le gaosiga, ma database v1. Matou te manaʻomia le faʻaogaina o se faʻataʻitaʻiga lona lua o le talosaga, version 2.0.0.BAD, ma fa'afou le fa'amaumauga i v2bad.

Laasaga:

  1. o se fa'ata'ita'iga fou o le fa'asologa o talosaga o lo'o fa'apipi'iina 2.0.0.BADlea e faafou ai le database i v2bad
  2. i totonu o le database v2bad koluma last_name ua le toe i ai - ua suia i surname
  3. Sa manuia le fa'amaumauga ma le fa'afouga o talosaga ma o lo'o fa'agasolo nisi taimi 1.0.0, isi - i 2.0.0.BAD. E fesoʻotaʻi mea uma i le database v2bad
  4. tulaga uma o le lomiga 1.0.0 o le a amata lafo mea sese ona o le a latou taumafai e faʻaofi faʻamatalaga i totonu o le koluma last_nameo lē ua lē toe iai
  5. tulaga uma o le lomiga 2.0.0.BAD o le a galue e aunoa ma ni faafitauli

E pei ona mafai ona e vaʻai, afai matou te faia i tua suiga le fetaui i le database ma le faʻaoga, e le mafai le suʻega A/B.

Toe fa'afo'i le talosaga

Seʻi tatou manatu pe a uma ona taumafai e fai le A/B deployment (tusa. per.: atonu o le uiga o le tusitala o le A/B suʻega iinei) na matou filifili e tatau ona matou toe faʻafoʻi le talosaga i le lomiga 1.0.0. Fa'apea tatou te le mana'o e toe fa'afo'i le fa'amaumauga.

Laasaga:

  1. matou taofi le fa'ata'ita'iga o le fa'ata'ita'iga 2.0.0.BAD
  2. o lo'o tumau pea le database v2bad
  3. talu mai le lomiga 1.0.0 e le malamalama po o le a surname, o le a tatou vaaia mea sese
  4. ua malepe seoli, e le mafai ona tatou toe foi i tua

E pei ona mafai ona e vaʻai, afai matou te faia i tua suiga le fetaui i le database ma le talosaga, e le mafai ona matou toe foʻi i tua i le lomiga muamua.

Fa'amaumauga o fa'atinoga

Backward incompatible scenario:

01) Run 1.0.0
02) Wait for the app (1.0.0) to boot
03) Generate a person by calling POST localhost:9991/person to version 1.0.0
04) Run 2.0.0.BAD
05) Wait for the app (2.0.0.BAD) to boot
06) Generate a person by calling POST localhost:9991/person to version 1.0.0 <-- this should fail
07) Generate a person by calling POST localhost:9992/person to version 2.0.0.BAD <-- this should pass

Starting app in version 1.0.0
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

{"firstName":"b73f639f-e176-4463-bf26-1135aace2f57","lastName":"b73f639f-e176-4463-bf26-1135aace2f57"}

Starting app in version 2.0.0.BAD
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

curl: (22) The requested URL returned error: 500 Internal Server Error

Generate a person in version 2.0.0.BAD
Sending a post to 127.0.0.1:9995/person. This is the response:

{"firstName":"e156be2e-06b6-4730-9c43-6e14cfcda125","surname":"e156be2e-06b6-4730-9c43-6e14cfcda125"}

Suiga fa'amaumauga

Fa'amatalaga femalaga'iga e toe fa'aigoa last_name в surname

Punavai Flyway script:

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

Mau e toe fa'aigoaina last_name.

-- This change is backward incompatible - you can't do A/B testing
ALTER TABLE PERSON CHANGE last_name surname VARCHAR;

Suiga code

Ua matou suia le igoa o le fanua lastName i surname.

Toe fa'aigoaina o se koluma i se auala e fetaui i tua

O le tulaga masani lea tatou te ono fetaiai. E tatau ona tatou faia ni suiga le fetaui i tua. Ua uma ona matou faʻamaonia e faʻapea mo le faʻaogaina o le leai o se taimi, e le tatau ona na o le faʻaogaina o le femalagaiga o faʻamaumauga e aunoa ma ni laasaga faaopoopo. I totonu o lenei vaega o le tusiga, o le a matou faia 3 faʻapipiʻiina o le talosaga faʻatasi ai ma femalagaiga faʻamaumauga e ausia ai le manaʻoga iʻuga aʻo tausisia le fetaui i tua.

Zametka. Manatua o loʻo i ai a matou faʻamaumauga faʻamaumauga v1. O lo'o i ai koluma first_name и last_name. E tatau ona tatou sui last_name i surname. E iai fo'i le matou app version 1.0.0, lea e lei faaaogaina surname.

Laasaga 2: Fa'aopoopo igoa

Fa'asologa o polokalame: 2.0.0
DB version: v2

manatu

E ala i le fa'aopoopoina o se koluma fou ma le kopiina o mea o lo'o i totonu, matou te faia ai suiga i tua e fetaui ma fa'amaumauga. I le taimi lava e tasi, afai tatou te toe faʻafoʻi le JAR pe fai se JAR tuai o loʻo tamoe, e le malepe i le taimi o le faʻatinoga.

O loʻo matou faʻasalalau se faʻamatalaga fou

Laasaga:

  1. fai se femalaga'iga fa'amaumauga e fai ai se koluma fou surname. Lenei lau DB version v2
  2. kopi faamatalaga mai last_name в surname. Faʻalogo leleiafai e tele au faʻamatalaga nei, e tatau ona e mafaufau i le femalagaiga o vaega!
  3. tusi le fa'ailoga o lo'o fa'aoga ai LAUA и новыйma le tuai koluma. Lenei lau fa'aoga app 2.0.0
  4. faitau le tau mai le koluma surname, afai e leai null, pe mai last_namepe afai surname e le o ta'ua. E mafai ona e tapeina getLastName() mai le code, talu ai o le a faʻaalia null pe a toe fa'afo'i lau talosaga mai 3.0.0 i 2.0.0.

Afai o loʻo e faʻaaogaina Spring Boot Flyway, o nei laʻasaga e lua o le a faia i le taimi o le amataga o le lomiga 2.0.0 talosaga. Afai e te fa'atautaia ma le lima le meafaigaluega fa'aliliuga fa'amaumauga, e tatau ona e faia ni mea 'ese'ese se lua e fai ai lenei mea (muamua fa'afouina le db version ma le lima ona fa'apipi'i lea o le talosaga fou).

E taua. Manatua o le koluma fou na faia E LE TATAU ia LE FAʻAALIGA. Afai e te faia se rollback, o le talosaga tuai e le iloa e uiga i le koluma fou ma o le a le faʻapipiʻiina i le taimi Insert. Ae afai e te faʻaopoopoina lenei faʻalavelave ma o lau db o le a v2, e mana'omia le setiina o le tau o le koluma fou. Le mea o le a taʻitaʻia ai le solia o tapulaʻa.

E taua. E tatau ona e aveese le auala getLastName(), aua i le lomiga 3.0.0 E leai se manatu o se koluma i le code last_name. O lona uiga o le null o le a seti iina. E mafai ona e tu'ua le metotia ma fa'aopoopo siaki mo null, ae o se fofo e sili atu ona lelei o le faʻamautinoa lea i totonu o le manatu getSurname() na e filifilia le tau sa'o e le-zero.

Su'ega A/B

O le tulaga o loʻo i ai nei o loʻo i ai le matou faʻaoga talosaga 1.0.0, fa'apipi'iina i le gaosiga, ma le fa'amaumauga i totonu v1. Matou te manaʻomia le faʻapipiʻiina o se faʻataʻitaʻiga lona lua o le faʻasologa o talosaga 2.0.0lea o le a faafou le database i v2.

Laasaga:

  1. o se fa'ata'ita'iga fou o le fa'asologa o talosaga o lo'o fa'apipi'iina 2.0.0lea e faafou ai le database i v2
  2. i le taimi nei o nisi o talosaga sa fa'agasolo e ala i fa'ata'ita'iga 1.0.0
  3. na manuia le fa'afouga ma e tele au fa'ata'ita'iga o lo'o fa'agasolo ai le fa'asologa o talosaga 1.0.0 ma isi fa'aliliuga 2.0.0. E feso'ota'i tagata uma ma fa'amaumauga i totonu v2
  4. lomiga 1.0.0 e le fa'aogaina le koluma fa'aigoa i totonu o fa'amaumauga, ae o le fa'aliliuga 2.0.0 fa'aoga. Latou te le faalavelave le tasi i le isi, ma e le tatau ona i ai ni mea sese.
  5. lomiga 2.0.0 teuina faʻamaumauga i le koluma tuai ma fou, faʻamautinoa le fetaui i tua

E taua. Afai ei ai ni au fesili e faitau ai mea e faʻatatau i tau mai le koluma tuai/fou, e tatau ona e manatua o loʻo i ai nei au faʻalua faʻatau (e foliga mai o loʻo latou faimalaga pea). Mo se faʻataʻitaʻiga, afai e te manaʻo e faitau le numera o tagata faʻaoga o latou igoa faʻauʻu (po o le a lava le igoa o le koluma) na amata i le mataitusi A, se'ia mae'a le femalaga'iga (oldnew koluma) atonu e iai au fa'amatalaga e le fetaui pe a e fesiligia se koluma fou.

Toe fa'afo'i le talosaga

O lea la ua i ai le matou app version 2.0.0 ma fa'amaumauga i totonu v2.

Laasaga:

  1. toe fa'afo'i lau talosaga ile fa'aliliuga 1.0.0.
  2. lomiga 1.0.0 e le fa'aogaina se koluma i totonu o fa'amaumauga surname, o lea e tatau ona manuia le rollback

Suiga DB

O le database o lo'o i ai se koluma e igoa last_name.

Fa'amatalaga puna mai lele:

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

Fa'aopoopo tusitusiga surname.

Faalogo Manatua e le mafai ona e fa'aopoopoina ni fa'agata NOT NULL i le koluma o lo'o e fa'aopoopoina. Afai e te toe faʻafoʻi le JAR, o le a leai se manatu o le lomiga tuai e uiga i le koluma faaopoopo ma o le a otometi lava ona seti i le NULL. Afai ei ai se faʻagata, o le talosaga tuai o le a malepe.

-- NOTE: This field can't have the NOT NULL constraint cause if you rollback, the old version won't know about this field
-- and will always set it to NULL
ALTER TABLE PERSON ADD surname varchar(255);

-- WE'RE ASSUMING THAT IT'S A FAST MIGRATION - OTHERWISE WE WOULD HAVE TO MIGRATE IN BATCHES
UPDATE PERSON SET PERSON.surname = PERSON.last_name

Suiga code

Matou te teuina faʻamaumauga e pei o last_name, ma i totonu surname. I le taimi lava e tasi matou te faitau mai ai last_name, talu ai o lenei koluma e sili ona talafeagai. A'o fa'agasolo le fa'atinoina, o nisi talosaga atonu na fa'agasolo e se fa'ata'ita'iga e le'i fa'afouina.

/*
 * Copyright 2012-2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package sample.flyway;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String lastName;
    private String surname;

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    /**
     * Reading from the new column if it's set. If not the from the old one.
     *
     * When migrating from version 1.0.0 -> 2.0.0 this can lead to a possibility that some data in
     * the surname column is not up to date (during the migration process lastName could have been updated).
     * In this case one can run yet another migration script after all applications have been deployed in the
     * new version to ensure that the surname field is updated.
     *
     * However it makes sense since when looking at the migration from 2.0.0 -> 3.0.0. In 3.0.0 we no longer
     * have a notion of lastName at all - so we don't update that column. If we rollback from 3.0.0 -> 2.0.0 if we
     * would be reading from lastName, then we would have very old data (since not a single datum was inserted
     * to lastName in version 3.0.0).
     */
    public String getSurname() {
        return this.surname != null ? this.surname : this.lastName;
    }

    /**
     * Storing both FIRST_NAME and SURNAME entries
     */
    public void setSurname(String surname) {
        this.lastName = surname;
        this.surname = surname;
    }

    @Override
    public String toString() {
        return "Person [firstName=" + this.firstName + ", lastName=" + this.lastName + ", surname=" + this.surname
                + "]";
    }
}

Laasaga 3: Aveese le igoa mulimuli mai le code

Fa'asologa o polokalame: 3.0.0

DB version:v3

manatu

Manatua per .: E foliga mai, i le uluaʻi tusiga na kopi sese ai e le tusitala le tusitusiga o lenei poloka mai le laasaga 2. I lenei laasaga, e tatau ona faia suiga i le numera o talosaga e faʻatatau i le aveesea o galuega e faʻaogaina ai le koluma. last_name.

E ala i le fa'aopoopoina o se koluma fou ma le kopiina o mea o lo'o i totonu, na matou faia ai suiga i tua e fetaui ma fa'amaumauga. E le gata i lea, afai tatou te toe fa'afo'i le JAR pe fai se JAR tuai o lo'o tamo'e, e le malepe i le taimi o le fa'atinoga.

Toe fa'afo'i le talosaga

I le taimi nei o loʻo i ai a matou faʻamatalaga app 3.0.0 ma fa'amaumauga v3. Fa'aliliuga 3.0.0 e le fa'asaoina fa'amaumauga i last_name. O lona uiga o totonu surname o fa'amatalaga sili ona lata mai o lo'o teuina.

Laasaga:

  1. toe fa'afo'i lau talosaga ile fa'aliliuga 2.0.0.
  2. lomiga 2.0.0 fa'aoga ma last_name и surname.
  3. lomiga 2.0.0 o le a ave surname, afai e le o se mea, a leai -last_name

Suiga fa'amaumauga

E leai ni suiga fa'avae i totonu o fa'amaumauga. O le faʻasologa o loʻo i lalo o loʻo faʻatinoina e faʻatino ai le femalagaiga mulimuli o faʻamaumauga tuai:

-- WE'RE ASSUMING THAT IT'S A FAST MIGRATION - OTHERWISE WE WOULD HAVE TO MIGRATE IN BATCHES
-- ALSO WE'RE NOT CHECKING IF WE'RE NOT OVERRIDING EXISTING ENTRIES. WE WOULD HAVE TO COMPARE
-- ENTRY VERSIONS TO ENSURE THAT IF THERE IS ALREADY AN ENTRY WITH A HIGHER VERSION NUMBER
-- WE WILL NOT OVERRIDE IT.
UPDATE PERSON SET PERSON.surname = PERSON.last_name;

-- DROPPING THE NOT NULL CONSTRAINT; OTHERWISE YOU WILL TRY TO INSERT NULL VALUE OF THE LAST_NAME
-- WITH A NOT_NULL CONSTRAINT.
ALTER TABLE PERSON MODIFY COLUMN last_name varchar(255) NULL DEFAULT NULL;

Suiga code

Manatua per .: O le faʻamatalaga o lenei poloka na kopiina sese foi e le tusitala mai le laasaga 2. E tusa ai ma le manatu o le tusiga, o suiga i le code i lenei laasaga e tatau ona faʻamoemoe e aveese mai ai elemene e galulue ma le koluma. last_name.

Matou te teuina faʻamaumauga e pei o last_name, ma i totonu surname. E le gata i lea, matou te faitau mai le koluma last_name, talu ai e sili ona talafeagai. A'o fa'agasolo le fa'agaioiga, o nisi talosaga e mafai ona fa'agasolo e se fa'ata'ita'iga e le'i fa'aleleia.

/*
 * Copyright 2012-2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package sample.flyway;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String surname;

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getSurname() {
        return this.surname;
    }

    public void setSurname(String lastname) {
        this.surname = lastname;
    }

    @Override
    public String toString() {
        return "Person [firstName=" + this.firstName + ", surname=" + this.surname
                + "]";
    }
}

Laasaga 4: Aveese le igoa mulimuli mai le faʻamaumauga

Fa'asologa o polokalame: 4.0.0

DB version: v4

manatu

Ona o le mea moni o le code version 3.0.0 e le'i fa'aogaina le koluma last_name, e leai se mea leaga e tupu i le taimi o le faʻasalaga pe a tatou toe foʻi i tua 3.0.0 ina ua uma ona aveese se koluma mai le database.

Fa'amaumauga o fa'atinoga

We will do it in the following way:

01) Run 1.0.0
02) Wait for the app (1.0.0) to boot
03) Generate a person by calling POST localhost:9991/person to version 1.0.0
04) Run 2.0.0
05) Wait for the app (2.0.0) to boot
06) Generate a person by calling POST localhost:9991/person to version 1.0.0
07) Generate a person by calling POST localhost:9992/person to version 2.0.0
08) Kill app (1.0.0)
09) Run 3.0.0
10) Wait for the app (3.0.0) to boot
11) Generate a person by calling POST localhost:9992/person to version 2.0.0
12) Generate a person by calling POST localhost:9993/person to version 3.0.0
13) Kill app (3.0.0)
14) Run 4.0.0
15) Wait for the app (4.0.0) to boot
16) Generate a person by calling POST localhost:9993/person to version 3.0.0
17) Generate a person by calling POST localhost:9994/person to version 4.0.0

Starting app in version 1.0.0
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

{"firstName":"52b6e125-4a5c-429b-a47a-ef18bbc639d2","lastName":"52b6e125-4a5c-429b-a47a-ef18bbc639d2"}

Starting app in version 2.0.0

Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

{"firstName":"e41ee756-4fa7-4737-b832-e28827a00deb","lastName":"e41ee756-4fa7-4737-b832-e28827a00deb"}

Generate a person in version 2.0.0
Sending a post to 127.0.0.1:9992/person. This is the response:

{"firstName":"0c1240f5-649a-4bc5-8aa9-cff855f3927f","lastName":"0c1240f5-649a-4bc5-8aa9-cff855f3927f","surname":"0c1240f5-649a-4bc5-8aa9-cff855f3927f"}

Killing app 1.0.0

Starting app in version 3.0.0

Generate a person in version 2.0.0
Sending a post to 127.0.0.1:9992/person. This is the response:
{"firstName":"74d84a9e-5f44-43b8-907c-148c6d26a71b","lastName":"74d84a9e-5f44-43b8-907c-148c6d26a71b","surname":"74d84a9e-5f44-43b8-907c-148c6d26a71b"}

Generate a person in version 3.0.0
Sending a post to 127.0.0.1:9993/person. This is the response:
{"firstName":"c6564dbe-9ab5-40ae-9077-8ae6668d5862","surname":"c6564dbe-9ab5-40ae-9077-8ae6668d5862"}

Killing app 2.0.0

Starting app in version 4.0.0

Generate a person in version 3.0.0
Sending a post to 127.0.0.1:9993/person. This is the response:

{"firstName":"cbe942fc-832e-45e9-a838-0fae25c10a51","surname":"cbe942fc-832e-45e9-a838-0fae25c10a51"}

Generate a person in version 4.0.0
Sending a post to 127.0.0.1:9994/person. This is the response:

{"firstName":"ff6857ce-9c41-413a-863e-358e2719bf88","surname":"ff6857ce-9c41-413a-863e-358e2719bf88"}

Suiga DB

Fuafua v3 na'o matou aveese le koluma last_name ma fa'aopoopo tapula'a o lo'o misi.

-- REMOVE THE COLUMN
ALTER TABLE PERSON DROP last_name;

-- ADD CONSTRAINTS
UPDATE PERSON SET surname='' WHERE surname IS NULL;
ALTER TABLE PERSON ALTER COLUMN surname VARCHAR NOT NULL;

Suiga code

E leai ni suiga i le code.

iʻuga

Na manuia le matou fa'aogaina o se suiga o igoa koluma e le fetaui i tua e ala i le fa'atinoina o le tele o fa'agaioiga i tua. O lo'o i lalo se aotelega o gaioiga na faia:

  1. fa'apipi'iina o fa'asologa o talosaga 1.0.0 с v1 fuafuaga fa'amaumauga (igoa koluma = last_name)
  2. fa'apipi'iina o fa'asologa o talosaga 2.0.0, lea e teu ai faamatalaga i totonu last_name и surname. O le talosaga e faitau mai last_name. O lo'o iai le fa'amaumauga o fa'amaumauga v2o lo'o i ai koluma pei o last_name, ma surname. surname o se kopi o last_name. (FAAMANATU: o lenei koluma e le tatau ona i ai se faʻalavelave faʻafuaseʻi)
  3. fa'apipi'iina o fa'asologa o talosaga 3.0.0, lea e na'o le teuina o fa'amaumauga i totonu surname ma faitau mai le igoa. Ae mo le database, o loʻo faʻataunuʻuina le femalagaiga mulimuli last_name в surname. Fa'agata fo'i LE FAʻAALIGA aveese mai last_name. O lo'o iai nei le fa'amaumauga v3
  4. fa'apipi'iina o fa'asologa o talosaga 4.0.0 - e leai ni suiga e faia i le code. Fa'apipi'i fa'amaumauga v4, lea e aveesea last_name. O iinei e mafai ona e faʻaopoopoina soʻo se faʻalavelave misi i le database.

E ala i le mulimuli i lenei faiga, e mafai lava ona e toe fa'afo'i le tasi fa'asologa e aunoa ma le talepeina o fa'amaumauga/fa'aoga feso'ota'iga.

kote

O tulafono uma o loʻo faʻaaogaina i lenei tusiga o loʻo avanoa ile Github. Lalo ole fa'amatalaga fa'aopoopo.

Проекты

A maeʻa ona faʻapipiʻi le fale teu oloa, o le a e vaʻai i le fausaga o faila.

├── boot-flyway-v1              - 1.0.0 version of the app with v1 of the schema
├── boot-flyway-v2              - 2.0.0 version of the app with v2 of the schema (backward-compatible - app can be rolled back)
├── boot-flyway-v2-bad          - 2.0.0.BAD version of the app with v2bad of the schema (backward-incompatible - app cannot be rolled back)
├── boot-flyway-v3              - 3.0.0 version of the app with v3 of the schema (app can be rolled back)
└── boot-flyway-v4              - 4.0.0 version of the app with v4 of the schema (app can be rolled back)

Tusitusiga

E mafai ona e fa'ata'ita'iina fa'amaumauga o lo'o fa'amatalaina i tusitusiga o lo'o i lalo, lea o le a fa'aalia ai suiga i tua-tutusa ma le le fetaui i le fa'amaumauga.

E vaai o le mataupu ma suiga talafeagai i tua, tamoe:

./scripts/scenario_backward_compatible.sh

Ma vaai pusa ma suiga le fetaui i tua, tamoe:

./scripts/scenario_backward_incompatible.sh

Fa'ata'ita'i Fa'ata'ita'i Fa'ata'ita'iga Fa'aa'e Punavai

O faʻataʻitaʻiga uma e maua mai Spring Boot Sample Flyway.

E mafai ona e tilotilo i ai http://localhost:8080/flyway, o loʻo i ai se lisi o tusitusiga.

O lenei faʻataʻitaʻiga e aofia ai foi le H2 console (i http://localhost:8080/h2-console) ina ia mafai ona e vaʻai i le tulaga faʻamaumauga (default jdbc URL is jdbc:h2:mem:testdb).

E le gata i

Faitau foi isi tala i la matou blog:

puna: www.habr.com

Faaopoopo i ai se faamatalaga