Server Migration: ย้าย Linux Server ไปเครื่องใหม่ด้วย rsync

วางแผน Server Migration ย้าย Linux Server ไปเครื่องใหม่ให้ระบบหยุดเพียงไม่กี่นาที ด้วยการลด TTL, rsync สองรอบ, ย้ายฐานข้อมูล, เช็กลิสต์วันสลับ และแผนถอยกลับ

โดย ทีมงาน THAI DATA CLOUD อัปเดต อ่าน 11 นาที

แชร์FacebookXLINELinkedIn
Server Migration — Server Migration: ย้าย Linux Server ไปเครื่องใหม่ด้วย rsync
Server Migration: ย้าย Linux Server ไปเครื่องใหม่ด้วย rsync

คำตอบสั้น ๆ: วางแผน 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 หลุด
ลำดับ Server Migration ตั้งแต่ลด TTL rsync รอบแรก ทดสอบ ปิดปรับปรุงสั้น ๆ จนสลับ DNS และเก็บเครื่องเดิม
งานหนักทำก่อนวันจริง ช่วงปิดระบบจริงเหลือแค่ rsync รอบสองและฐานข้อมูลรอบสุดท้าย

ขั้นตอนที่ 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 ของพาร์ตเนอร์

เช็กลิสต์สำรวจเครื่องเดิมก่อน Server Migration ทั้งบริการ Cron ผู้ใช้ ใบรับรอง และ IP ที่ถูก Whitelist
สิ่งที่ลืมบ่อยที่สุดคือ Cron Job และบริการภายนอกที่ผูกกับ IP เดิม

ขั้นตอนที่ 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 แยกฐานข้อมูลไม่ได้พาผู้ใช้ไปด้วย

ตารางเปรียบเทียบการย้ายฐานข้อมูลด้วย mysqldump กับการตั้ง Replica ระหว่าง Server Migration
ฐานข้อมูลยิ่งใหญ่ ช่วงปิดระบบของวิธี Dump ยิ่งยาว ควรเปลี่ยนไปใช้ Replica

ขั้นตอนที่ 6: ทดสอบเครื่องใหม่โดยไม่แตะ DNS

บังคับให้เฉพาะคำขอทดสอบไปที่ IP ใหม่ แล้วทดสอบหน้าแรก การล็อกอิน ฟอร์ม และอัปโหลดไฟล์ ดู Error Log ของเว็บและ PHP บนเครื่องใหม่ระหว่างทดสอบ ขั้นนี้คือโอกาสเจอปัญหาของ Server Migration ก่อนกระทบผู้ใช้จริง หรือแก้ไฟล์ hosts บนเครื่องของคุณชั่วคราว

curl -sI --resolve www.example.com:443:203.0.113.20 https://www.example.com

ขั้นตอนที่ 7: วันสลับระบบ (Cutover)

  1. เปิดหน้าปิดปรับปรุงบนเครื่องเดิม และหยุด Cron ด้วย systemctl stop cron (AlmaLinux/Rocky ใช้ crond) เพื่อไม่ให้มีข้อมูลใหม่เขียนเข้ามา
  2. rsync รอบสองพร้อม --delete ให้ไฟล์ที่ถูกลบบนเครื่องเดิมหายจากเครื่องใหม่ด้วย ดูผลแบบ --dry-run ก่อนเสมอ รอบนี้ส่งเฉพาะส่วนต่าง จึงจบในไม่กี่นาที
  3. ย้ายฐานข้อมูลรอบสุดท้ายตามขั้นตอนที่ 5 หรือเลื่อน Replica ขึ้นเป็นตัวหลัก
  4. แก้ A Record เป็น 203.0.113.20 เปิด Cron บนเครื่องใหม่ แล้วทดสอบซ้ำตามขั้นตอนที่ 6
rsync -aHAXi --delete --dry-run -e "ssh -i /root/.ssh/migrate" /var/www/ [email protected]:/var/www/
rsync -aHAX --delete --stats -e "ssh -i /root/.ssh/migrate" /var/www/ [email protected]:/var/www/
ผล rsync รอบสองช่วงสลับระบบ ส่งเพียงไฟล์ที่เปลี่ยนไม่กี่สิบไฟล์ ทำให้ Server Migration ปิดระบบสั้น
ข้อมูลรวม 4.2 GB แต่รอบสองส่งจริงไม่ถึง 20 MB จึงจบในไม่กี่วินาที

ขั้นตอนที่ 8: เฝ้าระวัง ถอยกลับ และเก็บงาน

ทุก Server Migration ต้องมีเกณฑ์ถอยกลับที่ตกลงกันไว้ก่อนวันจริง เช่น ถ้าระบบหลักใช้ไม่ได้ภายในหนึ่งชั่วโมงแรก ให้แก้ DNS กลับเป็น IP เดิมและเปิดเครื่องเดิมใหม่ ยิ่งตัดสินใจช้า ข้อมูลที่เกิดบนเครื่องใหม่ยิ่งมาก และต้องคัดลอกกลับเอง เก็บเครื่องเดิมไว้อย่างน้อย 7 วันก่อนลบ หลังผ่านช่วงนั้นให้ลบ Key ชั่วคราว (/root/.ssh/migrate* และบรรทัดใน authorized_keys) คืนค่า TTL เป็น 3600 และย้ายงานสำรองข้อมูลกับระบบ Monitor ไปชี้เครื่องใหม่

ปัญหาที่พบบ่อยเกี่ยวกับ Server Migration

หลังสลับ DNS ผู้ใช้บางคนยังเข้าเครื่องเดิม ทำอย่างไร?

เป็นเพราะ Resolver บางแห่งยังจำค่าเดิมไว้ โดยเฉพาะถ้าลด TTL ไม่ทัน ให้เครื่องเดิมทำ Reverse Proxy ไปเครื่องใหม่ชั่วคราว หรือแสดงหน้าปิดปรับปรุงต่อจนผ่านเวลา TTL เดิม อย่าเปิดให้เขียนข้อมูลบนเครื่องเดิมอีก

ไฟล์ย้ายครบแต่เว็บขึ้น Permission denied เกิดจากอะไร?

ผู้ใช้บนเครื่องใหม่มี UID ไม่ตรงหรือยังไม่ได้สร้างก่อน rsync ไฟล์จึงเป็นของผู้ใช้ผิดคน ตรวจด้วย ls -ln แล้วแก้ด้วย chown ตาม คู่มือ chmod และ chown บนระบบที่เปิด SELinux ให้รัน restorecon ด้วย

อีเมลที่ส่งจากเซิร์ฟเวอร์ใหม่เข้า Spam ต้องแก้อะไร?

IP ใหม่ยังไม่อยู่ใน SPF และยังไม่มี Reverse DNS ให้เพิ่ม IP ใหม่ใน SPF ตาม คู่มือ SPF, DKIM และ DMARC และขอตั้ง PTR หรือเปลี่ยนไปส่งผ่าน SMTP Relay แทน

งานบางอย่างทำงานซ้ำสองครั้งในวันย้าย ป้องกันอย่างไร?

เกิดจาก Cron หรือ Worker ทำงานพร้อมกันทั้งสองเครื่อง ตามแผนนี้ Cron บนเครื่องใหม่ปิดไว้จนวันสลับ และหยุดบนเครื่องเดิมก่อน rsync รอบสอง ตรวจ Queue Worker และ systemd Timer ในรายการจากขั้นตอนที่ 1 ด้วย

ถ้าต้องการให้ทีมช่วยวางแผน Server Migration มายัง Cloud Server หรือประเมินขนาดเครื่องใหม่ ติดต่อทีมงาน THAI DATA CLOUD ตัวเลือกทั้งหมดของ rsync ดูได้ที่ rsync manual

สรุปขั้นตอน Server Migration

ทบทวน Server Migration ทั้งหมดตามลำดับ ก่อนนำไปใช้กับระบบจริง

  1. สำรวจทุกอย่างที่เครื่องเดิมทำอยู่
  2. ลด TTL ของ DNS ล่วงหน้า
  3. เตรียมเครื่องใหม่ให้ซอฟต์แวร์ตรงกัน
  4. rsync รอบแรกขณะระบบเดิมยังทำงาน
  5. เลือกวิธีย้ายฐานข้อมูล
  6. ทดสอบเครื่องใหม่โดยไม่แตะ DNS
  7. วันสลับระบบ (Cutover)
  8. เฝ้าระวัง ถอยกลับ และเก็บงาน

เมื่อทำครบทุกข้อแล้ว Server Migration จะพร้อมใช้งาน หากผลลัพธ์ไม่เป็นไปตามที่คาด ให้ย้อนกลับไปดูหัวข้อปัญหาที่พบบ่อยด้านบน ซึ่งรวบรวมกรณีที่พบจริงจากการใช้งาน Server Migration ไว้แล้ว

อ่านเพิ่มเติมเกี่ยวกับ Server Migration

แชร์FacebookXLINELinkedIn

มีคำถามเรื่องบริการ? ติดต่อทีมงาน