blú grýn deplojmentTakéBlue/green deployment, Blue-green release, Modro-zelené nasazení, Red-black deploymentPokročilý
Definice
Blue-green deployment je způsob nasazování aplikací, při kterém běží dvě identická produkční prostředí: jedno obsluhuje provoz, druhé přijímá novou verzi. Po ověření nové verze se provoz přepne najednou, obvykle na úrovni load balanceru nebo DNS. Staré prostředí zůstává nedotčené, takže návrat k předchozí verzi je otázkou vteřin.
Dvě produkce místo jedné
Blue-green deployment vychází z jednoduché úvahy: nejrizikovější okamžik nasazení je ten, kdy se přepisuje běžící produkce. Blue-green tenhle okamžik odstraní tím, že novou verzi nikdy nenasazuje na servery, které právě obsluhují uživatele. Prostředí „blue“ drží provoz, prostředí „green“ dostane nový build, projde smoke testy a teprve pak se přepne směrování. Role se pak prohodí: to, co bylo zelené, je nová produkce a modré prostředí se stává záchrannou sítí pro další cyklus.
Co se při přepnutí skutečně mění
Přepnutí se v praxi řeší na několika místech. Nejčastěji jde o změnu target group u load balanceru, přehození služby v Kubernetes na jiný selektor, nebo o úpravu weightu v DNS. Volba místa určuje, jak rychle se změna projeví: load balancer přepne prakticky okamžitě, DNS drží klienti v cache podle TTL i dlouho po změně. Právě proto se blue-green na úrovni DNS považuje za slabší variantu, kde chvíli běží obě verze současně.
Kde blue-green naráží: databáze
Bezstavové aplikační vrstvě se dvě kopie dělají snadno. Sdílená databáze ale zůstává jedna a ta musí rozumět staré i nové verzi kódu zároveň. Řešením jsou zpětně kompatibilní migrace ve stylu expand and contract: nejdřív se přidá nový sloupec, obě verze s ním umí žít, a teprve po úspěšném přepnutí a odstavení staré verze se starý sloupec smaže. Destruktivní migrace (přejmenování, DROP COLUMN, NOT NULL bez defaultu) rollback fakticky znemožní, protože stará verze už na změněném schématu nepoběží. Podobnou pozornost si žádají fronty, cache a dlouho běžící úlohy: zpráva zapsaná novou verzí musí být čitelná i tou starou.
Cena a alternativy
Blue-green znamená mít dočasně dvojnásobek infrastruktury. V cloudu, kde se druhé prostředí vytvoří jen na dobu nasazení a pak zase zmizí, je to náklad na desítky minut. U vlastního železa jde o trvale zaplacené servery, které polovinu času nic nedělají.
Alternativou je canary release, který novou verzi pouští jen na malé procento provozu a postupně ho zvyšuje, nebo rolling update, který instance vyměňuje po dávkách bez zdvojení kapacity. Blue-green dává největší smysl tam, kde je potřeba jasný, atomický okamžik přepnutí a co nejrychlejší rollback, typicky u regulovaných systémů a platebních služeb. Ve zralých CI/CD pipeline se blue-green často kombinuje s feature flagy: infrastruktura se přepne najednou, ale samotná nová funkce se uživatelům zapíná odděleně a postupně.
Příklady z praxe
Přepnutí target group na AWS load balanceru
E-shop běží za aplikačním load balancerem, který směřuje na target group blue. Nová verze se nasadí do target group green, projde kontrolou zdraví a smoke testem objednávky. Změna pravidla listeneru přesměruje veškerý provoz na green během jednotek sekund; blue zůstane běžet ještě hodinu jako pojistka.
# přepnutí provozu na zelené prostředí aws elbv2 modify-listener \ --listener-arn $LISTENER_ARN \ --default-actions Type=forward,TargetGroupArn=$GREEN_TG_ARNZpětně kompatibilní migrace před přepnutím
Aplikace potřebuje přejmenovat sloupec full_name na display_name. Místo přejmenování se v první fázi přidá nový sloupec a data se dopíší, takže stará i nová verze fungují nad stejným schématem. Starý sloupec se odstraní až v následujícím nasazení, kdy je jisté, že se k předchozí verzi nikdo nevrátí.
-- fáze 1: expand (před nasazením green) ALTER TABLE users ADD COLUMN display_name text; UPDATE users SET display_name = full_name WHERE display_name IS NULL; -- fáze 2: contract (až po úspěšném přepnutí, další release) ALTER TABLE users DROP COLUMN full_name;
Časté omyly
- MýtusS blue-green nasazením je rollback vždycky okamžitý.
- Ve skutečnostiOkamžité je jen přepnutí provozu zpátky na staré prostředí. Pokud nová verze mezitím zapsala data ve formátu, kterému stará verze nerozumí, nebo provedla destruktivní migraci schématu, rollback aplikace problém nevyřeší a je potřeba oprava dat.
- MýtusBlue-green a canary release jsou v podstatě totéž.
- Ve skutečnostiBlue-green přepíná celý provoz najednou mezi dvěma kompletními prostředími. Canary release naopak pouští novou verzi jen malé části uživatelů a podíl zvyšuje podle metrik, takže odhalí i problémy, které se projeví až pod reálnou zátěží.
- MýtusBlue-green nasazení znamená nulový výpadek za všech okolností.
- Ve skutečnostiNulový výpadek platí pro nová spojení. Dlouhotrvající požadavky, WebSocket relace nebo běžící dávkové úlohy na starém prostředí se musí korektně dokončit, jinak uživatelé přerušení pocítí. Bez connection drainingu a ověření session storage bezvýpadkovost nevznikne sama.
Časté dotazy
- Jak dlouho nechat staré prostředí běžet po přepnutí?
- Staré prostředí se obvykle nechává běžet tak dlouho, aby pokrylo alespoň jeden plný cyklus provozní špičky, tedy typicky od jedné hodiny po jeden pracovní den. Rozhodující je doba, za kterou se projeví chyby viditelné až v produkčních datech: pomalé dotazy, chybné hodnoty v reportech nebo problémy s integracemi třetích stran. Kratší dobu volí týmy s dobrým monitoringem a rychlým alertingem, delší regulované provozy. Po uplynutí okna se prostředí buď zruší, nebo se stane cílem pro příští nasazení.
- Zvládne blue-green nasazení aplikace se sdílenou relací uživatele?
- Blue-green nasazení funguje s uživatelskými relacemi jen tehdy, když relace nežije v paměti aplikačního serveru. Session je potřeba držet mimo instance, typicky v Redisu, databázi nebo v podepsaném cookie. Jinak přepnutí provozu odhlásí všechny přihlášené uživatele, protože nové prostředí o jejich relacích nic neví. Stejná úvaha platí pro lokální souborovou cache a nahrané soubory uložené na disku instance, které patří do sdíleného objektového úložiště.
- Kolik blue-green nasazení stojí navíc oproti rolling update?
- Blue-green nasazení vyžaduje dočasně dvojnásobnou kapacitu aplikační vrstvy. V cloudu s účtováním po sekundách jde o náklad za desítky minut, kdy obě prostředí běží současně, tedy zpravidla zanedbatelnou částku vůči celkovému provozu. Na vlastním hardwaru je situace jiná: rezerva musí existovat trvale a znamená polovinu nevyužitého výkonu. Rolling update tuhle režii nemá, protože instance vyměňuje po dávkách, ale výměnou za to nenabízí jediný okamžik přepnutí ani stejně rychlý návrat zpět.
- Jak ověřit zelené prostředí dřív, než na něj půjde provoz?
- Zelené prostředí se ověřuje přes samostatný testovací vstup, který není veřejně publikovaný: druhý listener na jiném portu, interní hostname nebo hlavička směrující požadavek na konkrétní target group. Přes tenhle vstup projdou health checky, smoke testy hlavních uživatelských cest a kontrola připojení k databázi a externím službám. Automatizovaná sada testů běží v CI/CD pipeline a přepnutí se spustí až po jejím úspěchu. Bez odděleného vstupu se nová verze testuje až po přepnutí, což smysl blue-green nasazení oslabuje.
Zdroje
- Blue/Green Deployments on AWS(otevře se v novém okně)
- Application deployment and testing strategies(otevře se v novém okně)
- Deployments(otevře se v novém okně)
- ALTER TABLE(otevře se v novém okně)