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
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:
tha eisimpleir Úr den tagradh dreach air a chleachdadh 2.0.0.BADFar an Úraich thu an stòr-dà ta a v2bad
anns an stòr-dà ta v2bad colbh last_name chan eil e ann tuilleadh - chaidh atharrachadh gu surname
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
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
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:
bidh sinn aâ stad mar eisimpleir den tagradh dreach 2.0.0.BAD
tha an stòr-dà ta fhathast v2bad
bhon dreach 1.0.0 chan eil a 'tuigsinn dè a th' ann surname, chÏ sinn mearachdan
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:
dèan imrich stòr-dà ta gus colbh Úr a chruthachadh surname. A-nis an dreach DB agad v2
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!
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
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:
tha eisimpleir Úr den tagradh dreach air a chleachdadh 2.0.0Far an Úraich thu an stòr-dà ta a v2
san eadar-ama chaidh cuid de dh'iarrtasan a phròiseasadh le eisimpleirean dreach 1.0.0
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
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.
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:
cuir air ais an tagradh agad gu dreach 1.0.0.
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:
cuir air ais an tagradh agad gu dreach 2.0.0.
dreach 2.0.0 cleachdadh agus last_name и surname.
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:
cleachdadh dreach an tagraidh 1.0.0 Ń v1 sgeama stòr-dĂ ta (ainm colbh = last_name)
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)
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
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).