60
Diegimas nestabdant sistemos Technikos ir architektūros Rolandas Jaskovikas Kaunas JUG 2017-01-18

Zero downtime deployment

Embed Size (px)

Citation preview

Page 1: Zero downtime deployment

Diegimas nestabdant sistemosTechnikos ir architektūros

Rolandas Jaskovikas Kaunas JUG 2017-01-18

Page 2: Zero downtime deployment

Agenda

Įvadas - kam tai reikalinga ir …

Veikimo pagrindai

Prototipas ir jo architektūra

Versijos keitimo technikos

Architektūros

Naudingos smulkmenos

Kartais reikia paleisti iš naujo

Page 3: Zero downtime deployment

Įvadas

Page 4: Zero downtime deployment

Įvadas

Kam to reikia:

A. Kūrimo ar priežiūros (SLA) sutartyse reikalaujama > 99% up time’o.

B. Norime turėti pilnavertį “Continuous deployment” procesą

C. Norime pakeitimus diegti darbo metu

Kodėl nedarome:

Nėra poreikio – dauguma sistemų darbo laikas nuo 08 iki 17 valandos

Sudėtingesnis programavimas – neatneša naudos

Reikia patyrusių programuotojų

Nemokame – dėl aukščiau išvardintų priežasčių praktika nėra paplitusi

Page 5: Zero downtime deployment

Įvadas

Reikalavimai:

A. Labai pageidaujamas automatizuotas “Continuos deployment” procesas

B. Diegimas mažais funkcionalumo gabaliukais – 15 diegimu per diena norma

C. Du ar daugiau aplikacijų serverių/konteinerių

Pastebėjimai:

A. Visiškai 100% sistemos nestabdymo pasiekti negalima

B. High availability nėra reikalingas, tačiau kartais HA gauname dovanų

Page 6: Zero downtime deployment

Veikimo pagrindai

Page 7: Zero downtime deployment

Veikimo pagrindai

Kas trukdo realiu laiku pakeisti esamą programą į naują:

A. Veikiantis procesas (kodas)

B. Jau egzistuojantys duomenys (būsena)

Spendimas:

A. Programa išskaidoma į kelis nepriklausomus procesus

Page 8: Zero downtime deployment

Veikimo pagrindai – keli procesai

Page 9: Zero downtime deployment

Veikimo pagrindai

Kas trukdo realiu laiku pakeisti esamą programą į naują:

A. Veikiantis procesas (kodas)

B. Jau egzistuojantys duomenys (būsena)

Spendimas:

A. Programa išskaidoma į kelis nepriklausomus procesus

B. Atliekamas kodo ir būsenos atskyrimas

Page 10: Zero downtime deployment

Veikimo pagrindai – atskirta būsena

Page 11: Zero downtime deployment

Veikimo pagrindai – būsenos nesuderinamos

Page 12: Zero downtime deployment

Veikimo pagrindai

Kas trukdo realiu laiku pakeisti esamą programą į naują:

A. Veikiantis procesas (kodas)

B. Jau egzistuojantys duomenys (būsena)

Spendimas:

A. Programa išskaidoma į kelis nepriklausomus procesus

B. Atliekamas kodo ir būsenos atskyrimas

C. Naudojamas karšto suderinamumo principas (angl: Hot compatibility)

Page 13: Zero downtime deployment

Veikimo pagrindai – karštas suderinamumas

Page 14: Zero downtime deployment

Veikimo pagrindai

Kas trukdo realiu laiku pakeisti esamą programą į naują:

A. Veikiantis procesas (kodas)

B. Jau egzistuojantys duomenys (būsena)

Spendimas:

A. Programa išskaidoma į kelis nepriklausomus procesus

B. Atliekamas kodo ir būsenos atskyrimas

C. Naudojamas karšto suderinamumo principas (angl: Hot compatibility)

Pastebėjimai:

A. Labai paprasta kuomet nėra būsenos – pakeitimas greitas ir paprastas

B. Laikui bėgant reikia nepamiršti išsivalyti seno kodo

Page 15: Zero downtime deployment

Prototipas

Page 16: Zero downtime deployment

Prototipas

Tarnybinė stotis:

Intel Atom x5-Z8300 – 1.84 GHz 4 branduoliai

2 GB RAM

32 GB SSD

Windows 10 Home

Prisijungimas per Wifi

SID: ZDD

PSWD : Zdd4Kjug

http://zdd/zdd

http://192.168.0.79/zdd

Page 17: Zero downtime deployment

Prototipas - architektūra

Page 18: Zero downtime deployment

Prototipas

Naudojama programinė įranga ir biblioketos:

Java 8

RedHat Jboss EAP 6.4

Pound 2.7 reverse proxy

MySql 5.7

Java EE 6.0 (EJB 3.0, JSF 2.1, JDBC…)

Infinispan 5.2

Jgroups 3.2

Python 2.7

Page 19: Zero downtime deployment

Prototipas – vartotojo sąsaja

Page 20: Zero downtime deployment

Prototipas – JSF forma, V1

Page 21: Zero downtime deployment

Prototipas – JSF backing bean’as, V1

Page 22: Zero downtime deployment

Prototipas – MessageService, V1

Page 23: Zero downtime deployment

Prototipas – ZddDAO, V1

Page 24: Zero downtime deployment

Versijos keitimo technikos

Page 25: Zero downtime deployment

Būsena

Programos būseną sudaro:

Sesija

Įvairūs kešai (lokalūs ir globalūs)

Serviso sąsajos versija

Duomenų bazėse saugoma informacija

Formos (HTML puslapio) navigacijos būsena

Page 26: Zero downtime deployment

Būsena – navigacijos būsena

Page 27: Zero downtime deployment

Būsena – navigacijos būsena

Page 28: Zero downtime deployment

Būsena – duomenų bazė

Stulpelio pridėjimas:

Pridedate stulpelį be jokių apribojimų su default reikšme

Sutvarkote programos kodą, kad teisingai pildytų naują stulpelį

Migruojate senuose įrašuose esančias stulpelio reikšmes

Uždedate reikiamus apribojimus

Stulpelio pašalinimas

Sutvarkote programos ir db kodą nenaudoti stulpelio

Nuimate apribojimus trukdančius stulpelio pašalinimui (indeksai ar kiti apribojimai)

Pašalinate stulpelį

Page 29: Zero downtime deployment

Būsena – duomenų bazė

Stulpelio pakeitimas (pavadinimas, duomenų tipas ar kita):

Pridedate naują stulpelį pagal anksčiau aprašytą procedūrą

Sutvarkote programos kodą naudoti abu stulpelius

Ištrinate seną stulpelį pagal anksčiau aprašytą procedūrą

Duomenų migravimas

Migravimui reikia naudoti papildomą požymio stulpelį (0-seni, 1-migruoti)

Migruoti reikia mažomis įrašų porcijomis, kad neužrakinti lentelių

Page 30: Zero downtime deployment

Būsena – duomenų bazė

Didelių lentelių keitimas:

Pridedant ar šalinant stulpelį yra rakinama lentelė

Lentelės rakinimo laikas yra tiesinė funkcija nuo įrašų skaičiaus O(n)

Labai didelės lentelės keičiamos kuriant naują lentelę ir atliekant lentelių sukeitimą

Atsargiai su indeksų kūrimu, galimas lentelės rakinimas

Stored procedūrų/paketų keitimas – prieš naudojantis JDBC connection objektu

jį reikia testuoti

NoSQL duomenų bazės turi menamą schemą – todėl galioja visi aukščiau

išvardinti principai

Page 31: Zero downtime deployment

Būsena – prototipo DB migravimas

V1 ->

V2 ->

V1.5 ->

Page 32: Zero downtime deployment

DB migravimo pavyzdys

Page 33: Zero downtime deployment

Prototipas – ZddDAO, V2

Page 34: Zero downtime deployment

Būsena – serviso sąsajos pasikeitimas

Funkcijos pridėjimas arba pašalinimas

Technologija/protokolas reikalauja naujos sąsajos versijos:

Pridėti naują sąsajos versiją

Sutvarkyti kodą naudoti naują sąsajos versiją

Išmesti seną sąsajos versiją

Technologija/protokolas nereikalauja naujos sąsajos versijos:

Pridėti naujas funkcijas

Sutvarkyti kodą naudoti naujas funkcijas ir nenaudoti senų

Išmesti senas funkcijas

Pastebėjimas:

Servisai turi neturėti būsenos

Servisų keitimas yra vienas paprasčiausių migravimų

Page 35: Zero downtime deployment

Būsena – serviso sąsajos pasikeitimas

Duomenų migravimas realiu laiku

Senos funkcijos turi gražinti senus duomenis

Naujos funkcijos turi gražinti naujus duomenis

Page 36: Zero downtime deployment

Serviso migravimo pavyzdys

Page 37: Zero downtime deployment

Būsena – web serveris

Sesijos valdymas:

Iškelti sesiją iš WEB konteinerio atminties – laikyti db išorinimiame, kešo serveryje, …

Sesijoje turėti papildomą požymį, kuris nurodytų jos versiją

Migruoti neaktyvias sesijas

laukti, kol jos “timeout’ins”

palaikyti migravimo kodą keliomis versijomis atgal

Momentinis aplikacijos versijos perjungimas, kuomet naudojama ‘Node swap’ architektūra

Naudoti sinchronizuotą versijos perjungimo mechanizmą

Galima naudoti “sticky session” mechanizmą “load balanceryje” (nerekomenduoju)

Formų/puslapių, paveikslėlių ir kito turinio versijavimas.

Page 38: Zero downtime deployment

Prototipas – JSF forma, V2

Page 39: Zero downtime deployment

Prototipas – Backing bean’sas, V2

Page 40: Zero downtime deployment

Prototipas – MessageService, V2

Page 41: Zero downtime deployment

WEB migravimo pavyzdys

Page 42: Zero downtime deployment

Seno kodo valymas

Reikia nepamiršti išvalyti seno kodo:

Priklausomai nuo aplikacijos galimas kelių versijų senumo kodo laikymas

Rekomenduojama turėti automatinius senų kodo versijų valymo įrankius

Page 43: Zero downtime deployment

Prototipas – JSF forma, V3

Page 44: Zero downtime deployment

Prototipas – JSF backing bean’as, V3

Page 45: Zero downtime deployment

Prototipas – MessageService, V3

Page 46: Zero downtime deployment

Prototipas – ZddDAO, V3

Page 47: Zero downtime deployment

Išvalyto kodo diegimo pavyzdys

Page 48: Zero downtime deployment

Architektūros

Page 49: Zero downtime deployment

BlueGreen deployment

*Martin Fowler [https://martinfowler.com/bliki/BlueGreenDeployment.html]

Page 50: Zero downtime deployment

Node swap

Page 51: Zero downtime deployment

Canary deployment

Page 52: Zero downtime deployment

Tomcat parallel deployment

Page 53: Zero downtime deployment

Architektūrų privalumai ir trūkumai

BlueGreen

Privalumai:

Galimas lygiagretus visų stočių diegimas – didelis greitis

Versija persijungia visoms mašinoms iškarto – nereikalingas papildomas sinchronizavimas

Trūkumai

Reikalauja dvigubo resursų turėjimo – įsivaizduokite 500 mašinų klasterį

Naudojama skirtingos duomenų bazės – reikalingas duomenų sinchronizavimas

High availability reikia rūpintis atskirai

Page 54: Zero downtime deployment

Architektūrų privalumai ir trūkumai

NodeSwap

Privalumai:

Perdiegimui reikia tik vienos mašinos

Naudojama ta pati duomenų bazė – nereikalingas sudėtingas duomenų sinchronizavimas

High availability gaunama, kaip dovana

Trūkumai:

Negalimas lygiagretus visu stočių diegimas – lėtas perdiegimas

Reikalingas papildomas mechanizmas versijos perdiegimui

Page 55: Zero downtime deployment

Architektūrų privalumai ir trūkumai

Canary deployment

Tai tarpinis variantas tarp BlueGreen ir NodeSwap architektūrų – kuri architektūra

dominuos – tuos privalumus ir trūkumus turėsite.

Papildomas privalumas – galima ištestuoti naują versiją su pasirinktais naudotojais

Tomcat parallel deployment

Privalumai:

Užtenka vienos aplikacijos

Trūkumai:

Nėra high availability

Senos versijos gyvavimas gali užtrukti ilgai – kol atsijungs paskutinis vartotojas.

Page 56: Zero downtime deployment

Naudingos smulkmenos

Page 57: Zero downtime deployment

Naudingos smulkmenos

Didelių pakeitimų darymas:

Suskaidykite į mažus nepriklausomus pakeitimus

Darykite didelį pakeitimą, kaip atskirą nepriklausomą savybę (feature), kuri

diegiama pastoviai, o bus pasiekiama tik ją pilnai įgyvendinus

Versijos keitimas nestabdant pilna apimtimi yra sudėtingas, tačiau atvejis

nesikeičiant būsenai (duomenims) yra paprastas, todėl jį verta naudoti

Pakeitimų atstatymas (angl: rollback):

Jeigu nebuvo duomenų migravimo – galima tiesiog sugrįžti prie senos versijos

Jeigu buvo duomenų migravimas – grįžimas galimas tik migruojant duomenis į seną

versiją.

Page 58: Zero downtime deployment

Naudingos smulkmenos

Web tarnybinės stoties išėmimas iš “reverse proxy”:

Keičiant “reverse proxy” konfigūraciją

Dažnas “reverse proxy” turi “life detection” mechanizmą

“Reverse proxy” vienam TCP prisijungimui naudoja 2 socket’us –

susiskaičiuokite poreikį, nes OS palaiko ribotą socket’ų skaičių.

Galima nesunkiai atlikti testavimą gamyboje, testuojant jau sudiegtą, bet

neprijungtą prie “reverse proxy” web tarnybinę stotį.

Page 59: Zero downtime deployment

Pakeitimai kuriems būtinas stabdymas

Duomenų bazės serverio versijos keitimas

Dideli aplikacijos arba duomenų bazės schemos pakeitimai

Didelio duomenų kiekio lentelių keitimas arba indeksų kūrimas

Aplikacijos ar jos pagrindinių elementų topologijos ar architektūros keitimas

Kešo serverių topologijos keitimas

DB replikavimo mechanizmo keitimas

Page 60: Zero downtime deployment

Klausimai