Zero Downtime Deployment le Databases

Zero Downtime Deployment le Databases

Sengoliloeng sena se hlalosa ka botlalo mokhoa oa ho rarolla mathata a ho ikamahanya le database nakong ea phepelo. Re tla u joetsa hore na ho ka etsahala eng ka lits'ebetso tsa hau tsa tlhahiso haeba u leka ho tsamaisa ntle le boitokisetso ba pele. Ka mor'a moo re tla feta methating ea lifecycle ea ts'ebeliso e hlokehang hore ho be le nako ea phomolo (hoo e ka bang. lane: ho feta - nako ea phomolo ea zero). Sephetho sa ts'ebetso ea rona e tla ba ho sebelisa phetoho ea database ea morao-rao e sa lumellaneng ka mokhoa o lumellanang le morao.

Haeba u batla ho utloisisa mehlala ea khoutu e hlahang sehloohong, u ka e fumana ho GitHub.

Selelekela

Ha ho na nako ea ho sebetsa

Ke mohlolo o kakang zero downtime deployment? U ka re sena ke ha kopo ea hau e sebelisoa ka tsela eo u ka atlehang ho hlahisa phetolelo e ncha ea kopo ho tlhahiso, ha mosebedisi a sa hlokomele hore ha e fumanehe. Ho latela pono ea mosebelisi le k'hamphani, ona ke mokhoa o motle ka ho fetesisa oa phepelo hobane o lumella likarolo tse ncha hore li hlahisoe le liphoso ho lokisoa ntle le tšitiso.

Joang ho finyella see? Ho na le mekhoa e mengata, e 'ngoe ea tsona ke ena:

  • deploy version No. 1 ea tšebeletso ea hau
  • etsa phalliso ea database
  • Kenya mofuta oa #2 oa ts'ebeletso ea hau 'moho le mofuta oa #1
  • hang ha u bona mofuta oo oa No. 2 o sebetsa ka moo o lokelang, tlosa mofuta oa No. 1
  • etsoa!

Ho bonolo, na ha ho joalo? Ka bomalimabe, ha ho bonolo joalo, 'me re tla sheba taba eo ka botlalo hamorao. Joale ha re hlahlobeng ts'ebetso e 'ngoe e tloaelehileng ea phepelo - ho tsamaisoa ka botala bo boputsoa.

Na u kile ua utloa ka ho tsamaisoa ha botala bo botala? Cloud Foundry e etsa hore sena se be bonolo haholo. Sheba feela Sengoloa sena, moo re hlalosang sena ka botlalo. Ho akaretsa ka bokhuts'oane, a re u hopotse mokhoa oa ho etsa deployment e putsoa:

  • etsa bonnete ba hore likopi tse peli tsa khoutu ea hau ea tlhahiso ("blue" le "green") lia sebetsa;
  • tsamaisa sephethephethe sohle ho tikoloho e putsoa, ​​ke. e le hore li-URL tsa tlhahiso li supa moo;
  • tsamaisa le ho leka liphetoho tsohle tsa ts'ebeliso tikolohong e tala;
  • fetola li-urls ho tloha ho 'mala o moputsoa ho ea ho o motala

Ho tsamaisoa ha botala bo botala ke mokhoa o u lumellang ho hlahisa likarolo tse ncha habonolo ntle le ho tšoenyeha ka ho senyeha ha tlhahiso. Sena se bakoa ke taba ea hore leha ho ka etsahala ho hong, o ka khutlela tikolohong e fetileng habonolo feela ka ho "fokotsa switch".

Ka mor'a ho bala tsohle tse ka holimo, u ka 'na ua botsa potso: Nako ea phomolo ea zero e amana joang le ho tsamaisoa ha Blue green?

Li na le lintho tse ngata tse tšoanang, kaha ho boloka likopi tse peli tsa tikoloho e tšoanang ho hloka boiteko bo habeli ho li hlokomela. Ke ka lebaka lena lihlopha tse ling li reng Martin Fowler, latela mokhoa o fapaneng oa mokhoa ona:

Kgetho e 'ngoe ke ho sebelisa database e tšoanang, ho theha li-switches tse botala bo boputsoa bakeng sa webo le likarolo tsa domain. Ka mokhoa ona, database hangata e ka ba bothata, haholo ha o hloka ho fetola schema ea eona ho ts'ehetsa mofuta o mocha oa software.

'Me mona re fihla bothata bo ka sehloohong sehloohong sena. Sebaka sa polokelo ea litaba. Ha re shebeng poleloana ena hape.

etsa phalliso ea database.

Joale u tlameha ho ipotsa potso - ho thoe'ng haeba phetoho ea database e sa lumellane le morao? Na mofuta oaka oa pele oa sesebelisoa o ke ke oa robeha? Ha e le hantle, sena ke sona se tla etsahala ...

Kahoo, leha ho na le melemo e meholo ea ho theola nako ea zero / ho tsamaisoa ka botala bo boputsoa, ​​​​likhamphani li tloaetse ho latela ts'ebetso e latelang e sireletsehileng ea ho kenya likopo tsa tsona:

  • lokisetsa sephutheloana ka phetolelo e ncha ea kopo
  • koala sesebelisoa se sebetsang
  • tsamaisa mengolo ho fallisa database
  • tsamaisa le ho qala mofuta o mocha oa sesebelisoa

Sengoliloeng sena, re tla qaqisa hore na u ka sebetsa joang le database ea hau le khoutu ho nka monyetla oa ho sebelisa nako ea ho theola nako.

Litaba tsa database

Haeba u na le sesebelisoa se sa sebetseng se sa bolokeng data efe kapa efe sebakeng sa polokelo ea litaba, u ka fumana ts'ebeliso ea nako ea ho theola hang hang. Ka bomalimabe, software e ngata e hloka ho boloka data kae-kae. Ke ka lebaka leo u lokelang ho nahana habeli pele u etsa liphetoho leha e le life potolohong. Pele re kena lintlheng tsa mokhoa oa ho fetola schema e le hore ho se ke ha khoneha ho sebelisa nako ea ho theoha, a re shebeng pele ho schema ea phetolelo.

Sekema sa phetolelo

Sehloohong sena re tla sebelisa Flyway joalo ka sesebelisoa sa ho laola mofuta (hoo e ka bang. Phetolelo: re bua ka ho falla ha database). Ka tlhaho, re tla ngola ts'ebeliso ea Spring Boot e nang le ts'ehetso ea Flyway e hahelletsoeng mme e tla tsamaisa schema fa re ntse re theha maemo a kopo. Ha o sebelisa Flyway, o ka boloka mangolo a ho falla ka har'a foldara ea merero ea hau (ka ho kenya classpath:db/migration). Mona u ka bona mohlala oa lifaele tse joalo tsa ho falla

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

Mohlaleng ona re bona lingoloa tse 4 tsa ho falla, tseo haeba li sa ka tsa etsoa pejana, li tla etsoa ka ho latellana ha kopo e qala. Ha re shebeng e 'ngoe ea lifaele (V1__init.sql) joalo ka mohlala.

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');

Ntho e 'ngoe le e' ngoe e itlhalosa ka mokhoa o phethahetseng: u ka sebelisa SQL ho hlalosa hore na database ea hau e lokela ho fetoloa joang. Bakeng sa tlhaiso-leseling e batsi ka Spring Boot le Flyway, hlahloba Litokomane tsa Spring Boot.

Ka ho sebelisa sesebelisoa sa ho laola mohloli ka Spring Boot, o fumana melemo e meholo ea 2:

  • o arola liphetoho tsa database ho liphetoho tsa khoutu
  • Ho falla ha database ho etsahala hammoho le ho phatlalatsoa ha kopo ea hau, ke hore. mokhoa oa hau oa ho tsamaisa o nolofalitsoe

Ho rarolla mathata a database

Karolong e latelang ea sengoloa, re tla shebana le ho sheba mekhoa e 'meli ea liphetoho tsa database.

  • ho se dumellane ka morao
  • ho dumellana ka morao

Ea pele e tla nkoa e le temoso ea hore ha ua lokela ho etsa ts'ebetso ea ho fokotsa nako ea zero ntle le ho itokisetsa pele ... Ea bobeli e fana ka tharollo ea hore na u ka etsa joang ntle le nako ea ho fokotsa nako 'me ka nako e ts'oanang u boloke ho lumellana ka morao.

Morero oa rona oo re tla beng re sebetsa ho ona e tla ba sesebelisoa se bonolo sa Spring Boot Flyway se nang le Person с first_name и last_name database (hoo e ka bang. phetolelo: Person ke tafole le first_name и last_name - tsena ke masimo a ho eona). Re batla ho reha lebitso last_name в surname.

Maikutlo

Pele re kena ka botlalo, ho na le menahano e 'maloa eo re lokelang ho e etsa mabapi le lits'ebetso tsa rona. Sephetho se seholo seo re batlang ho se fihlela e tla ba ts'ebetso e bonolo.

Molaetsa. Khoebo PRO-TIP. Mekhoa ea ho nolofatsa e ka u bolokela chelete e ngata ho tšehetso (ha u na le batho ba bangata ba sebeletsang k'hamphani ea hau, u ka boloka chelete e ngata)!

Ha ho hlokahale ho khutlisa database

Sena se nolofatsa ts'ebetso ea phepelo (li-rollbacks tse ling tsa database li batla li sa khonehe, joalo ka ho hlakola). Re khetha ho khutlisa lits'ebetso feela. Ka tsela ena, leha u na le li-database tse fapaneng (mohlala, SQL le NoSQL), phaephe ea hau ea ho tsamaisa e tla shebahala e ts'oana.

E tlameha HO HLAHALA ho khoneha ho khutlisa sesebelisoa mofuta o le mong hape (ha ho sa tla ba teng)

Rollback e lokela ho etsoa feela ha ho hlokahala. Haeba ho na le phoso phetolelong ea hajoale e sa lokisoeng habonolo, re lokela ho khona ho khutlela mocheng oa morao-rao o sebetsang. Re nahana hore mofuta ona oa morao-rao o sebetsang ke oa pele. Ho boloka khoutu le database li tsamaellana bakeng sa phatlalatso e fetang e le 'ngoe ho ka ba thata haholo hape ho bitsa chelete e ngata.

Lengolo. Bakeng sa ho baloa haholoanyane, sehloohong sena re tla fetola mofuta o moholo oa ts'ebeliso.

Mohato oa 1: Boemo ba Pele

Mofuta oa sesebelisoa: 1.0.0
Mofuta oa DB: v1

ho hlahisa maikutlo

Ena e tla ba boemo ba pele ba kopo.

Liphetoho tsa database

DB e na le 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');

Khoutu e fetoha

Sesebelisoa se boloka data ea Motho ho 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
                + "]";
    }
}

Ho fetola lebitso la kholomo e sa tsamaellaneng ka morao

Ha re shebeng mohlala oa mokhoa oa ho fetola lebitso la kholomo:

Tlhokomelo. Mohlala o latelang o tla senya lintho ka boomo. Re bontša sena ho bontša bothata ba ho lumellana ha database.

Mofuta oa sesebelisoa: 2.0.0.BAD

Mofuta oa DB: v2bad

ho hlahisa maikutlo

Liphetoho tse teng hona joale HA li re lumelle ho etsa maemo a mabeli (ea khale le a macha) ka nako e le 'ngoe. Ka hona, ts'ebetso ea ho theola nako ea zero e tla ba thata ho e fihlela (haeba maikutlo a nahanoa, ha e le hantle ha ho khonehe).

Teko ea A/B

Boemo ba hajoale ke hore re na le mofuta oa kopo 1.0.0, e kentsoeng tlhahiso, le database v1. Re hloka ho sebelisa mohlala oa bobeli oa kopo, mofuta 2.0.0.BAD, le ho nchafatsa polokelo ea litaba ho v2bad.

Mehato:

  1. mohlala o mocha oa ts'ebeliso ea mofuta o kentsoe 2.0.0.BADe ntjhafatsang polokelongtshedimosetso ho v2bad
  2. polokelongtshedimosetso v2bad lenaneng last_name ha e sa le teng - e fetotsoe ho ba surname
  3. Database le ntlafatso ea ts'ebeliso li atlehile 'me maemo a mang a ntse a sebetsa 1.0.0, ba bang - ho 2.0.0.BAD. Tsohle li hokahane le database v2bad
  4. liketsahalo tsohle tsa phetolelo 1.0.0 ba tla qala ho lahlela liphoso hobane ba tla leka ho kenya data kholomong last_nameya seng a le sieo
  5. liketsahalo tsohle tsa phetolelo 2.0.0.BAD e tla sebetsa ntle le mathata

Joalokaha u ka bona, haeba re etsa liphetoho tse sa lumellaneng ka morao ho database le ts'ebeliso, tlhahlobo ea A / B ha e khonehe.

Khutlisetsa kopo

Ha re nke hore ka mor'a ho leka ho tsamaisa A / B (hoo e ka bang. ka.: mohlomong mongoli o ne a bolela tlhahlobo ea A/B mona) re nkile qeto ea hore re hloka ho khutlisetsa kopo ho mofuta 1.0.0. Ha re re ha re batle ho khutlisa database.

Mehato:

  1. re emisa mohlala oa kopo ea mofuta 2.0.0.BAD
  2. database e ntse e le teng v2bad
  3. ho tloha phetolelong 1.0.0 ha e utloisise hore na ke eng surname, re tla bona liphoso
  4. lihele li robehile, ha re sa khona ho khutlela morao

Joalo ka ha u bona, haeba re ka etsa liphetoho tse sa lumellaneng le database le ts'ebeliso, re ke ke ra khutlela mokhetlong o fetileng.

Lingoliloeng tsa ts'ebetso ea script

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"}

Liphetoho tsa database

Mongolo oa ho falla o rehang mabitso last_name в surname

Mohloli oa mongolo oa Flyway:

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');

Sengoloa se reha mabitso last_name.

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

Khoutu e fetoha

Re fetotse lebitso la sebaka lastName mabapi le surname.

Ho reha lebitso bocha ka tsela e tsamaellanang le morao

Bona ke boemo bo atileng haholo boo re ka kopanang le bona. Re hloka ho etsa liphetoho tsa morao-rao tse sa lumellaneng. Re se re bonts'itse hore bakeng sa phepelo ea nako e tlase, ha rea ​​​​lokela ho sebelisa phalliso ea database feela ntle le mehato e meng. Karolong ena ea sengoloa, re tla etsa lits'ebetso tse 3 tsa ts'ebeliso hammoho le ho falla ha database ho fihlela sephetho se lakatsehang ha re ntse re boloka tšebelisano ea morao.

Molaetsa. Hopola hore re na le database ea mofuta v1. E na le litšiea first_name и last_name. Re tlameha ho fetoha last_name mabapi le surname. Re boetse re na le mofuta oa app 1.0.0, e so sebedisoeng surname.

Mohato oa 2: Kenya fane

Mofuta oa sesebelisoa: 2.0.0
Mofuta oa DB: v2

ho hlahisa maikutlo

Ka ho kenyelletsa kholomo e ncha le ho kopitsa litaba tsa eona, re theha liphetoho tsa database tse tsamaellanang le morao. Ka nako e ts'oanang, haeba re khutlisa JAR kapa re na le JAR ea khale e sebetsang, e ke ke ea robeha nakong ea polao.

Re hlahisa mofuta o mocha

Mehato:

  1. etsa phalliso ea database ho theha kholomo e ncha surname. Joale mofuta oa hau oa DB v2
  2. kopitsa data ho tswa ho last_name в surname. Ela hlokohore haeba u na le data ena e ngata, u lokela ho nahana ka ho falla ha batch!
  3. ngola khoutu moo li sebelisoang teng BOBEDI и nchale tsofetse kholomo. Hona joale mofuta oa sesebelisoa sa hau 2.0.0
  4. bala boleng ba kholomo surname, haeba ha ho joalo null, kapa ho tsoa ho last_name, haeba surname ha ea hlalosoa. O ka hlakola getLastName() ho tloha khoutu, kaha e tla hlahisa null ha o khutlisa kopo ea hau ho tloha 3.0.0 ho 2.0.0.

Haeba u sebelisa Spring Boot Flyway, mehato ena e 'meli e tla etsoa nakong ea ho qala mofuta 2.0.0 lits'ebetso. Haeba u sebelisa sesebelisoa sa phetolelo ea database ka letsoho, u tla tlameha ho etsa lintho tse peli tse fapaneng ho etsa sena (qala ka ho ntlafatsa mofuta oa db ka letsoho ebe u sebelisa sesebelisoa se secha).

Ke habohlokoa. Hopola hore karolo e ncha e thehiloe TLHOKOMELA быть E SE NULL. Haeba u etsa rollback, ts'ebeliso ea khale ha e tsebe ka kholomo e ncha 'me e ke ke ea e kenya nakong eo Insert. Empa ha o eketsa tšitiso ena mme db ea hau e tla ba joalo v2, sena se tla hloka ho beha boleng ba kholomo e ncha. E leng se tla lebisa ho tlōlo ea lithibelo.

Ke habohlokoa. U lokela ho tlosa mokhoa getLastName(), hobane ka phetolelo 3.0.0 Ha ho na mohopolo oa kholomo khoutung last_name. Sena se bolela hore null e tla behoa moo. U ka tloha mokhoa le eketsa licheke bakeng sa null, empa tharollo e molemo haholo e ka ba ho etsa bonnete ba hore ka logic getSurname() u khethile boleng bo nepahetseng boo e seng lefela.

Teko ea A/B

Boemo ba hajoale ke hore re na le mofuta oa kopo 1.0.0, e kentsoeng tlhahisong, le polokelong ea litaba ho v1. Re hloka ho sebelisa mohlala oa bobeli oa ts'ebeliso ea mofuta 2.0.0e tla ntjhafatsa polokelongtshedimosetso ho v2.

Mehato:

  1. mohlala o mocha oa ts'ebeliso ea mofuta o kentsoe 2.0.0e ntjhafatsang polokelongtshedimosetso ho v2
  2. Khabareng, likopo tse ling li ile tsa sebetsoa ka mehlala ea liphetolelo 1.0.0
  3. ntlafatso e atlehile 'me u na le maemo a mangata a sebetsang a sesebelisoa sa mofuta 1.0.0 le liphetolelo tse ling 2.0.0. Motho e mong le e mong o buisana le database ho v2
  4. tlhahiso 1.0.0 ha e sebelise kholomo ea fane ho database, empa mofuta 2.0.0 tshebediso. Ha ba kena-kenane, 'me ha hoa lokela ho ba le liphoso.
  5. tlhahiso 2.0.0 e boloka data kholomong ea khale le e ncha, e netefatsa hore e ea ka morao

Ke habohlokoa. Haeba u na le lipotso tse balang lintho tse ipapisitseng le boleng ho tsoa kholomong ea khale / e ncha, u lokela ho hopola hore joale u na le boleng bo habeli (mohlomong ba ntse ba falla). Ka mohlala, haeba u batla ho bala palo ea basebelisi bao lebitso la bona la ho qetela (ho sa tsotellehe hore na kholomo e bitsoa eng) e qalileng ka tlhaku A, ebe ho fihlela phallo ea data e phethetsoe (oldnew column) o kanna oa ba le data e sa lumellaneng haeba u botsa kholomo e ncha.

Khutlisetsa kopo

Hona joale re na le mofuta oa app 2.0.0 le database ho v2.

Mehato:

  1. khutlisetsa kopo ea hau ho mofuta 1.0.0.
  2. tlhahiso 1.0.0 ha e sebelise kholomo sebakeng sa polokelo ea litaba surname, kahoo rollback e lokela ho atleha

DB e fetoha

Sebaka sa polokelo ea boitsebiso se na le kholomo e bitsoang last_name.

Flyway source 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');

Kenya mongolo surname.

Tlhokomelo. Hopola hore HA U KA KE KE UA KENYA litšitiso life kapa life tse SE KE UA NULL kholomong eo u e eketsang. Haeba u khutlisa JAR, mofuta oa khale o ke ke oa tseba ka kholomo e ekelitsoeng mme o tla e beha ka bo eona ho NULL. Haeba ho na le moeli o joalo, kopo ea khale e tla robeha feela.

-- 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

Khoutu e fetoha

Re boloka data joalo ka last_namele ho surname. Ka nako e tšoanang re bala ho tloha last_name, kaha kholomo ena ke eona e amehang ka ho fetisisa. Nakong ea ts'ebetso ea ho romela, likopo tse ling li ka 'na tsa sebetsoa ke ketsahalo ea kopo e e-s'o ntlafatsoe.

/*
 * 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
                + "]";
    }
}

Mohato oa 3: Ho tlosa last_name ho khoutu

Mofuta oa sesebelisoa: 3.0.0

Mofuta oa DB:v3

ho hlahisa maikutlo

Hlokomela ka. last_name.

Ka ho kenyelletsa kholumo e ncha le ho kopitsa litaba tsa eona, re thehile liphetoho tse lumellanang tsa database. Hape, haeba re khutlisa JAR kapa re na le JAR ea khale e sebetsang, e ke ke ea robeha nakong ea polao.

Khutlisetsa kopo

Hajoale re na le mofuta oa app 3.0.0 le database v3. Phetolelo 3.0.0 ha e boloke data ho last_name. Sena se bolela hore ho surname boitsebiso ba morao-rao bo bolokiloe.

Mehato:

  1. khutlisetsa kopo ea hau ho mofuta 2.0.0.
  2. tlhahiso 2.0.0 lisebelisoa le last_name и surname.
  3. tlhahiso 2.0.0 tla nka surname, haeba e se zero, ho seng joalo -last_name

Liphetoho tsa database

Ha ho na liphetoho tsa sebopeho polokelong ea litaba. Sengoloa se latelang se etsoa ho etsa phallo ea ho qetela ea data ea khale:

-- 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;

Khoutu e fetoha

Hlokomela ka. last_name.

Re boloka data joalo ka last_namele ho surname. Ho phaella moo, re bala ho tloha kholomong last_name, kaha ke eona e amehang ka ho fetisisa. Nakong ea ts'ebetso ea ho romelloa, likopo tse ling li ka sebetsoa ke ketsahalo e e-so ntlafatsoe.

/*
 * 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
                + "]";
    }
}

Mohato oa 4: Ho tlosa last_name ho database

Mofuta oa sesebelisoa: 4.0.0

Mofuta oa DB: v4

ho hlahisa maikutlo

Ka lebaka la hore khoutu ea phetolelo 3.0.0 ha ea sebelisa kholomo last_name, ha ho letho le lebe le tla etsahala nakong ea ho bolaoa haeba re khutlela ho 3.0.0 ka mor'a ho tlosa kholumo ho database.

Lingoliloeng tsa ts'ebetso ea script

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"}

DB e fetoha

Haholo v3 re tlosa tšiea feela last_name le ho eketsa lithibelo tse sieo.

-- 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;

Khoutu e fetoha

Ha ho na liphetoho ho khoutu.

fihlela qeto e

Re atlehile ho sebelisa phetoho ea lebitso la kholomo e sa lumellaneng ka morao ka ho etsa li-deployments tse 'maloa tse tsamaellanang ka morao. Ka tlase ke kakaretso ea liketso tse entsoeng:

  1. phepelo ea mofuta oa kopo 1.0.0 с v1 schema ea database (lebitso la kholomo = last_name)
  2. phepelo ea mofuta oa kopo 2.0.0, e bolokang data ho last_name и surname. Kopo e baloa ho tloha ho last_name. Sebaka sa polokelo ea boitsebiso se teng v2e nang le litšiea tse kang last_namele surname. surname ke kopi ea last_name. (TLHOKOMELISO: Kholomo ena ha ea tlameha ho ba le tšitiso e seng lefeela)
  3. phepelo ea mofuta oa kopo 3.0.0, e bolokang data feela ho surname mme o bala ho tswa ho fane. Ha e le polokelongtshedimosetso, phalliso ya ho qetela e a etsahala last_name в surname. Hape ke moeli E SE NULL tlositsoe ho last_name. Database e se e le mofuta v3
  4. phepelo ea mofuta oa kopo 4.0.0 - ha ho liphetoho tse etsoang ho khoutu. Tšebeliso ea database v4, e tlosang last_name. Mona o ka eketsa litšitiso leha e le life tse sieo ho database.

Ka ho latela mokhoa ona, o ka khona ho khutlisa mofuta o le mong ntle le ho senya ts'ebetso ea database / app.

khoutu

Khoutu eohle e sebelisitsoeng sehloohong sena e fumaneha ho Github. Ka tlase ke tlhaloso e eketsehileng.

Merero

Kamora ho kopanya polokelo, u tla bona sebopeho se latelang sa foldara.

├── 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)

Mengolo

U ka tsamaisa lingoloa tse hlalositsoeng lingolong tse ka tlase, tse tla bonts'a liphetoho tsa morao-rao le tse sa lumellaneng ho database.

Ho bona nyeoe e nang le liphetoho tse tsamaellanang ka morao, matha:

./scripts/scenario_backward_compatible.sh

Le ho bona nyeoe e nang le liphetoho tse sa tsamaisaneng le morao, matha:

./scripts/scenario_backward_incompatible.sh

Mokhoa oa Flyway oa Boot Boot

Mehlala eohle e nkiloe ho Spring Boot Sample Flyway.

U ka sheba http://localhost:8080/flyway, ho na le lethathamo la mangolo.

Mohlala ona o boetse o kenyelletsa khomphutha ea H2 (ho http://localhost:8080/h2-console) kahoo o ka sheba boemo ba database (default jdbc URL is jdbc:h2:mem:testdb).

Ho phaella moo

Hape bala lingoliloeng tse ling ho blog ea rona:

Source: www.habr.com

Eketsa ka tlhaloso