การ 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 ที่พร้อมช่วยเหลือ
