ข้อเสียที่ต้องรับ: ไม่มี monitoring — เวลามีปัญหาเราจะไม่รู้เลยว่าเกิดอะไรขึ้น และไม่มีข้อมูลไว้วิเคราะห์ย้อนหลัง deploy ทุกครั้งต้องมี downtime ไฟล์ที่ user อัปโหลดจะสะสมอยู่บน disk ของ Rails VM สุดท้ายเต็มและทำให้ระบบล่ม
Scenario B
สมดุล — 3 VMs
เพิ่ม monitoring VM แยกต่างหาก แต่ไฟล์อัปโหลดยังคงอยู่บน Rails VM
VM 1 · App
Rails + Sidekiq
2 vCPU / 4 GB Disk 100 GB Web + jobs + files
VM 2 · Data
PostgreSQL + Redis
2 vCPU / 4 GB Disk 50 GB DB + cache + queue
VM 3 · Ops
Monitoring
2 vCPU / 4 GB Disk 50 GB Prometheus + Grafana
ข้อเสียที่ต้องรับ: มี observability แล้ว — เรามองเห็นปัญหาก่อนที่ user จะแจ้งเข้ามา แต่ไฟล์อัปโหลดยังแชร์ disk กับ Rails VM ซึ่งยังเป็นปัญหาหลักเมื่อไฟล์ GNSS data สะสมมากขึ้นเรื่อยๆ
Scenario C
แยกทุก role — 4 VMs
เพิ่ม file storage แบบ S3-compatible โดยเฉพาะ แต่ละ VM มีหน้าที่ชัดเจน
VM 1 · App
Rails + Sidekiq
2 vCPU / 4 GB Disk 30 GB Web + jobs
VM 2 · Data
PostgreSQL + Redis
2 vCPU / 4 GB Disk 50 GB DB + cache
VM 3 · Storage
RustFS
2 vCPU / 4 GB Disk 50 GB S3-compatible files
VM 4 · Ops
Monitoring
2 vCPU / 4 GB Disk 50 GB Grafana stack
ทำไมเราแนะนำ scenario นี้: ไฟล์ GNSS data จะเพิ่มขึ้นได้เรื่อยๆ โดยไม่กระทบ app VM แต่ละ role ถูกแยกอย่างชัดเจน — ถ้ามีปัญหาเรื่อง disk ที่ file storage ก็ไม่กระทบ Rails เพิ่มจาก Scenario B แค่ 1 VM เท่านั้น แต่ได้ upgrade path ที่สะอาดกว่าในระยะยาว
หมายเหตุเรื่องขนาดที่ขอ: ตัวเลขที่เสนอเป็นเพียงจุดเริ่มต้นสำหรับการพูดคุย ทีม ICT คือผู้ที่เข้าใจข้อจำกัดของ infrastructure ได้ดีที่สุด หากพิจารณาแล้วเห็นว่าควรปรับลดตรงไหน เรายินดีปรับตามครับ สำหรับข้อมูลอ้างอิง: v1 ที่ใช้อยู่ตอนนี้มี 2 cores / 4 GB RAM / 291 GB disk (ใช้จริง ~20 GB) ส่วน Scenario C รวมประมาณ 8 vCPU / 16 GB RAM / 180 GB disk กระจายใน 4 VM ซึ่งแต่ละตัวยังอยู่ภายใต้ cap 2 vCPU / 4 GB ที่ทีม ICT ได้กำหนดไว้ จุดประสงค์หลักคือการแยกหน้าที่ของแต่ละ service ออกจากกัน ไม่ได้ต้องการเพิ่ม capacity ของระบบแต่อย่างใด workload จริงยังเบาเท่าเดิม
FAQ
ประเด็นที่เราคาดว่าจะถูกถาม และคำตอบที่เตรียมไว้
ทำไมต้องใช้ VM เยอะขนาดนี้ VM ใหญ่ตัวเดียวไม่ง่ายกว่าเหรอ?
VM เดียวหมายความว่าถ้ามีปัญหาครั้งเดียวระบบล่มทั้งหมด การแยก VM ช่วยจำกัด blast radius ของปัญหาที่อาจเกิดขึ้น แต่ละ VM ขนาดเล็กแค่ 2 vCPU ซึ่ง hypervisor จัดการ scheduling ได้ง่ายกว่า VM ใหญ่ที่ต้องแย่งทรัพยากรแบบต่อเนื่อง