DevOps

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 DeploymentRolling Update
จำนวนเซิร์ฟเวอร์ต้องมี 2 ชุดต้องมี 2+ ตัว
Downtime0 (Instant switch)0 (Gradual switch)
Rollback Timeทันทีช้ากว่า
Testingเต็มที่ก่อน SwitchTest ขณะ Deploy
Resource Usageสูง (2 ชุด)ต่ำกว่า
Complexityซับซ้อนปานกลางง่ายกว่า
ความเสี่ยงต่ำกลาง
Use Case ที่เหมาะMajor Release, Critical UpdateMinor 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 ที่พร้อมช่วยเหลือ