14-bo‘lim

Deploy strategiyalari

To'xtatib almashtirish, ketma-ket yangilash, ko'k-yashil va kanareyka usullari, ularning narxi va qachon tanlanishi.

🕑 8 daqiqa o‘qish 📄 866 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. To'rt asosiy usul
  2. 1. To'xtatib almashtirish (recreate)
  3. 2. Ketma-ket yangilash (rolling)
  4. 3. Ko'k-yashil (blue-green)
  5. 4. Kanareyka (canary)
  6. Nomi bo'yicha qaysi biri kerak
  7. Salomatlik tekshiruvi - hammasining asosi
  8. Migratsiyalar - eng nozik qism
  9. Xulosa

Obraz tayyor, reliz chiqdi. Endi uni serverga qanday olib chiqamiz? Bir necha usul bor va ular narxi hamda xavfi bilan farq qiladi.

To'rt asosiy usul #

UsulUzilishMurakkabligiQachon mos
To'xtatib almashtirishBor (soniyalar-daqiqalar)Eng soddaIchki vositalar, kichik loyihalar
Ketma-ket yangilashYo'qO'rtachaBir nechta nusxa ishlaydigan xizmatlar
Ko'k-yashilYo'qO'rtacha, lekin qimmatOrqaga qaytish tez bo'lishi shart bo'lganda
KanareykaYo'qEng murakkabKatta auditoriya, xavfli o'zgarishlar

1. To'xtatib almashtirish (recreate) #

Eng sodda: eskisini to'xtatasiz, yangisini ishga tushirasiz.

Terminal
docker compose down
docker compose up -d
To'xtatib almashtirish v1 ishlayapti uzilish xizmat yo'q v2 ishlayapti eski versiya 10-60 soniya yangi versiya Sodda va tushunarli - lekin foydalanuvchi bu paytda xato sahifasini ko'radi
Eng oddiy usul: bir zumlik uzilish evaziga hech qanday murakkablik yo'q
Uzilish har doim ham muammo emas

Ichki hisobot tizimi kechasi 30 soniyaga o'chsa - hech kim sezmaydi. Murakkab strategiya qurish o'rniga, deploy vaqtini tanlash yetarli.

Murakkablikni faqat u to'laydigan joyda qo'shing.

2. Ketma-ket yangilash (rolling) #

Nusxalar birin-ketin almashtiriladi. Har doim ishlaydigan nusxa bo'ladi:

Terminal
docker service update --image ghcr.io/loyiha:1.4.2 --update-parallelism 1 ilova
Bosqich1-nusxa2-nusxa3-nusxa
Boshlanishv1v1v1
1-qadamv2v1v1
2-qadamv2v2v1
3-qadamv2v2v2
Ketma-ket yangilashda ikki versiya bir vaqtda ishlaydi

Bu muhim oqibat: o'tish davrida foydalanuvchining bir so'rovi v1 ga, ikkinchisi v2 ga tushishi mumkin.

Shuning uchun:

TalabSabab
API mos kelishiv2 v1 ning so'rovlarini tushunishi kerak
Baza sxemasi mos kelishiUstunni darhol o'chirmang - avval ishlatishni to'xtating
Sessiyalar umumiy bo'lishiXotiradagi sessiya nusxalar orasida yo'qoladi

Baza o'zgarishi bo'lsa, ikki bosqichda chiqaring: avval qo'shadigan o'zgarish (yangi ustun), keyin - eskisini olib tashlash.

3. Ko'k-yashil (blue-green) #

Ikkita bir xil muhit saqlanadi. Yangi versiya ishlamayotgan muhitga chiqariladi, sinaladi, keyin trafik bir zumda o'tkaziladi.

Ko'k-yashil: trafikni almashtirish Yuk taqsimlagich Ko'k muhit - v1 hozir trafik shu yerda ishlab turibdi Yashil muhit - v2 yangi versiya chiqarildi sinovdan o'tkazilmoqda Sinov tugagach, taqsimlagich yashilga o'tadi. Xato chiqsa - bir soniyada ko'kga qaytariladi
Eski muhit o'chirilmaydi - shuning uchun orqaga qaytish bir zumda bo'ladi
UstunligiKamchiligi
Orqaga qaytish bir soniyadaIkki barobar resurs kerak
Yangi versiya haqiqiy muhitda sinaladiBaza ikkalasiga umumiy bo'ladi
Uzilish yo'qSozlash murakkabroq

4. Kanareyka (canary) #

Yangi versiyaga trafikning kichik qismi yo'naltiriladi. Hammasi yaxshi bo'lsa - ulush oshiriladi.

Bosqichv1 ulushiv2 ulushiKuzatiladi
195%5%Xatolar soni, javob vaqti
275%25%Bir necha soat
350%50%Barqarorlik
40%100%To'liq o'tish
Kanareyka faqat o'lchov bilan birga ishlaydi

Agar siz xatolar sonini va javob vaqtini real vaqtda ko'rmasangiz, kanareyka deploy foydasiz: 5% foydalanuvchi muammoga duch keladi, siz esa bilmaysiz.

Shuning uchun tartib shunday: avval monitoring, keyin kanareyka. Aks holda bu shunchaki sekinlashtirilgan oddiy deploy bo'ladi.

Nomi bo'yicha qaysi biri kerak #

Natija
Uzilish qabul qilinadimi?
├── Ha  -> to'xtatib almashtirish (eng sodda)
└── Yo'q
    ├── Bir nechta nusxa bormi?
    │   ├── Ha  -> ketma-ket yangilash
    │   └── Yo'q -> ko'k-yashil
    └── Xavf yuqorimi va o'lchov bormi?
        └── Ha  -> kanareyka

Salomatlik tekshiruvi - hammasining asosi #

Har qanday strategiya "yangi versiya tayyor" degan signalni bilishi kerak. Buning uchun ilovada maxsus manzil bo'ladi:

JavaScript
import { createServer } from 'node:http';

createServer((req, res) => {
    if (req.url === '/salomatlik') {
        res.writeHead(200, { 'Content-Type': 'application/json' });
        res.end(JSON.stringify({ holat: 'yaxshi', versiya: process.env.VERSIYA }));
        return;
    }
    res.end('Salom, CI/CD!\n');
}).listen(3000);

Quvurda esa uni kutamiz:

YAML
      - name: Yangi versiya ko'tarilishini kutish
        run: |
          for i in $(seq 1 30); do
            if curl -sSf https://sinov.misol.uz/salomatlik > /dev/null; then
              echo "Tayyor ($i-urinish)"
              exit 0
            fi
            echo "Kutilmoqda... ($i)"
            sleep 2
          done
          echo "Xizmat 60 soniyada ko'tarilmadi"
          exit 1
Salomatlik tekshiruvi rostdan tekshirsin

Eng ko'p uchraydigan xato - shunchaki 200 OK qaytaradigan manzil:

JavaScript
// Bu deyarli foydasiz
if (req.url === '/salomatlik') { res.end('ok'); }

Bunday tekshiruv ilova ishga tushganini aytadi, lekin u ishlay olishini aytmaydi. Baza yiqilgan bo'lsa ham ok qaytaveradi.

Foydali tekshiruv kamida bazaga bitta yengil so'rov qiladi va javobni kutadi. Lekin uni og'ir qilib yubormang - u har necha soniyada chaqiriladi.

Migratsiyalar - eng nozik qism #

Baza sxemasi o'zgarsa, deploy tartibi muhim bo'lib qoladi:

BosqichKodBaza
1Eski kod ishlaydiYangi ustun qo'shiladi (eski kod uni bilmaydi)
2Yangi kod chiqariladiIkkala ustun mavjud
3Yangi kod barqarorEski ustun o'chiriladi

Bu «kengaytir - ko'chir - qisqartir» usuli. Uning ma'nosi: hech qachon kod va baza bir vaqtda o'zgarmaydi, shuning uchun orqaga qaytish har bosqichda mumkin bo'ladi.

Amaliy topshiriq
  1. To'rtta strategiyani uzilish, narx va murakkablik bo'yicha jadvalga soling.
  2. O'z loyihangiz uchun qaysi biri mosligini tanlab, sababini yozing.
  3. Ilovangizga /salomatlik manzilini qo'shing.
  4. Unda bazaga yengil so'rov qilib, natijani JSON sifatida qaytaring.
  5. Quvurga xizmat ko'tarilishini kutadigan qadam yozing.
  6. Kutish muddati tugaganda quvur qizil bo'lishini ta'minlang.
  7. Ketma-ket yangilashda nima uchun ikki versiya bir vaqtda ishlashini tushuntiring.
  8. Baza ustunini xavfsiz o'chirish uchun uch bosqichni yozing.
  9. Ko'k-yashil usulda baza qanday muammo tug'dirishini tahlil qiling.
  10. Kanareyka deploy uchun qanday o'lchovlar kerakligini sanang.

Xulosa #

  • To'rt asosiy usul: to'xtatib almashtirish, ketma-ket yangilash, ko'k-yashil, kanareyka.
  • Ular uzilish, narx va murakkablik bo'yicha farq qiladi - eng soddasidan boshlang.
  • Uzilish har doim ham muammo emas: ichki tizim uchun 30 soniya sezilmaydi.
  • Ketma-ket yangilashda ikki versiya bir vaqtda ishlaydi - API va baza mos bo'lishi shart.
  • Ko'k-yashil bir soniyada orqaga qaytish imkonini beradi, lekin ikki barobar resurs talab qiladi.
  • Kanareyka faqat monitoring bo'lgandagina ma'noga ega.
  • Har qanday strategiya salomatlik tekshiruviga tayanadi.
  • 200 OK qaytaradigan bo'sh tekshiruv foydasiz - u bazani ham tekshirsin.
  • Baza o'zgarishi «kengaytir - ko'chir - qisqartir» tartibida chiqariladi.
  • Kod va baza hech qachon bir vaqtda o'zgarmasligi kerak - aks holda orqaga qaytib bo'lmaydi.

Keyingi bo'limda quvurdan haqiqiy serverga ulanib, ilovani chiqaramiz.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.