คำตอบสั้น ๆ: วางแผน Server Migration ย้าย Linux Server ไปเครื่องใหม่ให้ระบบหยุดเพียงไม่กี่นาที ด้วยการลด TTL, rsync สองรอบ, ย้ายฐานข้อมูล, เช็กลิสต์วันสลับ และแผนถอยกลับ
คู่มือนี้อธิบาย Server Migration ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
Server Migration คือการย้ายเว็บ แอป และข้อมูลทั้งหมดจากเซิร์ฟเวอร์เดิมไปเครื่องใหม่ เช่น ย้ายจากเครื่องเก่าที่ระบบปฏิบัติการใกล้หมดอายุ หรือย้ายจากผู้ให้บริการเดิมมาที่ Cloud Server ความเสี่ยงหลักไม่ใช่การคัดลอกไฟล์ แต่คือการลืมบางอย่าง เช่น Cron Job หรือใบรับรอง SSL และการปิดระบบนานเกินจำเป็นระหว่างคัดลอกข้อมูล
คู่มือนี้ใช้วิธีที่ทีมดูแลระบบนิยม: คัดลอกข้อมูลก้อนใหญ่ด้วย rsync ขณะระบบเดิมยังทำงาน แล้วปิดระบบเพียงช่วงสั้นเพื่อซิงก์ส่วนต่างรอบสุดท้าย เมื่อจบคุณจะมีรายการตรวจของเครื่องเดิม ลำดับวันสลับที่ทำตามได้ และแผนถอยกลับถ้ามีปัญหา ตัวอย่างใช้เครื่องเดิม 203.0.113.10 และเครื่องใหม่ 203.0.113.20
สิ่งที่ต้องเตรียม
- เครื่องใหม่ที่ติดตั้ง Linux รุ่นเดียวกันหรือใหม่กว่า เช่น Cloud Linux Server พื้นที่ดิสก์มากกว่าที่ใช้จริงบนเครื่องเดิมอย่างน้อย 30%
- สิทธิ์ root หรือ
sudoทั้งสองเครื่อง และสิทธิ์แก้ DNS ของโดเมน - สำรองข้อมูลเครื่องเดิมทั้งเครื่องก่อนเริ่ม (ดู การ Backup Server บน Cloud)
- ช่วงเวลาปิดปรับปรุงที่ตกลงกับผู้ใช้แล้ว และใช้ tmux รันคำสั่งยาว เผื่อ SSH หลุด
ขั้นตอนที่ 1: สำรวจทุกอย่างที่เครื่องเดิมทำอยู่
Server Migration ที่ล้มเหลวส่วนใหญ่มาจากสิ่งที่ไม่มีใครจดไว้ รันคำสั่งเหล่านี้บนเครื่องเดิมแล้วบันทึกผลลงไฟล์
cat /etc/os-release
systemctl list-units --type=service --state=running --no-pager
sudo ss -tlnp
sudo crontab -l; ls /etc/cron.d; sudo ls /var/spool/cron/crontabs /var/spool/cron 2>/dev/null
getent passwd | awk -F: '$3>=1000 {print $1, $3}'
df -h; sudo du -sh /var/www /var/lib/mysql /home /etc/letsencrypt
จดเพิ่ม: เวอร์ชัน PHP, Node.js และฐานข้อมูล, กฎ Firewall, ไฟล์ตั้งค่าเว็บใน /etc/nginx หรือ /etc/apache2, งานที่ส่งอีเมลออก และบริการภายนอกที่ Whitelist IP เดิมไว้ เช่น Payment Gateway หรือ API ของพาร์ตเนอร์
ขั้นตอนที่ 2: ลด TTL ของ DNS ล่วงหน้า
ลด TTL ของ A Record ที่จะเปลี่ยนเป็น 300 วินาที อย่างน้อยเท่ากับ TTL เดิมก่อนวัน Server Migration (ถ้าเดิม 86400 ให้ลดก่อน 24-48 ชั่วโมง) เพื่อให้ผู้ใช้ส่วนใหญ่ไปเครื่องใหม่ภายในไม่กี่นาทีหลังสลับ รายละเอียดอยู่ใน คู่มือ TTL และการวางแผนย้าย DNS
ขั้นตอนที่ 3: เตรียมเครื่องใหม่ให้ซอฟต์แวร์ตรงกัน
ระหว่าง Server Migration ให้ติดตั้งซอฟต์แวร์ชุดเดียวกับเครื่องเดิม ใช้เวอร์ชันหลักเดียวกันโดยเฉพาะฐานข้อมูล แล้วค่อยอัปเกรดหลังย้ายเสร็จ การเปลี่ยนสองอย่างพร้อมกันทำให้หาสาเหตุยากเมื่อมีปัญหา สร้างผู้ใช้และกลุ่มชื่อเดียวกับเครื่องเดิม คัดลอกเฉพาะไฟล์ตั้งค่าที่ต้องใช้ ห้ามคัดลอก /etc ทั้งโฟลเดอร์ เพราะมีค่าเฉพาะเครื่อง เช่น fstab, Network และ SSH Host Key
ยังไม่ต้องเปิด Cron บนเครื่องใหม่ ไม่เช่นนั้นงานอย่างส่งอีเมลหรือตัดรอบบิลจะทำงานซ้ำสองเครื่อง สร้าง SSH Key ชั่วคราวให้ root ของเครื่องเดิมเข้าเครื่องใหม่ได้
# บนเครื่องเดิม
sudo ssh-keygen -t ed25519 -f /root/.ssh/migrate -N ''
sudo cat /root/.ssh/migrate.pub
# บนเครื่องใหม่: นำบรรทัดที่ได้ไปต่อท้าย /root/.ssh/authorized_keys
ขั้นตอนที่ 4: rsync รอบแรกขณะระบบเดิมยังทำงาน
หัวใจของ Server Migration แบบ Downtime ต่ำคือ rsync สองรอบ รอบแรกคัดลอกข้อมูลเกือบทั้งหมดโดยไม่ต้องปิดเว็บ อาจใช้เวลาหลายชั่วโมงถ้าข้อมูลใหญ่ รันด้วย root (sudo -i) บนเครื่องเดิม
rsync -aHAX --info=progress2 -e "ssh -i /root/.ssh/migrate" \
/var/www/ [email protected]:/var/www/
rsync -aHAX -e "ssh -i /root/.ssh/migrate" \
/etc/letsencrypt/ [email protected]:/etc/letsencrypt/
-a รักษาสิทธิ์ เจ้าของ และเวลาของไฟล์ -H, -A, -X รักษา Hard Link, ACL และ Extended Attribute ส่วนเครื่องหมาย / ท้าย Path ต้นทางหมายถึงคัดลอกเนื้อหาในโฟลเดอร์ ไม่ใช่ตัวโฟลเดอร์ ถ้าเครื่องใหม่เป็น AlmaLinux/Rocky ที่เปิด SELinux ให้รัน restorecon -Rv /var/www หลังคัดลอก
ขั้นตอนที่ 5: เลือกวิธีย้ายฐานข้อมูล
ไฟล์ฐานข้อมูลที่กำลังทำงานห้ามคัดลอกด้วย rsync เพราะได้ข้อมูลไม่สมบูรณ์ ให้เลือกวิธีตามขนาด ฐานข้อมูลเล็ก Dump แล้วส่งตรงไปเครื่องใหม่ในวันสลับ
mysqldump --single-transaction --routines --triggers --events --databases appdb \
| gzip | ssh -i /root/.ssh/migrate [email protected] "gunzip | mysql"
ฐานข้อมูลใหญ่ให้ตั้งเครื่องใหม่เป็น Replica ล่วงหน้า (ดู MySQL Master-Replica หรือ PostgreSQL Streaming Replication) วันสลับเพียงรอให้ตามทัน แล้วเลื่อนขึ้นเป็นตัวหลัก อย่าลืมสร้างผู้ใช้ฐานข้อมูลและสิทธิ์ให้แอปบนเครื่องใหม่ เพราะการ Dump แยกฐานข้อมูลไม่ได้พาผู้ใช้ไปด้วย