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.

Kategorie: Cloud a DevOpsAktualizováno

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

  1. 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_ARN
  2. Zpě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

  1. Blue/Green Deployments on AWS(otevře se v novém okně)Amazon Web Services
  2. Application deployment and testing strategies(otevře se v novém okně)Google Cloud
  3. Deployments(otevře se v novém okně)Kubernetes
  4. ALTER TABLE(otevře se v novém okně)PostgreSQL Global Development Group

Související pojmy

Potřebujete to vyřešit v praxi?

Poradíme, jak na to ve vašem projektu

Vysvětlit pojem je jedna věc, navrhnout kolem něj funkční řešení druhá. Ozvěte se a probereme, co dává smysl u vás.