Zero Downtime Deployment uye Databases

Zero Downtime Deployment uye Databases

Ichi chinyorwa chinotsanangura zvakadzama nzira yekugadzirisa nyaya dzekuenderana nedatabase mukutumirwa. Isu tichakuudza izvo zvinogona kuitika kune ako ekugadzira zvikumbiro kana iwe ukaedza kuendesa pasina kutanga kugadzirira. Isu tichazoenda kuburikidza neayo application lifecycle matanho anodiwa kuve ne zero downtime (approx. nzira: mberi - zero downtime) Mhedzisiro yemashandiro edu ichave yekushandisa iyo yekumashure-isingaenderane dhatabhesi shanduko nenzira yekumashure-inoenderana.

Kana iwe uchida kunzwisisa iyo kodhi mienzaniso kubva kuchinyorwa, unogona kuiwana pa GitHub.

Nhanganyaya

Zero downtime deployment

Chii chakavanzika zero downtime deployment? Iwe unogona kutaura kuti apa ndipo kana application yako yaiswa nenzira yekuti iwe unokwanisa kubudirira kuunza shanduro nyowani yekushandisa pakugadzira, nepo mushandisi asingaone kusavapo kwayo. Kubva pakuona kwemushandisi nekambani, iyi ndiyo yakanyanya kunaka kuendesa mamiriro nekuti inobvumira maficha matsva kuunzwa uye tsikidzi kuti dzigadziriswe pasina kukanganisa.

Nzira yekuita sei izvi? Pane nzira dzakawanda, heino imwe yacho:

  • deploy version Nha. 1 yebasa rako
  • ita dhatabhesi kutama
  • Isa vhezheni #2 yesevhisi yako inoenderana nevhezheni #1
  • paunongoona iyo vhezheni Nhamba 2 ichishanda sezvainofanirwa, bvisa vhezheni Nha
  • zvaitwa!

Nyore, handizvo here? Nehurombo, hazvisi nyore, uye isu tichazotarisa izvo zvakadzama gare gare. Zvino ngatitarisei imwe yakajairika nzira yekuendesa - yebhuruu green deployment.

Wakambonzwa nezvazvo here blue green deployment? Cloud Foundry inoita kuti izvi zvive nyore kwazvo. Ingotarisa ichi chinyorwa, apo tinotsanangura izvi zvakadzama. Kupfupisa muchidimbu, ngatikuyeuchidzei maitiro ekuita bhuruu green deployment:

  • ive nechokwadi chekuti makopi maviri ekodhi yako yekugadzira ("blue" uye "girinhi") anoshanda;
  • tungamira traffic yese kunharaunda yebhuruu, i.e. kuitira kuti ma URL ekugadzira anonongedza ipapo;
  • shandisa uye edza shanduko dzese dzekushandisa munzvimbo yakasvibira;
  • chinja urls kubva kublue kuenda kune green environment

Blue green deployment inzira inobvumidza iwe kusuma zviri nyore maficha pasina kunetsekana nezve kugadzirwa kutyora. Izvi zvinokonzerwa nekuti kunyangwe kana chimwe chinhu chikaitika, unogona kudzoreredza zviri nyore kunharaunda yapfuura nekungo "flick switch".

Mushure mekuverenga zvese zviri pamusoro, unogona kubvunza mubvunzo: Chii chinonzi zero downtime chine chekuita neBlue green deployment?

Eya, vane zvakawanda zvakafanana, sezvo kuchengeta makopi maviri emhoteredzo imwe chete kunoda nhamburiko yakapetwa kaviri kuvachengeta. Ndosaka zvimwe zvikwata zvichiti Martin Fowler, tevera shanduko yeiyi nzira:

Imwe sarudzo ndeye kushandisa iyo dhatabhesi, kugadzira yebhuruu-girini switch yewebhu uye domain layer. Nenzira iyi, dhatabhesi inogona kazhinji kuve dambudziko, kunyanya kana iwe uchida kushandura schema yayo kutsigira shanduro itsva yesoftware.

Uye pano tinouya kune dambudziko guru munyaya ino. Database. Ngatitarisei zvakare mutsara uyu.

ita dhatabhesi kutama.

Zvino iwe unofanirwa kuzvibvunza iwe mubvunzo - ko kana dhatabhesi shanduko isingaenderane kumashure? Handiti yangu yekutanga vhezheni yeapp yekupwanya? Muchokwadi, izvi ndizvo chaizvo zvichaitika ...

Saka, kunyangwe nemabhenefiti makuru e zero downtime / bhuruu girini kutumirwa, makambani anowanzo kutevedzera inotevera yakachengeteka maitiro ekutumira maficha avo:

  • gadzirira pasuru ine vhezheni itsva yekushandisa
  • vhara application inoshanda
  • mhanyisa zvinyorwa kuti utame dhatabhesi
  • tumira uye tanga imwe vhezheni yechishandiso

Muchinyorwa chino, isu tinotsanangura maitiro aungaita nedatabase yako uye kodhi kutora mukana we zero downtime deployment.

Database matambudziko

Kana iwe uine isina kuverengeka application iyo isingachengete chero data mudhatabhesi, unogona kuwana zero downtime deployment ipapo. Nehurombo, mazhinji software anoda kuchengeta data kumwe kunhu. Ichi ndicho chikonzero iwe uchifanira kufunga kaviri usati waita chero shanduko kudunhu. Tisati tapinda mune zvese zvekuchinja schema kuti hapana-downtime deployment igoneke, ngatitangei tatarisa pane shanduro schema.

Versioning scheme

Munyaya ino tichashandisa Flyway seshanduro yekudzora chishandiso (approx. Dudziro: tiri kutaura nezve kutama kwe database) Sezvingatarisirwa, isu tichanyorawo Chitubu Boot application iyo yakavakirwa-mukati Flyway rutsigiro uye ichaita schema migration uchigadzira mamiriro ekunyorera. Paunenge uchishandisa Flyway, unogona kuchengeta zvinyorwa zvekufambisa mune yako mapurojekiti folda (nekusagadzika mukati classpath:db/migration) Pano unogona kuona muenzaniso wemafaira ekufambisa akadaro

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

Mumuenzaniso uyu tinoona 4 zvinyorwa zvekutama izvo, kana zvisina kuitwa kare, zvinozoitwa imwe mushure meimwe kana application yatanga. Ngatitarisei imwe yemafaira (V1__init.sql) semuenzaniso.

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

Zvese zvinonyatso kutsanangura: unogona kushandisa SQL kutsanangura kuti dhatabhesi yako inofanira kuchinjwa sei. Kuti uwane rumwe ruzivo nezve Spring Boot uye Flyway, tarisa Spring Boot Docs.

Nekushandisa sosi yekudzora chishandiso neChirimo Boot, iwe unowana maviri mabhenefiti makuru:

  • iwe unoparadzanisa shanduko yedatabase kubva pakuchinja kwekodhi
  • Kutama kweDatabhesi kunoitika pamwe chete nekuburitswa kwechikumbiro chako, i.e. nzira yako yekuendesa iri nyore

Kugadzirisa dambudziko re database

Muchikamu chinotevera chechinyorwa, isu tichatarisa kutarisa nzira mbiri dzekuchinja database.

  • kusawirirana kumashure
  • kumashure kugarisana

Yokutanga ichaonekwa senyevero yokuti iwe haufaniri kuita zero downtime deployment pasina kugadzirira kwekutanga ... Yechipiri inopa mhinduro pamusoro pekuti iwe ungaita sei kushandiswa pasina nguva uye panguva imwechete uchengetedze kuwirirana kumashure.

Yedu purojekiti yatichange tichishanda pairi ichave iri nyore Spring Boot Flyway application ine Person с first_name и last_name mu database (approx. shandura Person iri tafura uye first_name и last_name - iyi ndiyo minda mairi) Tinoda kutumidza zita last_name в surname.

Kufungidzira

Tisati tapinda muzvinyorwa, pane akati wandei efungidziro atinofanira kuita nezve maapplication edu. Mhedzisiro huru yatinoda kuwana ichave iri nyore maitiro.

Chinyorwa. Bhizinesi PRO-TIP. Maitiro ekurerutsa anogona kukuchengetedza mari yakawanda parutsigiro (kana vanhu vakawanda vaunenge uchishandira kambani yako, iyo yakawanda mari yaunogona kuchengetedza)!

Hapana chikonzero chekudzosera iyo database

Izvi zvinorerutsa maitiro ekutumira (mamwe dhatabhesi rollbacks anenge asingaite, senge kudzima rollback). Isu tinosarudza kudzosera kumashure maapplication chete. Nenzira iyi, kunyangwe uine dhatabhesi dzakasiyana (semuenzaniso, SQL neNoSQL), pombi yako yekuendesa inotaridzika zvakafanana.

Zvinofanira KUGARA zvichigoneka kudzosera kumashure application imwe vhezheni kumashure (hapasisina)

Rollback inofanira kuitwa chete kana zvichidiwa. Kana paine tsikidzi mune yazvino vhezheni isingagadziriswe nyore, isu tinofanirwa kukwanisa kudzokera kune yazvino vhezheni yekushanda. Isu tinofungidzira kuti iyi yazvino vhezheni yekushanda ndiyo yapfuura. Kuchengeta kodhi uye kuenderana kwedhatabhesi kweanopfuura kuburitswa kumwe kungave kwakaoma zvakanyanya uye kudhura.

Mutsamba. Kuti iverengeke zvakanyanya, mune ino chinyorwa tichashandura iyo huru vhezheni yekushandisa.

Danho 1: Nyika Yekutanga

Shanduro yeApp: 1.0.0
DB shanduro: v1

komenda

Ichi chichava chimiro chekutanga chekushandisa.

Database shanduko

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

Kuchinja kwekodhi

Iyo application inochengeta Yemunhu data mukati 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
                + "]";
    }
}

Kudzokera kumashure kusingaenderane nekoramu kutumidza zita

Ngatitarisei muenzaniso wekuchinja zita rekoramu:

Attention. Muenzaniso unotevera uchaputsa zvinhu nemaune. Isu tinoratidza izvi kuratidza dambudziko rekuenderana kwedatabase.

Shanduro yeApp: 2.0.0.BAD

DB shanduro: v2bad

komenda

Ikozvino shanduko HAZVITIbvumire kuti timhanye zviitiko zviviri (yekare uye nyowani) panguva imwe chete. Saka, zero downtime deployment ichave yakaoma kuwana (kana fungidziro dzakatariswa, hazvigoneke).

A/B bvunzo

Mamiriro ezvinhu aripo ndeekuti isu tine shanduro yekushandisa 1.0.0, akaiswa mukugadzira, uye database v1. Isu tinofanirwa kuendesa yechipiri muenzaniso wekushandisa, vhezheni 2.0.0.BAD, uye kugadzirisa dhatabhesi kuti v2bad.

Matanho:

  1. chiitiko chitsva cheshanduro yekushandisa inoiswa 2.0.0.BADiyo inovandudza dhatabhesi ku v2bad
  2. mune dhatabhesi v2bad column last_name haisisipo - yakashandurwa kuita surname
  3. Iyo dhatabhesi uye application update yakabudirira uye mamwe mamiriro ari kushanda 1.0.0, vamwe - mukati 2.0.0.BAD. Zvese zvakabatana kune database v2bad
  4. zvese zviitiko zveshanduro 1.0.0 vachatanga kukanda zvikanganiso nekuti ivo vanoedza kuisa data muchikamu last_nameuyo asisipo
  5. zvese zviitiko zveshanduro 2.0.0.BAD achashanda pasina matambudziko

Sezvauri kuona, kana tikaita shanduko kumashure dzisingaenderane kune dhatabhesi uye mashandisiro, kuongororwa kweA / B hakugoneke.

Anwendung rollback

Ngatifungei kuti mushure mekuyedza kuita A/B deployment (approx. per.: munyori angangodaro aireva A/B kuyedzwa pano) isu takasarudza kuti tinoda kudzosera iyo application kune iyo vhezheni 1.0.0. Ngatitii hatidi kudzoreredza dhatabhesi.

Matanho:

  1. tinomisa shanduro yekushandisa muenzaniso 2.0.0.BAD
  2. database ichiripo v2bad
  3. kubva shanduro 1.0.0 haanzwisise kuti chii surname, tichaona kukanganisa
  4. gehena rabuda, hatichadzokeri shure

Sezvauri kuona, kana tikaita shanduko kumashure dzisingaenderane kune dhatabhesi uye mashandisiro, hatigone kudzoreredza kushanduro yapfuura.

Script execution logs

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

Database shanduko

Migration script inotumidza mazita last_name в surname

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

Script inotumidza mazita last_name.

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

Kuchinja kwekodhi

Tashandura zita remunda lastName pamusoro surname.

Kutumidzazve mutsara nenzira inodzokera kumashure-inoenderana

Aya ndiwo mamiriro akajairika atingasangana nawo. Tinofanira kuita shanduko dzekumashure dzisingaenderani. Isu takatoratidza kuti kune zero-downtime deployment, isu hatifanirwe kungoshandisa dhatabhesi kutama pasina mamwe matanho. Muchikamu chino chechinyorwa, tichaita 3 deployments yechishandiso pamwe nekufambisa kwedatabase kuti tiwane mhedzisiro yaunoda tichichengeta kuseri kunoenderana.

Chinyorwa. Rangarira kuti isu tine vhezheni database v1. Iine makoramu first_name и last_name. Tinofanira kuchinja last_name pamusoro surname. Isu tinewo shanduro yeapp 1.0.0, iyo isati yashandiswa surname.

Danho rechipiri: Wedzera surname

Shanduro yeApp: 2.0.0
DB shanduro: v2

komenda

Nekuwedzera koramu nyowani uye kukopa zvirimo, isu tinogadzira kumashure inoenderana dhatabhesi shanduko. Panguva imwecheteyo, kana tikadzosera iyo JAR kana kuita yekare JAR ichimhanya, haityoke panguva yekuurayiwa.

Tiri kuburitsa shanduro itsva

Matanho:

  1. ita dhatabhesi kutama kuti ugadzire chinyorwa chitsva surname. Iye zvino DB yako vhezheni v2
  2. kopira data kubva last_name в surname. Ngwarirakuti kana uine yakawanda data iyi, iwe unofanirwa kufunga nezve batch kutama!
  3. nyora kodhi padzinoshandiswa VESE и новыйuye yekare column. Iye zvino vhezheni yako yeapp 2.0.0
  4. verenga kukosha kubva pa column surname, kana zvisiri null, kana kubva kulast_name, kana surname zvisina kutaurwa. Unogona kudzima getLastName() kubva kune kodhi, sezvo ichabuda null paunenge uchidzosera application yako kubva 3.0.0 up to 2.0.0.

Kana uri kushandisa Spring Boot Flyway, aya matanho maviri achaitwa panguva yekutanga shanduro 2.0.0 applications. Kana iwe uchimhanyisa dhatabhesi yekushandura chishandiso nemaoko, uchafanirwa kuita zvinhu zviviri zvakasiyana kuti uite izvi (kutanga gadziridza iyo db vhezheni nemawoko wozotumira chishandiso chitsva).

Zvinokosha. Rangarira kuti iyo ichangobva kugadzirwa column HAZVIFANIRIRE kuva HAPANA. Kana iwe ukaita kudzoreredza, iyo yekare application haizive nezvekoromo itsva uye haizoiise panguva Insert. Asi kana iwe ukawedzera ichi chinomanikidza uye db yako ichave v2, izvi zvinoda kuisa kukosha kwekoramu itsva. Izvo zvinozoita kuti kutyorwe kwezvirambidzo.

Zvinokosha. Unofanira kubvisa nzira getLastName(), nokuti mushanduro 3.0.0 Iko hakuna pfungwa yekoramu mukodhi last_name. Izvi zvinoreva kuti null ichaiswa ipapo. Iwe unogona kusiya nzira uye kuwedzera cheki ye null, asi mhinduro iri nani ndeye kuve nechokwadi chekuti mune logic getSurname() wakasarudza chaiyo isiri zero kukosha.

A/B bvunzo

Mamiriro ezvinhu aripo ndeekuti isu tine shanduro yekushandisa 1.0.0, yakaiswa pakugadzirwa, uye dhatabhesi mukati v1. Isu tinofanirwa kuendesa wechipiri muenzaniso weshanduro application 2.0.0iyo inovandudza dhatabhesi ku v2.

Matanho:

  1. chiitiko chitsva cheshanduro yekushandisa inoiswa 2.0.0iyo inovandudza dhatabhesi ku v2
  2. panguva ino zvimwe zvikumbiro zvakagadziriswa nezviitiko zveshanduro 1.0.0
  3. iyo yekuvandudza yakabudirira uye une akawanda anomhanya zviitiko zveshanduro application 1.0.0 nedzimwe shanduro 2.0.0. Wese munhu anotaurirana nedatabase mukati v2
  4. version 1.0.0 haishandise surname column mudhatabhesi, asi shanduro 2.0.0 inoshandisa. Havapindirani, uye hapafaniri kuva nekukanganisa.
  5. version 2.0.0 inochengetedza data mune zvese zvekare uye nyowani column, kuve nechokwadi chekudzokera kumashure

Zvinokosha. Kana iwe uine chero mibvunzo inoverenga zvinhu zvichibva pane yekare / nyowani koramu, iwe unofanirwa kuyeuka kuti iwe ikozvino une zvakapetwa maitiro (zvingangoita ivo vachiri kutama). Semuenzaniso, kana iwe uchida kuverenga nhamba yevashandisi vane zita rekupedzisira (chero iyo column inodaidzwa) yakatanga netsamba A, zvino kusvikira kutama kwedata kwapera (oldnew column) unogona kunge uine data risingaenderane kana ukabvunza koramu itsva.

Anwendung rollback

Iye zvino tave neshanduro yeapp 2.0.0 uye database in v2.

Matanho:

  1. dzosera application yako kune vhezheni 1.0.0.
  2. version 1.0.0 haishandise koramu mudhatabhesi surname, saka rollback inofanira kubudirira

DB kuchinja

Database rine column ine zita 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');

Wedzera script surname.

Attention. Rangarira kuti HAUGONE KUWEDZERA chero ZVINHU ZVINOGONESA kukoramu yauri kuwedzera. Kana iwe ukadzoreredza iyo JAR, iyo yekare vhezheni haizove neruzivo nezve iyo yakawedzerwa koramu uye inozoisa otomatiki kuNULL. Kana paine muganhu wakadaro, iyo yekare application inongoputsika.

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

Kuchinja kwekodhi

Isu tinochengeta data se last_nameuye mukati surname. Panguva imwe chete tinoverenga kubva last_name, sezvo koramu iyi ndiyo inonyanya kukosha. Munguva yekuendesa, zvimwe zvikumbiro zvinogona kunge zvakagadziriswa nechiitiko chekunyorera icho chisati chavandudzwa.

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

Nhanho 3: Kubvisa last_name kubva kukodhi

Shanduro yeApp: 3.0.0

DB shanduro:v3

komenda

Cherechedza pa. last_name.

Nekuwedzera koramu nyowani uye kukopa zvirimo, isu takagadzira kumashure inoenderana dhatabhesi shanduko. Zvakare, kana tikadzosera iyo JAR kana kuita yekare JAR ichimhanya, haityoke panguva yekuurayiwa.

Anwendung rollback

Parizvino tine app version 3.0.0 uye database v3. Version 3.0.0 haichengetedze data kune last_name. Izvi zvinoreva kuti mu surname ruzivo rwechizvino-zvino rwakachengetwa.

Matanho:

  1. dzosera application yako kune vhezheni 2.0.0.
  2. version 2.0.0 inoshandisa uye last_name и surname.
  3. version 2.0.0 achatora surname, kana isiri zero, neimwe nzira -last_name

Database shanduko

Iko hakuna shanduko yezvimiro mudhatabhesi. Iyo inotevera script inoitwa kuti iite kutama kwekupedzisira kweiyo data yekare:

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

Kuchinja kwekodhi

Cherechedza pa. last_name.

Isu tinochengeta data se last_nameuye mukati surname. Uyezve, tinoverenga kubva muchikamu last_name, sezvo iri iyo inonyanya kukosha. Panguva yekuendesa, zvimwe zvikumbiro zvinogona kugadziriswa nechiitiko chisati chavandudzwa.

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

Nhanho 4: Kubvisa last_name kubva kune database

Shanduro yeApp: 4.0.0

DB shanduro: v4

komenda

Nekuda kwekuti iyo vhezheni kodhi 3.0.0 handina kushandisa column last_name, hapana chakaipa chichaitika panguva yekuurayiwa kana tikadzokera kumashure 3.0.0 mushure mekubvisa koramu kubva kune database.

Script execution logs

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 kuchinja

Zvakanaka v3 isu tinongobvisa mbiru last_name uye wedzera zvirambidzo zvisipo.

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

Kuchinja kwekodhi

Iko hakuna shanduko kune kodhi.

mhedziso

Isu takabudirira kushandisa kumashure-isingaenderane column zita shanduko nekuita akati wandei kumashure-anoenderana deployments. Pazasi pane pfupiso yezviito zvakaitwa:

  1. kutumirwa kweshanduro yekushandisa 1.0.0 с v1 database schema (column name = last_name)
  2. kutumirwa kweshanduro yekushandisa 2.0.0, iyo inochengeta data mukati last_name и surname. Chikumbiro chinoverengwa kubva last_name. Database iri mushanduro v2ine mbiru dzakadai last_name, uye surname. surname ikopi ye last_name. (Cherechedza: Iyi koramu haifanirwe kunge iine nhanho inomanikidza)
  3. kutumirwa kweshanduro yekushandisa 3.0.0, iyo inongochengeta data mukati surname uye anoverenga kubva kusurname. Kana iri dhatabhesi, kutama kwekupedzisira kuri kuitika last_name в surname. Uyewo muganhu HAPANA kubviswa kubva last_name. Iyo database yave mushanduro v3
  4. kutumirwa kweshanduro yekushandisa 4.0.0 - hapana shanduko inoitwa kune kodhi. Database deployment v4, iyo inobvisa last_name. Pano iwe unogona kuwedzera chero zvipingamupinyi zvisipo kune database.

Nekutevera nzira iyi, unogona kugara uchidzosera kumashure imwe vhezheni pasina kutyora dhatabhesi / kuenderana kwekushandisa.

kodhi

Yese kodhi inoshandiswa muchinyorwa ichi inowanikwa pa Github. Pazasi pane imwe tsananguro.

Zvirongwa

Mushure mekuvhara iyo repository, iwe uchaona inotevera folda chimiro.

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

Zvinyorwa

Iwe unogona kumhanya zvinyorwa zvinotsanangurwa muzvinyorwa pazasi, izvo zvicharatidza kumashure-inoenderana uye isingaenderane shanduko kune dhatabhesi.

Kuona iyo nyaya ine kumashure inoenderana shanduko, run:

./scripts/scenario_backward_compatible.sh

Uye kuona nyaya ine kumashure isingaenderane shanduko, run:

./scripts/scenario_backward_incompatible.sh

Spring Boot Muenzaniso Flyway

Mienzaniso yese inotorwa kubva Spring Boot Sample Flyway.

Unogona kutarisa http://localhost:8080/flyway, pane rondedzero yezvinyorwa.

Uyu muenzaniso unosanganisirawo H2 console (pa http://localhost:8080/h2-console) kuti iwe ugone kuona iyo dhatabhesi mamiriro (default jdbc URL iri jdbc:h2:mem:testdb).

Mukuwedzera

Verengawo zvimwe zvinyorwa pane yedu blog:

Source: www.habr.com

Voeg