Takézero-downtime deploy, bezvýpadkové nasazení, nasazení bez odstávkyPokročilý
Definice
Zero downtime deployment je způsob nasazení nové verze aplikace tak, aby uživatelé během změny neviděli výpadek služby. Opírá se o postupné přepínání provozu, kompatibilní databázové migrace, health checky a možnost rychlého návratu, protože stará a nová verze často krátce běží současně.
Cíl: vyměnit běžící verzi bez odmítnutých požadavků
Zero downtime deployment řeší okamžik, kdy se nová verze služby dostává do produkce, zatímco uživatelé dál posílají požadavky. Základní myšlenka není „nasadit rychle“, ale udržet po celou dobu dostupnou alespoň jednu zdravou instanci, správně směrovat provoz a nespustit změnu, která rozbije běžící klienty.
Bezvýpadkové nasazení obvykle stojí na automatizovaném procesu v CI/CD. Pipeline sestaví artefakt, spustí testy, nasadí novou verzi do části prostředí a teprve po ověření ji pustí k uživatelům. Ruční přihlášení na server a přepsání souborů do stejného procesu patří k nejrizikovějším variantám, protože chyba se projeví okamžitě a návrat bývá pomalý.
Strategie přepnutí provozu
Rolling update nahrazuje instance po malých dávkách. Load balancer posílá požadavky jen na instance, které prošly health checkem. Platformy jako Kubernetes umí tento vzor řídit automaticky: staré pody nechají doběhnout, nové pody zařadí až po připravenosti a při selhání rollout zastaví.
Blue-green deployment drží dvě podobná prostředí. Modré prostředí obsluhuje provoz, zelené prostředí dostane novou verzi. Přepnutí proběhne změnou směrování, například v load balanceru nebo DNS. Výhoda je čistý rollback: provoz se může vrátit na původní prostředí. Cena je vyšší spotřeba infrastruktury a potřeba hlídat, aby obě prostředí pracovala se stejnými externími závislostmi.
Canary release pouští novou verzi nejdřív jen malé části uživatelů nebo požadavků. Metriky chybovosti, latence a obchodních událostí rozhodnou, zda se podíl zvýší. Canary nasazení je zvlášť užitečné tam, kde testy nedokážou zachytit rozdíly v reálném provozu.
Databázové změny jako největší zdroj výpadků
Databázová migrace často rozhodne, jestli je nasazení skutečně bez výpadku. Bezpečný postup používá princip expand and contract: nejdřív se přidá nová struktura kompatibilní se starým kódem, potom se nasadí aplikace, proběhne doplnění dat a teprve později se odstraní staré sloupce nebo tabulky. Jednorázové přejmenování sloupce, které nová verze očekává okamžitě, může starou verzi rozbít během přechodu.
Schéma databáze musí být po určitou dobu srozumitelné dvěma verzím aplikace. Migrační skripty proto nemají jen měnit stav, ale také respektovat zámky, délku transakcí, replikaci a možnost opakovaného spuštění. U větších systémů se databázové změny často nasazují odděleně od aplikačního kódu.
Ověření připravenosti a návrat zpět
Zero downtime deployment bez dobrých kontrol je jen přání. Readiness check má ověřit, že instance umí přijímat skutečné požadavky, ne pouze to, že proces běží. Liveness check zase pomáhá odhalit zaseknutý proces. Observabilita musí ukázat chybové kódy, latenci, fronty, spotřebu zdrojů a klíčové doménové metriky.
Rollback musí být navržený předem, ideálně jako součást infrastruktury jako kódu. Bezpečný návrat znamená nejen spustit starý kontejner, ale také vědět, jestli databázové změny, fronty zpráv nebo nové formáty dat zůstaly kompatibilní. Skutečně bezvýpadkové nasazení je proto technická disciplína přesahující samotný příkaz deploy.
Příklady z praxe
Rolling update v Kubernetes
Tým nasazuje novou verzi webového API do Kubernetes. Nastavení nedovolí, aby během výměny zmizela dostupná replika, a nová replika začne dostávat provoz až po úspěšném readiness checku. Pokud obraz neprojde startem nebo endpoint /ready hlásí chybu, rollout se zastaví dřív, než provoz dopadne na rozbitou verzi.
apiVersion: apps/v1 kind: Deployment metadata: name: web spec: replicas: 4 strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 0 maxSurge: 1 template: spec: containers: - name: web image: example/web:2.4.0 readinessProbe: httpGet: path: /ready port: 8080Databázová migrace bez rozbití staré verze
Aplikace má přejít ze dvou sloupců first_name a last_name na jeden sloupec full_name. První migrace jen přidá nový sloupec a doplní data, takže stará i nová verze aplikace mohou krátce fungovat současně. Odstranění starých sloupců přijde až v dalším nasazení, po ověření, že žádná běžící verze už staré sloupce nepotřebuje.
ALTER TABLE customers ADD COLUMN full_name text; UPDATE customers SET full_name = first_name || ' ' || last_name WHERE full_name IS NULL; -- Po nasazení nové verze a ověření provozu: -- ALTER TABLE customers DROP COLUMN first_name; -- ALTER TABLE customers DROP COLUMN last_name;
Časté omyly
- MýtusZero downtime deployment znamená, že stačí rychle restartovat aplikaci.
- Ve skutečnostiRychlý restart může snížit délku výpadku, ale sám o sobě výpadek neodstraňuje. Bezvýpadkové nasazení potřebuje směrování provozu na zdravé instance a kontrolu, že nová verze je připravená.
- MýtusKdyž máme Kubernetes, máme zero downtime deployment automaticky.
- Ve skutečnostiKubernetes umí řídit rolling update, ale aplikace musí mít správné readiness checky, dost replik a kompatibilní změny. Chybně navržená migrace databáze nebo endpoint, který hlásí připravenost příliš brzy, může způsobit výpadek i v Kubernetes.
Časté dotazy
- Zaručuje zero downtime deployment, že uživatelé nepoznají žádnou chybu?
- Zero downtime deployment neznamená, že každé nasazení je automaticky bezpečné pro uživatele. Bezvýpadkový průběh chrání dostupnost služby, ale nová verze může stále obsahovat chybu v logice, špatné oprávnění nebo pomalý dotaz. Kvalitní proces proto kombinuje postupné směrování provozu, automatické testy, monitoring, alerty a připravený rollback.
- Které změny nejčastěji brání nasazení bez výpadku?
- Zero downtime deployment je nejtěžší u změn, které nejsou zpětně kompatibilní. Typickým příkladem je databázové schéma, formát zpráv ve frontě, veřejné API nebo změna session úložiště. Bezpečný postup rozdělí změnu do několika kroků, aby stará i nová verze uměly po přechodnou dobu pracovat se stejnými daty.
- Stačí pro zero downtime deployment jeden server?
- Zero downtime deployment obvykle vyžaduje více než jeden server nebo více běžících instancí služby. Samostatný proces na jednom stroji lze někdy restartovat velmi rychle, ale po dobu restartu nemusí přijímat požadavky. Skutečné bezvýpadkové nasazení potřebuje mechanismus, který udrží dostupnou starou instanci, dokud nová instance není připravená.
- Jaké health checky jsou důležité pro zero downtime deployment?
- Zero downtime deployment potřebuje health checky, které měří skutečnou připravenost aplikace. Kontrola otevřeného portu nestačí, protože aplikace může běžet, ale nemít připojení k databázi, načtenou konfiguraci nebo dokončené migrace. Readiness check má rozhodnout, zda může instance dostávat provoz, zatímco liveness check řeší restart zaseknutého procesu.
Zdroje
- Deployments(otevře se v novém okně)
- Application deployment and testing strategies(otevře se v novém okně)
- Ensuring rollback safety during deployments(otevře se v novém okně)
- ALTER TABLE(otevře se v novém okně)