Blue-Green Deployment และ Rolling Update บน VPS: คู่มือ Deploy โดยไม่มี Downtime

การ Deploy แอปพลิเคชันลงบนเซิร์ฟเวอร์ บ่อยครั้งทำให้เกิดปัญหา Downtime ซึ่งส่งผลกระทบต่อผู้ใช้งานอย่างมาก ในบทความนี้ เราจะสำรวจเทคนิค Blue-Green Deployment และ Rolling Update สองวิธีการที่ช่วยให้คุณ Deploy ใหม่ได้โดยไม่มี Downtime บน Cloud VPS ของ ผู้ให้บริการโฮสติ้ง

Blue-Green Deployment คืออะไร ทำงานอย่างไร

Blue-Green Deployment เป็นเทคนิคการ Deploy ที่อาศัยการมีเซิร์ฟเวอร์สองชุด: Blue (ปัจจุบัน) และ Green (ใหม่) ทำการ Deploy เวอร์ชั่นใหม่ไปยัง Green โดยปล่อยให้ Blue ทำงานต่อไป เมื่อ Green พร้อมและทดสอบสำเร็จแล้ว ให้สลับ Load Balancer ไปชี้ที่ Green ทันที

ขั้นตอนการทำงาน:

  • สถานะเริ่มต้น: Blue Environment ทำงานและรับ Traffic ทั้งหมด
  • Prepare Green: Deploy เวอร์ชั่นใหม่ไปยัง Green Environment
  • Testing: ทำการ Test ทั้งหมดบน Green (Smoke Test, Integration Test, Load Test)
  • Switch: เมื่อ Green ผ่านการทดสอบแล้ว สลับ Traffic ไปยัง Green
  • Rollback: ถ้ามีปัญหา สลับกลับไปที่ Blue ได้ทันที

Rolling Update คืออะไร ต่างกับ Blue-Green อย่างไร

Rolling Update หรือ Rolling Deployment คือเทคนิคการ Deploy ที่ Update เซิร์ฟเวอร์ทีละตัว (หรือทีละกลุ่ม) ขณะที่เซิร์ฟเวอร์อื่น ๆ ยังคงให้บริการ ไม่จำเป็นต้องมีเซิร์ฟเวอร์สำรองแบบ Blue-Green

ขั้นตอนการทำงาน:

  • Remove from Load Balancer: นำเซิร์ฟเวอร์ตัวแรกออกจาก Load Balancer
  • Update & Restart: Update เซิร์ฟเวอร์และ Restart Service
  • Test: Health Check เพื่อตรวจสอบว่า Service ทำงานปกติ
  • Add back to LB: เพิ่มเซิร์ฟเวอร์เข้า Load Balancer อีกครั้ง
  • Repeat: ทำซ้ำสำหรับเซิร์ฟเวอร์ถัดไป จนกระทั่งทุกตัว Update เสร็จ

เปรียบเทียบ: Blue-Green vs Rolling Update

ลักษณะ Blue-Green Deployment Rolling Update
จำนวนเซิร์ฟเวอร์ ต้องมี 2 ชุด ต้องมี 2+ ตัว
Downtime 0 (Instant switch) 0 (Gradual switch)
Rollback Time ทันที ช้ากว่า
Testing เต็มที่ก่อน Switch Test ขณะ Deploy
Resource Usage สูง (2 ชุด) ต่ำกว่า
Complexity ซับซ้อนปานกลาง ง่ายกว่า
ความเสี่ยง ต่ำ กลาง
Use Case ที่เหมาะ Major Release, Critical Update Minor Update, Patch Fix

ข้อดีและข้อเสียของแต่ละวิธี

Blue-Green Deployment

ข้อดี: Instant Rollback หากพบปัญหาสลับกลับได้ใน 1-2 วินาที, เสมอภัยเพราะทดสอบครบถ้วนก่อน Deploy, เหมาะสำหรับ Database Schema Changes ที่ซับซ้อน

ข้อเสีย: ใช้ทรัพยากรเพิ่มเติมสูง ต้องตั้งค่า Load Balancer และ Database Migration Strategy ที่ซับซ้อน

Rolling Update

ข้อดี: Cost Effective ไม่ต้องใช้เซิร์ฟเวอร์เพิ่มเติม, ง่ายต่อการ Deploy และ Automate, เหมาะสำหรับ Docker/Kubernetes

ข้อเสีย: Rollback ช้ากว่า, ระหว่าง Deploy อาจมีทั้ง Old และ New Version ทำงานพร้อมกัน, Database Schema Change อาจเป็นปัญหา

วิธีทำ Blue-Green Deployment บน Cloud VPS

ในตัวอย่างนี้ เราจะใช้ Nginx เป็น Load Balancer เพื่อสลับ Traffic ระหว่าง Blue และ Green Environment บน Cloud VPS ของ ผู้ให้บริการโฮสติ้ง

ขั้นตอนที่ 1: ตั้งค่า Blue และ Green Services

# ติดตั้ง Node.js
curl -sL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs

# สร้างโฟลเดอร์

mkdir -p /var/www/blue-app
mkdir -p /var/www/green-app

# Systemd Service สำหรับ Blue
sudo tee /etc/systemd/system/blue-app.service << 'EOF'
[Unit]
Description=Blue Environment App
After=network.target

[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/blue-app
ExecStart=/usr/bin/node server.js
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

# Systemd Service สำหรับ Green
sudo tee /etc/systemd/system/green-app.service << 'EOF'
[Unit]
Description=Green Environment App
After=network.target

[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/green-app
ExecStart=/usr/bin/node server.js
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable blue-app green-app
sudo systemctl start blue-app green-app

ขั้นตอนที่ 2: Nginx Config สำหรับ Blue-Green

upstream blue {
    server 127.0.0.1:8001;
    keepalive 32;
}

upstream green {
    server 127.0.0.1:8002;
    keepalive 32;
}

server {
    listen 80;
    server_name example.com;

    # เปลี่ยนค่า "blue" เป็น "green" เมื่อ Switch
    set $active_env blue;

    location / {
        if ($active_env = "blue") {
            proxy_pass http://blue;
        }
        if ($active_env = "green") {
            proxy_pass http://green;
        }

        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_buffering off;
    }

    location /health {
        access_log off;
        return 200 '{"status": "ok"}';
        add_header Content-Type application/json;
    }
}

ขั้นตอนที่ 3: Script สลับ Traffic ระหว่าง Blue-Green

#!/bin/bash
# switch-environment.sh

CURRENT=$(cat /var/tmp/active-env 2>/dev/null || echo "blue")

if [ "$CURRENT" = "blue" ]; then
    NEW_ENV="green"
else
    NEW_ENV="blue"
fi

echo "Switching from $CURRENT to $NEW_ENV..."

# Test Health Check ของ Environment ใหม่
if [ "$NEW_ENV" = "green" ]; then
    PORT=8002
else
    PORT=8001
fi

if ! curl -sf http://localhost:$PORT/health > /dev/null; then
    echo "ERROR: $NEW_ENV environment is not healthy. Aborting switch."
    exit 1
fi

# Update Nginx Config
sudo sed -i "s/set \$active_env $CURRENT/set \$active_env $NEW_ENV/" /etc/nginx/sites-available/blue-green

# Test Nginx Config
sudo nginx -t || {
    sudo sed -i "s/set \$active_env $NEW_ENV/set \$active_env $CURRENT/" /etc/nginx/sites-available/blue-green
    echo "ERROR: Nginx config invalid. Rolled back."
    exit 1
}

# Reload Nginx
sudo systemctl reload nginx

# Update Active Env File
echo "$NEW_ENV" | sudo tee /var/tmp/active-env

echo "Successfully switched to $NEW_ENV!"

วิธีทำ Rolling Update บน Cloud VPS

Rolling Update เหมาะสำหรับระบบที่มี Multiple Servers หรือ Kubernetes Cluster นี่คือตัวอย่าง Script สำหรับ Rolling Update แบบ Manual บน VPS หลายตัว:

#!/bin/bash
# rolling-update.sh

SERVERS=("192.168.1.10" "192.168.1.11" "192.168.1.12")
NGINX_CONF="/etc/nginx/sites-available/upstream-servers"

for SERVER in "${SERVERS[@]}"; do
    echo "[Rolling] Removing $SERVER from Load Balancer..."
    
    # ลบ Server ออกจาก Upstream ชั่วคราว
    sudo sed -i "/${SERVER}/s/^/#/" $NGINX_CONF
    sudo nginx -s reload
    sleep 5  # รอให้ Connection เดิมจบ
    
    echo "[Rolling] Updating $SERVER..."
    ssh root@$SERVER << 'REMOTE_CMD'
        cd /var/www/app
        git pull origin main
        npm install --production
        npm run build
        systemctl restart app-service
        sleep 10
        curl -f http://localhost:3000/health || exit 1
REMOTE_CMD
    
    if [ $? -ne 0 ]; then
        echo "[ERROR] Update failed on $SERVER. Restoring to LB..."
        sudo sed -i "/${SERVER}/s/^#//" $NGINX_CONF
        sudo nginx -s reload
        echo "[WARN] Continuing with remaining servers..."
        continue
    fi
    
    echo "[Rolling] Adding $SERVER back to Load Balancer..."
    sudo sed -i "/${SERVER}/s/^#//" $NGINX_CONF
    sudo nginx -s reload
    sleep 5
done

echo "Rolling update completed!"

Checklist สำหรับ Blue-Green Deployment

  • ✓ เตรียม Cloud VPS โดยให้ Memory และ CPU เพียงพอสำหรับ 2 Environment
  • ✓ ติดตั้ง Load Balancer (Nginx หรือ HAProxy)
  • ✓ ตั้งค่า Upstream สำหรับ Blue และ Green
  • ✓ สร้าง Systemd Service สำหรับแต่ละ Environment
  • ✓ ตั้งค่า Health Check Endpoint
  • ✓ เตรียม Deploy Script และ Switch Script
  • ✓ Test Full Deployment Flow (Deploy, Test, Switch, Rollback)
  • ✓ ตั้งค่า Monitoring และ Logging

ใช้ ผู้ให้บริการโฮสติ้ง Cloud VPS สำหรับ Blue-Green Deployment

Cloud VPS ของ ผู้ให้บริการโฮสติ้ง เป็นทางเลือกที่เหมาะสำหรับการทำ Blue-Green Deployment ด้วยเหตุผลต่อไปนี้:

  • Scalability: เพิ่มเซิร์ฟเวอร์เพิ่มเติมได้เมื่อจำเป็น
  • Flexible Resource: ปรับ CPU, RAM, Storage ตามความต้องการได้ทันที
  • Network Performance: SSD Storage และ Network ความเร็วสูงสำหรับการ Deploy ที่รวดเร็ว
  • Root Access: Full Control สำหรับติดตั้ง Load Balancer และ Monitoring Tools
  • 24/7 Support: ทีมงาน ผู้ให้บริการโฮสติ้ง พร้อมช่วยเหลือเมื่อมีปัญหา

สรุป

Blue-Green Deployment และ Rolling Update เป็นสองเทคนิคที่มีประสิทธิภาพสำหรับการ Deploy โดยไม่มี Downtime ทั้ง 2 วิธีมีข้อดีและข้อเสีย คุณควรเลือกใช้ตามลักษณะของโปรเจกต์:

  • Blue-Green: เหมาะสำหรับ Major Release หรือ Critical Update เนื่องจากให้ความปลอดภัยสูงสุด
  • Rolling Update: เหมาะสำหรับ Patch Fix หรือ Minor Update ด้วยต้นทุนที่ต่ำกว่า

ด้วย Cloud VPS ของ ผู้ให้บริการโฮสติ้ง คุณจะมีทรัพยากรเพียงพอเพื่อทำ Blue-Green Deployment หรือ Rolling Update ได้อย่างมีประสิทธิภาพ พร้อมกับ Support Team ที่พร้อมช่วยเหลือ