Cleachdadh Zero Downtime agus Stòr-dàta

Cleachdadh Zero Downtime agus Stòr-dàta

Tha an artaigil seo a’ mìneachadh gu mionaideach mar as urrainn dhut cùisean co-chòrdalachd stòr-dàta fhuasgladh ann an cleachdadh. Innsidh sinn dhut dè as urrainn tachairt dha na tagraidhean riochdachaidh agad ma dh'fheuchas tu ri cleachdadh gun ullachadh ro-làimh. Thèid sinn an uairsin tro na h-ìrean cuairt-beatha tagraidh a dh’ fheumar gus ùine downt neoni a bhith againn (mu thuairmeas. sreath: nas fhaide - ùine downt neoni). Is e toradh ar gnìomhachd a bhith a’ cur an sàs atharrachadh stòr-dàta air ais neo-fhreagarrach ann an dòigh a tha iomchaidh air ais.

Ma tha thu airson na h-eisimpleirean còd bhon artaigil a thuigsinn, gheibh thu iad aig GitHub.

Ro-rĂ dh

Cleachdadh neoni downtime

Dè a tha dìomhair cleachdadh neoni downtime? Faodaidh tu a ràdh gur ann nuair a thèid an tagradh agad a chleachdadh ann an dòigh is gun urrainn dhut dreach ùr den tagradh a thoirt a-steach gu cinneasachadh gu soirbheachail, fhad ‘s nach mothaich an neach-cleachdaidh nach eil e ri fhaighinn. Bho shealladh neach-cleachdaidh agus companaidh, is e seo an suidheachadh cleachdadh as fheàrr oir tha e a’ ceadachadh feartan ùra a thoirt a-steach agus bugaichean a shuidheachadh gun aimhreit.

Ciamar a choileanadh seo? Tha grunn dhòighean ann, seo fear dhiubh:

  • cuir an gnĂŹomh tionndadh Àir. 1 den t-seirbheis agad
  • imrich stòr-dĂ ta a dhèanamh
  • Cleachd dreach #2 den t-seirbheis agad aig an aon Ă m ri dreach #1
  • cho luath 's a chĂŹ thu gu bheil an tionndadh sin Àir. 2 ag obair mar bu chòir, thoir air falbh dreach Àir. 1
  • deiseil!

Furasta, nach eil? Gu mÏ-fhortanach, chan eil e cho sÏmplidh sin, agus bheir sinn sÚil mhionaideach air sin nas fhaide air adhart. A-nis leig dhuinn sÚil a thoirt air pròiseas cleachdadh gu math cumanta eile - cleachdadh gorm uaine.

An cuala tu a-riamh mu dheidhinn cleachdadh gorm uaine? Tha Cloud Foundry a’ dèanamh seo gu math furasta. Dìreach coimhead air an artaigil seo, far am bi sinn a’ toirt cunntas nas mionaidiche air seo. Gus geàrr-chunntas goirid a dhèanamh, leig dhuinn do chuimhneachadh mar a nì thu cleachdadh gorm uaine:

  • dèan cinnteach gun obraich dĂ  leth-bhreac den chòd riochdachaidh agad (“gorm” agus “uaine”);
  • stiĂšir a h-uile trafaic chun Ă rainneachd ghorm, i.e. gus am bi URLan toraidh a’ comharrachadh an sin;
  • cleachdadh agus deuchainn a h-uile atharrachadh tagraidh ann an Ă rainneachd uaine;
  • atharraich urls bho Ă rainneachd ghorm gu uaine

Tha cleachdadh gorm uaine na dhòigh-obrach a leigeas leat feartan ùra a thoirt a-steach gu furasta gun a bhith draghail mu bhriseadh cinneasachaidh. Tha seo air sgàth gu bheil eadhon ged a thachras rudeigin, is urrainn dhut gluasad air ais chun àrainneachd a bh ’ann roimhe le bhith dìreach“ a ’brùthadh suidse.”

Às deidh dhut a h-uile rud gu h-àrd a leughadh, faodaidh tu a’ cheist fhaighneachd: Dè a th’ aig àm downt neoni ri dhèanamh ri cleachdadh Blue green?

Uill, tha tòrr aca ann an cumantas, leis gu bheil a bhith a’ cumail dà leth-bhreac den aon àrainneachd feumach air dà uiread na h-oidhirp airson an cumail suas. Sin as coireach gu bheil cuid de sgiobaidhean ag agairt Màrtainn Fowler, lean atharrachadh den dòigh-obrach seo:

Is e roghainn eile an aon stòr-dàta a chleachdadh, a’ cruthachadh suidsichean gorm-uaine airson an lìon agus sreathan fearainn. San dòigh-obrach seo, faodaidh an stòr-dàta a bhith na dhuilgheadas gu tric, gu sònraichte nuair a dh’ fheumas tu an sgeama aige atharrachadh gus taic a thoirt do dhreach ùr den bhathar-bog.

Agus an seo thig sinn chun phrÏomh dhuilgheadas san artaigil seo. Stòr-dàta. Bheir sinn sÚil eile air an abairt seo.

imrich stòr-dàta a dhèanamh.

A-nis feumaidh tu a’ cheist fhaighneachd dhut fhèin - dè mura h-eil atharrachadh an stòr-dàta co-chòrdail air ais? Nach bris a’ chiad dreach agam den aplacaid? Gu dearbh, is e seo dìreach a thachras ...

Mar sin, eadhon a dh’ aindeoin na buannachdan mòra a tha an lùib ùine downt neoni / cleachdadh gorm uaine, tha companaidhean buailteach a bhith a’ leantainn a’ phròiseas nas sàbhailte a leanas airson na tagraidhean aca a chleachdadh:

  • ullaich pasgan le dreach Ăšr den tagradh
  • tagradh ruith dĂšnadh
  • ruith sgriobtaichean gus an stòr-dĂ ta a ghluasad
  • cleachdadh agus cuir air bhog dreach Ăšr den tagradh

San artaigil seo, bheir sinn mion-fhiosrachadh air mar as urrainn dhut obrachadh leis an stòr-dàta agus an còd agad gus brath a ghabhail air cleachdadh Úine downt neoni.

CÚisean stòr-dàta

Ma tha tagradh gun stàit agad nach eil a’ stòradh dàta sam bith san stòr-dàta, gheibh thu cleachdadh ùine downt neoni sa bhad. Gu mì-fhortanach, feumaidh a’ mhòr-chuid de bhathar-bog dàta a stòradh an àiteigin. Sin as coireach gum bu chòir dhut smaoineachadh dà uair mus dèan thu atharrachadh sam bith air a 'chuairt. Mus fhaigh sinn a-steach don fhiosrachadh mu mar a dh’ atharraicheas sinn an sgeama gus nach bi e comasach cleachdadh ùine gun chrìoch, leig dhuinn fòcas a chuir air an sgeama dreach an toiseach.

Sgeama tionndadh

San artaigil seo cleachdaidh sinn Slighe-adhair mar inneal smachd dreach (mu thuairmeas. Eadar-theangachadh: tha sinn a 'bruidhinn mu dheidhinn imrich stòr-dàta). Gu nàdarra, sgrìobhaidh sinn cuideachd tagradh Spring Boot aig a bheil taic Flyway a-steach agus nì sinn imrich sgeama fhad ‘s a bhios sinn a’ stèidheachadh co-theacs an tagraidh. Nuair a bhios tu a’ cleachdadh Flyway, is urrainn dhut sgriobtaichean imrich a stòradh ann am pasgan do phròiseactan (gu bunaiteach ann an classpath:db/migration). An seo chì thu eisimpleir de leithid de fhaidhlichean imrich

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

Anns an eisimpleir seo chÏ sinn 4 sgriobtaichean imrich a thèid, mura tèid an cur gu bàs roimhe, a chuir gu bàs aon às deidh a chèile nuair a thòisicheas an tagradh. Bheir sinn sÚil air aon de na faidhlichean (V1__init.sql) mar eisimpleir.

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

Tha a h-uile dad gu tur fèin-mhÏneachail: faodaidh tu SQL a chleachdadh gus mÏneachadh mar a bu chòir an stòr-dàta agad atharrachadh. Airson tuilleadh fiosrachaidh mu Spring Boot agus Flyway, thoir sÚil air Boot Docs an Earraich.

Le bhith a’ cleachdadh inneal smachd stòr le Spring Boot, gheibh thu buannachdan mòra 2:

  • bidh thu a’ sgaradh atharrachaidhean stòr-dĂ ta bho atharrachaidhean còd
  • Bidh imrich stòr-dĂ ta a’ tachairt còmhla ri sgaoileadh an tagraidh agad, i.e. tha am pròiseas cleachdadh agad air a dhèanamh nas sĂŹmplidhe

Fuasgladh dhuilgheadasan stòr-dàta

Anns an ath earrann den artaigil, cuiridh sinn fòcas air a bhith a’ coimhead air dà dhòigh air atharrachadh stòr-dàta.

  • neo-fhreagarrachd air ais
  • co-fhreagarrachd air ais

Bithear a’ beachdachadh air a’ chiad fhear mar rabhadh nach bu chòir dhut cleachdadh neoni downtime a dhèanamh gun ullachadh ro-làimh... Tha an dàrna fear a’ tabhann fuasgladh air mar as urrainn dhut cleachdadh a dhèanamh gun ùine downt agus aig an aon àm cumail co-chòrdalachd air ais.

Bidh am pròiseact againn air am bi sinn ag obair mar thagradh sìmplidh Spring Boot Flyway aig a bheil Person с first_name и last_name anns an stòr-dàta (mu thuairmeas. eadar-theangachadh: Person tha bòrd agus first_name и last_name — is iad so na raointean a tha innte). Tha sinn airson ath-ainmeachadh last_name в surname.

barailean

Mus fhaigh sinn a-steach don fhiosrachadh, tha beachd no dhà a dh’ fheumas sinn a dhèanamh mu na tagraidhean againn. Is e am prìomh thoradh a tha sinn airson a choileanadh pròiseas gu math sìmplidh.

An nota. Gnìomhachas PRO-TIP. Faodaidh pròiseasan sìmplidh tòrr airgid a shàbhaladh dhut air taic (mar as motha de dhaoine a tha agad ag obair don chompanaidh agad, is ann as motha de dh’ airgead as urrainn dhut a shàbhaladh)!

Chan eil feum air an stòr-dàta a thoirt air ais

Tha seo a’ sìmpleachadh a’ phròiseas cleachdadh (tha cuid de ro-aithrisean stòr-dàta cha mhòr do-dhèanta, leithid toirt air ais sguabaidh às). Is fheàrr leinn dìreach tagraidhean a thoirt air ais. San dòigh seo, eadhon ged a tha stòran-dàta eadar-dhealaichte agad (mar eisimpleir, SQL agus NoSQL), bidh an loidhne-phìoban cleachdadh agad a’ coimhead mar an ceudna.

Feumaidh e A-MHÀIN a bhith comasach an tagradh a thoirt air ais aon dreach air ais (gun a bhith nas fhaide)

Cha bu chòir tilleadh air ais a dhèanamh ach nuair a bhios feum air. Ma tha buga san dreach làithreach nach eil furasta a rèiteachadh, bu chòir dhuinn a bhith comasach air tilleadh chun dreach obrach as ùire. Tha sinn a’ gabhail ris gur e an dreach obrach as ùire seo an tè roimhe. Bhiodh e glè dhoirbh agus daor co-chòrdalachd còd is stòr-dàta a chumail airson barrachd air aon sgaoileadh.

An nota. Airson barrachd leughaidh, san artaigil seo atharraichidh sinn prĂŹomh dhreach an tagraidh.

Ceum 1: StĂ it tĂšsail

Tionndadh an aplacaid: 1.0.0
Tionndadh DB: v1

beachd

Is e seo suidheachadh tĂšsail an tagraidh.

Stòr-dàta atharraichean

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

Còd ag atharrachadh

Bidh an aplacaid a’ stòradh dàta neach ann an 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
                + "]";
    }
}

Ath-ainmeachadh colbh neo-fhreagarrach air ais

Bheir sinn sĂšil air eisimpleir de mar a dh'atharraicheas tu ainm colbh:

Thoir aire. Bidh an eisimpleir a leanas a’ briseadh rudan a dh’aona ghnothach. Bidh sinn a’ sealltainn seo gus an duilgheadas a thaobh co-chòrdalachd stòr-dàta a nochdadh.

Tionndadh an aplacaid: 2.0.0.BAD

Tionndadh DB: v2bad

beachd

CHAN EIL na h-atharrachaidhean gnàthach a’ leigeil leinn dà eisimpleir a ruith (sean is ùr) aig an aon àm. Mar sin, bidh e duilich cleachdadh ùine downt neoni a choileanadh (ma bheirear aire do bharailean, tha e do-dhèanta).

A/B deuchainn

Is e an suidheachadh làithreach gu bheil dreach tagraidh againn 1.0.0, air a chleachdadh ann an riochdachadh, agus stòr-dàta v1. Feumaidh sinn dàrna eisimpleir den tagradh, dreach 2.0.0.BAD, agus Úraich an stòr-dàta gu v2bad.

Ceumannan:

  1. tha eisimpleir Úr den tagradh dreach air a chleachdadh 2.0.0.BADFar an Úraich thu an stòr-dàta a v2bad
  2. anns an stòr-dàta v2bad colbh last_name chan eil e ann tuilleadh - chaidh atharrachadh gu surname
  3. Bha an stòr-dàta agus ùrachadh an tagraidh soirbheachail agus tha cuid de shuidheachaidhean a’ dol 1.0.0, feadhainn eile - a-staigh 2.0.0.BAD. Tha a h-uile càil ceangailte ris an stòr-dàta v2bad
  4. a h-uile suidheachadh den dreach 1.0.0 tòisichidh iad a’ tilgeil mhearachdan oir feuchaidh iad ri dàta a chuir a-steach don cholbh last_namecò nach eil ann tuilleadh
  5. a h-uile suidheachadh den dreach 2.0.0.BAD obraichidh e gun duilgheadas

Mar a chÏ thu, ma nÏ sinn atharrachaidhean air ais nach eil co-chosmhail ris an stòr-dàta agus an tagradh, tha deuchainn A / B do-dhèanta.

Iarrtas air ais

Gabhamaid ris às deidh dhuinn feuchainn ri cleachdadh A / B a dhèanamh (mu thuairmeas. per .: is dòcha gu robh an t-ùghdar a’ ciallachadh deuchainn A/B an seo) cho-dhùin sinn gum feum sinn an tagradh a thoirt air ais chun dreach 1.0.0. Canaidh sinn nach eil sinn airson an stòr-dàta a thoirt air ais.

Ceumannan:

  1. bidh sinn a’ stad mar eisimpleir den tagradh dreach 2.0.0.BAD
  2. tha an stòr-dàta fhathast v2bad
  3. bhon dreach 1.0.0 chan eil a 'tuigsinn dè a th' ann surname, chÏ sinn mearachdan
  4. tha ifrinn air briseadh sgaoilte, chan urrainn dhuinn a dhol air ais tuilleadh

Mar a chÏ thu, ma nÏ sinn atharrachaidhean air ais nach eil co-chosmhail ris an stòr-dàta agus an aplacaid, chan urrainn dhuinn gluasad air ais chun dreach roimhe.

Logaichean coileanadh sgriobtaichean

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

Stòr-dàta atharraichean

Sgriobt imrich a tha ag ath-ainmeachadh last_name в surname

Stòr sgriobt 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');

Sgriobt a tha ag ath-ainmeachadh last_name.

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

Còd ag atharrachadh

Tha sinn air ainm an raoin atharrachadh lastName air surname.

Ag ath-ainmeachadh colbh ann an dòigh a tha iomchaidh air ais

Is e seo an suidheachadh as cumanta a dh’ fhaodadh sinn a thighinn tarsainn. Feumaidh sinn atharrachaidhean air ais nach eil iomchaidh a dhèanamh. Tha sinn mar-thà air dearbhadh nach bu chòir dhuinn dìreach imrich stòr-dàta a chuir an sàs gun cheuman a bharrachd airson cleachdadh ùine gun stad. Anns an earrainn seo den artaigil, nì sinn 3 cleachdadh den tagradh còmhla ri imrich stòr-dàta gus an toradh a tha thu ag iarraidh a choileanadh fhad ‘s a chumas sinn co-chòrdalachd air ais.

An nota. Cuimhnich gu bheil stòr-dàta dreach againn v1. Tha colbhan ann first_name и last_name. Feumaidh sinn atharrachadh last_name air surname. Tha dreach app againn cuideachd 1.0.0, nach eil air a chleachdadh fhathast surname.

Ceum 2: Cuir sloinneadh

Tionndadh an aplacaid: 2.0.0
Tionndadh DB: v2

beachd

Le bhith a’ cur colbh ùr ris agus a’ dèanamh lethbhreac de na tha ann, cruthaichidh sinn atharrachaidhean stòr-dàta co-chosmhail air ais. Aig an aon àm, ma bheir sinn air ais an JAR no ma tha seann JAR a’ ruith, cha bhris e nuair a thèid a chur gu bàs.

Tha sinn a’ sgaoileadh dreach ùr

Ceumannan:

  1. dèan imrich stòr-dàta gus colbh Úr a chruthachadh surname. A-nis an dreach DB agad v2
  2. lethbhreac dàta bho last_name в surname. Thoir airema tha tòrr den dàta seo agad, bu chòir dhut beachdachadh air imrich baidse!
  3. sgrìobh an còd far a bheil iad gan cleachdadh A BHITH и новыйagus an t-seann colbh. A-nis an dreach app agad 2.0.0
  4. leugh an luach bhon cholbh surname, mura h-eil null, no bho last_namema tha surname nach deach a shònrachadh. Faodaidh tu a sguabadh às getLastName() bhon chòd, oir thig e a-mach null nuair a chuireas tu an tagradh agad air ais bho 3.0.0 gu 2.0.0.

Ma tha thu a’ cleachdadh Spring Boot Flyway, thèid an dà cheum seo a choileanadh nuair a thòisicheas tu dreach 2.0.0 iarrtasan. Ma ruitheas tu inneal tionndadh an stòr-dàta le làimh, feumaidh tu dà rud eadar-dhealaichte a dhèanamh gus seo a dhèanamh (an-toiseach ùraich an tionndadh db le làimh agus an uairsin cleachd an aplacaid ùr).

Tha e cudromach. Cuimhnich gu bheil an colbh a tha air ùr chruthachadh CHAN EIL a bhith NACH EIL. Ma nì thu gluasad air ais, chan eil fios aig an t-seann aplacaid mun cholbh ùr agus cha chuir e a-steach e rè Insert. Ach ma chuireas tu ris a' bhacadh so 's bidh do db v2, feumaidh seo luach a’ cholbh ùr a shuidheachadh. A bheir gu briseadh cuingealachaidhean.

Tha e cudromach. Bu chòir dhut an dòigh-obrach a thoirt air falbh getLastName(), oir anns an dreach 3.0.0 Chan eil bun-bheachd air colbh sa chòd last_name. Tha seo a’ ciallachadh gun tèid null a shuidheachadh an sin. Faodaidh tu am modh fhàgail agus seicichean a chuir ris null, ach bhiodh fuasgladh fada na b’ fheàrr dèanamh cinnteach sin anns an loidsig getSurname() thagh thu an luach neo-neoni ceart.

A/B deuchainn

Is e an suidheachadh làithreach gu bheil dreach tagraidh againn 1.0.0, air a chleachdadh air riochdachadh, agus an stòr-dàta ann an v1. Feumaidh sinn dàrna eisimpleir den tagradh dreach a chleachdadh 2.0.0a bheir Úrachadh air an stòr-dàta gu v2.

Ceumannan:

  1. tha eisimpleir Úr den tagradh dreach air a chleachdadh 2.0.0Far an Úraich thu an stòr-dàta a v2
  2. san eadar-ama chaidh cuid de dh'iarrtasan a phròiseasadh le eisimpleirean dreach 1.0.0
  3. bha an t-ùrachadh soirbheachail agus tha grunn eisimpleirean ruith agad den tagradh dreach 1.0.0 agus dreachan eile 2.0.0. Bidh a h-uile duine a’ conaltradh ris an stòr-dàta ann an v2
  4. dreach 1.0.0 chan eil e a’ cleachdadh colbh an t-sloinneadh san stòr-dàta, ach an dreach 2.0.0 cleachdadh. Chan eil iad a 'cur bacadh air a chèile, agus cha bu chòir mearachdan a bhith ann.
  5. dreach 2.0.0 a’ stòradh dàta an dà chuid sa cholbh sean agus ùr, a’ dèanamh cinnteach à co-chòrdalachd air ais

Tha e cudromach. Ma tha ceist sam bith agad a tha a’ cunntadh nithean stèidhichte air luachan bhon t-seann cholbh / ùr, bu chòir dhut cuimhneachadh gu bheil luachan dùblaichte agad a-nis (is dòcha gu bheil iad fhathast a’ gluasad). Mar eisimpleir, ma tha thu airson an àireamh de luchd-cleachdaidh a chunntadh a thòisich an t-ainm mu dheireadh (ge bith dè an colbh a chanar ris) leis an litir A, an uairsin gus an tèid imrich dàta a chrìochnachadh (old → new colbh) faodaidh gum bi dàta neo-chunbhalach agad ma chuireas tu ceist air colbh ùr.

Iarrtas air ais

A-nis tha dreach app againn 2.0.0 agus stòr-dàta ann v2.

Ceumannan:

  1. cuir air ais an tagradh agad gu dreach 1.0.0.
  2. dreach 1.0.0 na cleachd colbh san stòr-dàta surname, mar sin bu chòir don ro-ràdh a bhith soirbheachail

Tha DB ag atharrachadh

Anns an stòr-dàta tha colbh ainmichte last_name.

Sgriobt stòr 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');

Cuir ris an sgriobt surname.

Thoir aire. Cuimhnich nach urrainn dhut cuingeachaidhean NOT NULL sam bith a chur ris a’ cholbh a tha thu a’ cur ris. Ma bheir thu air ais an JAR, cha bhi beachd sam bith aig an t-seann dreach mun cholbh a bharrachd agus cuiridh e gu NULL e gu fèin-ghluasadach. Ma tha an leithid de chuingealachadh ann, bidh an seann iarrtas dìreach a’ briseadh.

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

Còd ag atharrachadh

Bidh sinn a’ stòradh dàta mar last_name, agus a-staigh surname. Aig an aon àm tha sinn a 'leughadh bho last_name, leis gur e an colbh seo am fear as buntainniche. Tron phròiseas cleachdadh, dh’ fhaodadh gun deach cuid de dh’iarrtasan a làimhseachadh le eisimpleir tagraidh nach deach ùrachadh fhathast.

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

Ceum 3: Thoir air falbh last_name bhon chòd

Tionndadh an aplacaid: 3.0.0

Tionndadh DB:v3

beachd

Thoir an aire per .: A rèir choltais, anns an artaigil thùsail rinn an t-ùghdar lethbhreac de theacsa a’ bhloca seo bho cheum 2 le mearachd. last_name.

Le bhith a’ cur colbh ùr ris agus a’ dèanamh lethbhreac de na tha ann, chruthaich sinn atharraichean stòr-dàta co-chosmhail air ais. Cuideachd, ma bheir sinn air ais an JAR no ma tha seann JAR againn a’ ruith, cha bhris e nuair a thèid a chur gu bàs.

Iarrtas air ais

An-dràsta tha dreach app againn 3.0.0 agus stòr-dàta v3. Tionndadh 3.0.0 chan eil e a 'sàbhaladh dàta gu last_name. Tha seo a’ ciallachadh gu bheil ann an surname tha am fiosrachadh as ùire air a stòradh.

Ceumannan:

  1. cuir air ais an tagradh agad gu dreach 2.0.0.
  2. dreach 2.0.0 cleachdadh agus last_name и surname.
  3. dreach 2.0.0 bheir surname, mura h-eil e neoni, air dhòigh eile -last_name

Stòr-dàta atharraichean

Chan eil atharrachaidhean structarail sam bith san stòr-dàta. Tha an sgriobt a leanas air a chuir gu bàs gus an imrich mu dheireadh den t-seann dàta a dhèanamh:

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

Còd ag atharrachadh

Thoir an aire per .: Chaidh an tuairisgeul air a 'bhloc seo a chopaigeadh gu mearachdach leis an Úghdar bho cheum 2. A rèir loidsig an artaigil, bu chòir atharrachaidhean anns a 'chòd aig a' cheum seo a bhith ag amas air na h-eileamaidean a tha ag obair leis a 'cholbh a thoirt air falbh bhuaithe. last_name.

Bidh sinn a’ stòradh dàta mar last_name, agus a-staigh surname. A bharrachd air an sin, leugh sinn bhon cholbh last_name, oir is e am fear as freagarraiche. Tron phròiseas cleachdadh, dh’ fhaodadh cuid de dh’ iarrtasan a bhith air an giullachd le eisimpleir nach deach ùrachadh fhathast.

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

Ceum 4: A 'toirt air falbh last_name bhon stòr-dàta

Tionndadh an aplacaid: 4.0.0

Tionndadh DB: v4

beachd

Air sgàth 's gu bheil an còd dreach 3.0.0 cha do chleachd e an colbh last_name, cha tachair dad dona aig àm cur gu bàs ma thilleas sinn air ais gu 3.0.0 às deidh colbh a thoirt air falbh bhon stòr-dàta.

Logaichean coileanadh sgriobtaichean

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

Tha DB ag atharrachadh

An ìre mhath v3 bidh sinn dìreach a’ toirt air falbh an colbh last_name agus cuir ris na cuingeadan a tha a dhìth.

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

Còd ag atharrachadh

Chan eil atharrachaidhean sam bith air a’ chòd.

co-dhĂšnadh

Shoirbhich leinn le atharrachadh ainm colbh air ais-neo-fhreagarrach le bhith a’ coileanadh grunn chleachdadh a bha co-chosmhail air ais. Gu h-ìosal tha geàrr-chunntas de na gnìomhan a chaidh a dhèanamh:

  1. cleachdadh dreach an tagraidh 1.0.0 с v1 sgeama stòr-dàta (ainm colbh = last_name)
  2. cleachdadh dreach an tagraidh 2.0.0, a tha a’ stòradh dàta ann last_name и surname. Tha an tagradh a’ leughadh bho last_name. Tha an stòr-dàta ann an dreach v2anns a bheil colbhan mar last_name, agus surname. surname tha leth-bhreac de last_name. (NOTA: Chan fhaod cuingealachadh nach eil null a bhith sa cholbh seo)
  3. cleachdadh dreach an tagraidh 3.0.0, a bhios a’ stòradh dàta a-mhàin surname agus a' leughadh o shloinneadh. A thaobh an stòr-dàta, tha an imrich mu dheireadh a’ gabhail àite last_name в surname. Cuideachd cuingealachadh NACH EIL air a thoirt air falbh bho last_name. Tha an stòr-dàta a-nis ann an dreach v3
  4. cleachdadh dreach an tagraidh 4.0.0 - chan eil atharrachadh sam bith air a dhèanamh air a’ chòd. Cleachdadh stòr-dàta v4, a bheir air falbh last_name. An seo faodaidh tu cuingeadan sam bith a tha a dhìth a chur ris an stòr-dàta.

Le bhith a’ leantainn an dòigh-obrach seo, faodaidh tu an-còmhnaidh aon dreach a thoirt air ais gun a bhith a’ briseadh co-fhreagarrachd stòr-dàta / tagradh.

còd a '

Tha a h-uile còd a chleachdar san artaigil seo ri fhaighinn aig GitHub. Gu h-Ïosal tha tuairisgeul a bharrachd.

Pròiseactan

Às deidh dhut an stòr a ghleusadh, chì thu an structar pasgan a leanas.

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

SgrĂŹobhaidhean

Faodaidh tu na sgriobtaichean a tha air am mÏneachadh anns na sgriobtaichean gu h-Ïosal a ruith, a sheallas atharrachaidhean a tha co-chosmhail air ais agus neo-fhreagarrach air an stòr-dàta.

Gus faicinn a’ chùis le atharrachaidhean co-chosmhail air ais, ruith:

./scripts/scenario_backward_compatible.sh

Agus a dh'fhaicinn cĂšis le atharrachaidhean air ais neo-fhreagarrach, ruith:

./scripts/scenario_backward_incompatible.sh

Eisimpleir Flyway Boot an Earraich

Tha na h-eisimpleirean uile air an toirt bho Spring Boot Sample Flyway.

Faodaidh tu sĂšil a thoirt air http://localhost:8080/flyway, tha liosta de sgriobtaichean ann.

Tha an eisimpleir seo cuideachd a’ toirt a-steach consol H2 (aig http://localhost:8080/h2-console) gus am faic thu inbhe an stòr-dàta (is e URL bunaiteach jdbc jdbc:h2:mem:testdb).

a bharrachd air sin

Leugh cuideachd artaigilean eile air ar blog:

Source: www.habr.com

Cuir beachd ann