Categories
Disaster Recovery

**

สำหรับวิศวกร DevOps, ผู้ดูแลระบบฐานข้อมูล (DBAs) และสถาปนิกด้านระบบไอที ค่า Recovery Time Objective (RTO) และ Recovery Point Objective (RPO) ไม่ใช่แค่คำศัพท์สวยหรูทางธุรกิจ แต่เป็นข้อจำกัดทางวิศวกรรมที่เข้มงวด ในการจัดการฐานข้อมูลที่มีความสำคัญต่อภารกิจ (mission-critical) การคำนวณ การออกแบบสถาปัตยกรรม และการตรวจสอบตัวชี้วัดเหล่านี้อย่างไม่ถูกต้อง อาจนำไปสู่การสูญเสียข้อมูลครั้งใหญ่และระยะเวลาหยุดทำงาน (downtime) ที่ยาวนานเกินควร

ในสภาพแวดล้อมองค์กรสมัยใหม่ การคำนวณ RTO และ RPO จำเป็นต้องมีความเข้าใจอย่างลึกซึ้งเกี่ยวกับกลไกภายในของฐานข้อมูล, I/O ของพื้นที่จัดเก็บข้อมูล, ปริมาณการรับส่งข้อมูลผ่านเครือข่าย (network throughput) และกลไกของทรานแซกชันล็อก (transaction log) คู่มือนี้จะสำรวจระเบียบวิธีทางเทคนิคสำหรับการคำนวณ การทดสอบ และการเพิ่มประสิทธิภาพ RTO และ RPO สำหรับระบบฐานข้อมูลในระดับโปรดักชัน

การวิเคราะห์ RPO (Recovery Point Objective) ในระบบฐานข้อมูล

RPO คือปริมาณข้อมูลสูงสุดที่ยอมรับได้ว่าจะสูญเสียไปโดยวัดเป็นเวลา หาก RPO ของคุณคือ 15 นาที หมายความว่าหากเกิดภัยพิบัติขึ้นในเวลา 12:00 น. คุณจะต้องสามารถกู้คืนทรานแซกชันที่ยืนยันแล้วทั้งหมดได้จนถึงเวลาอย่างน้อย 11:45 น.

สำหรับฐานข้อมูล RPO จะถูกกำหนดโดยกลยุทธ์การจัดการทรานแซกชันล็อกของคุณ (WAL ใน PostgreSQL, Redo Logs ใน Oracle, Transaction Logs ใน SQL Server)

กลไกของการสูญเสียข้อมูลและการสร้างล็อก

ในการคำนวณ RPO ที่เป็นไปได้ คุณต้องเข้าใจอัตราการสร้างทรานแซกชันล็อกของฐานข้อมูลของคุณก่อน หากคุณกำลังส่งล็อกไปยังที่เก็บข้อมูลสำรองทุกๆ 15 นาที แต่เครือข่ายของคุณไม่สามารถโอนย้ายล็อกปริมาณ 15 นาทีนั้นได้ทันภายในเวลาที่กำหนด RPO จริงของคุณก็จะแย่ลงเรื่อยๆ

คุณสามารถสร้างค่าพื้นฐาน (baseline) ของอัตราการสร้างล็อกได้โดยใช้คำสั่ง SQL พื้นฐาน ตัวอย่างเช่น ใน PostgreSQL (เวอร์ชัน 10 ขึ้นไป) คุณสามารถวัดอัตราการสร้าง Write-Ahead Log (WAL) ในช่วงเวลาที่กำหนดได้ดังนี้:

-- รันคำสั่งนี้ที่ T=0
SELECT pg_current_wal_lsn() AS start_lsn;

-- รอ 5 นาทีพอดี (300 วินาที) แล้วรัน:
SELECT pg_current_wal_lsn() AS end_lsn,
       pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), 'START_LSN_VALUE')) AS wal_generated_size,
       pg_wal_lsn_diff(pg_current_wal_lsn(), 'START_LSN_VALUE') / 300 AS bytes_per_second;

หากคิวรีนี้แสดงให้เห็นว่าคุณกำลังสร้างข้อมูล WAL ที่ 50 MB/s ในช่วงที่มีการใช้งานสูงสุด RPO ที่ 15 นาทีจะต้องมีการโอนย้ายข้อมูลล็อกขนาด 45 GB ไปยังที่เก็บข้อมูลสำรอง เครือข่ายและเป้าหมายการจัดเก็บข้อมูลของคุณต้องรองรับความเร็วในการเขียนที่ต่อเนื่องเกินกว่า 50 MB/s เพื่อรักษา RPO นี้ไว้

ผลกระทบของการจำลองข้อมูลแบบ Synchronous เทียบกับ Asynchronous

DBA หลายคนพึ่งพาการจำลองข้อมูลแบบ High Availability (HA) เพื่อให้เป็นไปตาม RPO อย่างไรก็ตาม การจำลองข้อมูลไม่ใช่การสำรองข้อมูล การลบตารางทิ้ง (DROP TABLE users;) จะถูกจำลองไปทันที

เมื่อใช้การจำลองข้อมูลเพื่อการกู้คืนจากภัยพิบัติ (DR) โหมดการจำลองจะมีผลโดยตรงต่อ RPO:
* Synchronous Replication: รับประกัน RPO เป็นศูนย์ (RPO=0) ฐานข้อมูลหลักจะไม่ยืนยัน (commit) ทรานแซกชันจนกว่าฐานข้อมูลสำรองจะตอบรับว่าได้รับข้อมูลแล้ว ข้อแลกเปลี่ยนคือความหน่วง (latency) ที่เพิ่มขึ้นในการเขียนข้อมูลที่ฐานข้อมูลหลัก
* Asynchronous Replication: ทำให้เกิดความล่าช้าในการจำลองข้อมูล (replication lag) RPO ของคุณจะมีค่าเท่ากับความล่าช้าในการจำลองข้อมูลในขณะนั้น

ในการตรวจสอบความล่าช้าของการจำลองข้อมูลแบบ Asynchronous ใน PostgreSQL ให้ใช้:

SELECT application_name,
       client_addr,
       state,
       sync_state,
       pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS replication_lag_bytes
FROM pg_stat_replication;

การวิเคราะห์ RTO (Recovery Time Objective) สำหรับฐานข้อมูลขนาดใหญ่

RTO คือระยะเวลาหยุดทำงานสูงสุดที่ยอมรับได้ การคำนวณ RTO ของฐานข้อมูลมีความซับซ้อนอย่างมาก เพราะไม่ใช่แค่เวลาที่ใช้ในการคัดลอกไฟล์กลับไปยังเซิร์ฟเวอร์เท่านั้น

แบบจำลองทางคณิตศาสตร์สำหรับการคำนวณ RTO

การคำนวณ RTO ของฐานข้อมูลที่สมจริงต้องคำนึงถึง 4 ระยะที่แตกต่างกัน:

RTO = T(infra) + T(transfer) + T(restore) + T(recovery)

  1. T(infra) – การจัดเตรียมโครงสร้างพื้นฐาน: เวลาในการเตรียมระบบประมวลผลและพื้นที่จัดเก็บข้อมูลใหม่ (อาจใกล้ศูนย์หากมีไซต์ DR ที่เตรียมไว้ล่วงหน้าหรือใช้ Infrastructure-as-Code)
  2. T(transfer) – การโอนย้ายข้อมูล: เวลาในการย้ายข้อมูลสำรองจากที่เก็บข้อมูลไปยังเซิร์ฟเวอร์ฐานข้อมูล
  3. T(restore) – การกู้คืนทางกายภาพ: เวลาในการเขียนไฟล์ข้อมูลลงในดิสก์เป้าหมาย
  4. T(recovery) – การกู้คืนจากความเสียหายของฐานข้อมูล: เวลาที่เอนจินฐานข้อมูลใช้ในการเล่นทรานแซกชันล็อกซ้ำ (replay), ทำการยืนยัน (roll forward) ทรานแซกชันที่สมบูรณ์ และยกเลิก (roll back) ทรานแซกชันที่ยังไม่สมบูรณ์

การคำนวณเวลาโอนย้ายและกู้คืน

ในการคำนวณ T(transfer) และ T(restore) คุณต้องสร้างค่าพื้นฐานของแบนด์วิดท์เครือข่ายและ IOPS/throughput ของดิสก์ อย่าพึ่งพาค่าสูงสุดตามทฤษฎี ให้ทดสอบกับโครงสร้างพื้นฐานจริงของคุณ

ใช้ iperf3 เพื่อทดสอบ throughput ของเครือข่ายระหว่างที่เก็บข้อมูลสำรองและเซิร์ฟเวอร์ฐานข้อมูล:

# บนที่เก็บข้อมูลสำรอง (เซิร์ฟเวอร์)
iperf3 -s

# บนเซิร์ฟเวอร์ฐานข้อมูล (ไคลเอนต์)
iperf3 -c <backup_repo_ip> -t 60 -P 4

ใช้ fio เพื่อทดสอบประสิทธิภาพการเขียนแบบต่อเนื่องของโวลุ่มจัดเก็บข้อมูลฐานข้อมูลของคุณ โดยจำลองการดำเนินการกู้คืนฐานข้อมูล:

fio --name=restore_sim --ioengine=libaio --rw=write --bs=1M --size=10G --numjobs=4 --iodepth=32 --direct=1 --filename=/var/lib/postgresql/data/testfile

หากฐานข้อมูลของคุณมีขนาด 5 TB และการทดสอบ fio แสดงความเร็วในการเขียนสูงสุดที่ 500 MB/s ค่า T(restore) ขั้นต่ำของคุณจะอยู่ที่ประมาณ 2.8 ชั่วโมง หาก SLA ธุรกิจของคุณกำหนด RTO ไว้ที่ 1 ชั่วโมง การกู้คืนแบบสตรีมมิ่งทั่วไปจะล้มเหลว คุณต้องเปลี่ยนสถาปัตยกรรมไปใช้ Snapshot ระดับพื้นที่จัดเก็บข้อมูลหรือการจำลองข้อมูลระดับบล็อก

กับดักที่ซ่อนอยู่: T(recovery)

ตัวแปรที่มักถูกประเมินต่ำเกินไปมากที่สุดคือ T(recovery) หากคุณกู้คืนจาก Full Backup รายสัปดาห์และต้องนำทรานแซกชันล็อกของ 6 วันมาปรับใช้เพื่อให้ได้ RPO ตามเป้าหมาย เอนจินฐานข้อมูลจะต้องเล่นทรานแซกชันซ้ำตามลำดับ

การเล่นทรานแซกชันล็อกขนาด 500 GB ซ้ำอาจใช้เวลาหลายชั่วโมง ซึ่งถูกจำกัดด้วยประสิทธิภาพ CPU แบบ Single-threaded และ IOPS ของพื้นที่จัดเก็บข้อมูล เพื่อลด T(recovery) ให้เหลือน้อยที่สุด คุณควรเพิ่มความถี่ในการทำ Full Backup หรือ Differential Backup

การเชื่อมช่องว่าง: ขั้นตอนปฏิบัติเพื่อตรวจสอบ RTO และ RPO

การคำนวณ RTO และ RPO ตามทฤษฎีเป็นเพียงก้าวแรก สภาพแวดล้อมที่สำคัญต่อภารกิจจำเป็นต้องมีการตรวจสอบอย่างต่อเนื่อง

ขั้นตอนที่ 1: การทำ Archiving อย่างต่อเนื่อง

เพื่อให้ได้ RPO ที่ต่ำกว่าหนึ่งนาทีโดยไม่ต้องเสียประสิทธิภาพจากการทำ Synchronous Replication ให้ใช้การทำ Log Archiving อย่างต่อเนื่อง แทนที่จะรอให้ไฟล์ล็อกเต็ม (ซึ่งอาจใช้เวลาหลายชั่วโมงในช่วงที่มีการใช้งานน้อย) ให้บังคับสลับล็อก (log switch) ตามช่วงเวลาที่กำหนด

ใน SQL Server คุณสามารถทำให้อัตโนมัติได้โดยการสำรอง Transaction Log บ่อยๆ:

BACKUP LOG [MissionCriticalDB] 
TO DISK = N'\BackupRepoSQLMissionCriticalDB_Log.trn' 
WITH NOFORMAT, NOINIT, 
NAME = N'MissionCriticalDB-Transaction Log Backup', 
SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10;

แนวทางปฏิบัติที่ดีที่สุด: กำหนดเวลาให้งานนี้รันทุกๆ 1-5 นาที ขึ้นอยู่กับข้อกำหนด RPO ของคุณ

ขั้นตอนที่ 2: การทดสอบการกู้คืนอัตโนมัติ

การสำรองข้อมูลที่ไม่ได้ทดสอบเป็นเพียงแนวคิดทางทฤษฎีเท่านั้น เพื่อรับประกัน RTO ที่คุณคำนวณไว้ คุณต้องดำเนินการทดสอบการกู้คืนโดยอัตโนมัติ

แพลตฟอร์มสำรองข้อมูลระดับองค์กรอย่าง CloudSave ช่วยให้เรื่องนี้ง่ายขึ้นโดยการจัดเตรียมการทดสอบการกู้คืนแบบแยกส่วนโดยอัตโนมัติ CloudSave สามารถสร้างสภาพแวดล้อม Sandbox ขึ้นมาโดยอัตโนมัติ ติดตั้งข้อมูลสำรองล่าสุด ทำการกู้คืนฐานข้อมูลเต็มรูปแบบ และรันสคริปต์ตรวจสอบที่กำหนดเอง (เช่น DBCC CHECKDB สำหรับ SQL Server) เพื่อวัด RTO ที่แท้จริงและรับประกันความสมบูรณ์ของข้อมูล สิ่งนี้เปลี่ยน RTO จากการคาดเดาให้กลายเป็นตัวชี้วัดที่พิสูจน์ได้และรายงานได้

ขั้นตอนที่ 3: การตรวจสอบและแจ้งเตือนเมื่อละเมิด SLA

ระบบตรวจสอบของคุณ (Prometheus, Datadog, Zabbix) ควรติดตามตัวชี้วัดที่คุกคาม SLA ของ RTO/RPO อย่างแข็งขัน โดยควรตั้งค่ากฎการแจ้งเตือนสำหรับ:
* งานสำรองข้อมูลล้มเหลว: ภัยคุกคามโดยตรงต่อ RPO
* ความล่าช้าในการส่งล็อก: หากการโอนย้ายล็อกใช้เวลานานกว่าช่วงเวลาการสร้างล็อก
* การจำกัด IOPS ของพื้นที่จัดเก็บข้อมูล: ผู้ให้บริการคลาวด์ (เช่น AWS EBS) จะจำกัด IOPS หากเครดิต Burst หมดลง ซึ่งจะทำลาย RTO ของคุณอย่างเงียบๆ ในระหว่างเหตุฉุกเฉินจริง

การเพิ่มประสิทธิภาพสถาปัตยกรรมการสำรองข้อมูลฐานข้อมูลเพื่อให้เป็นไปตาม SLA ที่เข้มงวด

เมื่อการคำนวณทางคณิตศาสตร์เผยให้เห็นว่าสถาปัตยกรรมปัจจุบันของคุณไม่สามารถตอบสนอง SLA ของธุรกิจได้ คุณต้องปรับปรุงกลยุทธ์การสำรองข้อมูลของคุณ

1. ใช้ประโยชน์จากการสำรองข้อมูลแบบ Block-Level Incremental

การดัมพ์ฐานข้อมูลแบบดั้งเดิม (การสำรองข้อมูลเชิงตรรกะ เช่น pg_dump หรือ mysqldump) นั้นช้าเกินไปสำหรับ RTO ที่สำคัญต่อภารกิจ ให้ใช้การสำรองข้อมูลทางกายภาพระดับบล็อก การสำรองข้อมูลแบบ Block-level incremental จะคัดลอกเฉพาะบล็อกดิสก์ที่มีการเปลี่ยนแปลงตั้งแต่การสำรองข้อมูลครั้งล่าสุด ซึ่งช่วยลด T(transfer) และภาระของเครือข่ายได้อย่างมาก

2. ใช้ประโยชน์จาก Storage Snapshots

สำหรับฐานข้อมูลขนาดหลายเทราไบต์ที่ต้องการ RTO น้อยกว่า 15 นาที การคัดลอกไฟล์แบบดั้งเดิมนั้นเป็นไปไม่ได้ในทางปฏิบัติผ่านเครือข่ายมาตรฐาน การรวมเข้ากับ SAN หรือ Storage Snapshots แบบ Cloud-native (เช่น AWS EBS Snapshots, Pure Storage) ช่วยให้ T(restore) เกิดขึ้นได้เกือบจะทันที จากนั้นเอนจินฐานข้อมูลเพียงแค่ต้องทำการกู้คืนจากความเสียหาย (crash recovery) บน Snapshot เท่านั้น

3. ใช้การประมวลผลแบบขนาน (Parallelism)

ตรวจสอบให้แน่ใจว่าเครื่องมือสำรองและกู้คืนของคุณใช้การประมวลผลแบบหลายเธรด (multi-threading) เมื่อกู้คืนฐานข้อมูล PostgreSQL โดยใช้ pgbackrest หรือฐานข้อมูล SQL Server ให้กำหนดเธรดการทำงานแบบขนานอย่างชัดเจนเพื่อใช้แบนด์วิดท์เครือข่ายและดิสก์ที่มีอยู่ให้เต็มประสิทธิภาพ

# ตัวอย่างการกู้คืนแบบขนานใน pgBackRest
pgbackrest --stanza=prod_db --process-max=8 restore

บทสรุป

การคำนวณ RTO และ RPO สำหรับฐานข้อมูลที่สำคัญต่อภารกิจเป็นแบบฝึกหัดที่เข้มงวดในด้านวิศวกรรมระบบ ซึ่งกำหนดให้ DBA ต้องก้าวข้ามการกำหนดค่าการสำรองข้อมูลเริ่มต้น และสร้างแบบจำลองทางคณิตศาสตร์สำหรับ I/O ของพื้นที่จัดเก็บข้อมูล, ความจุเครือข่าย และกลไกการกู้คืนฐานข้อมูล

ด้วยการสร้างค่าพื้นฐานของอัตราการสร้างล็อก, การทำความเข้าใจระยะต่างๆ ของการกู้คืนฐานข้อมูล และการนำการทดสอบอัตโนมัติมาใช้ผ่านแพลตฟอร์มที่แข็งแกร่งอย่าง CloudSave ทีมไอทีจะสามารถรับประกัน SLA การกู้คืนจากภัยพิบัติได้อย่างมั่นใจ จำไว้ว่าในโลกของการดูแลระบบฐานข้อมูล ความหวังไม่ใช่กลยุทธ์ และการสำรองข้อมูลที่ไม่ได้ทดสอบคือความเสี่ยง

เรียนรู้วิธีที่วิศวกร DevOps และ DBA สามารถคำนวณ ทดสอบ และเพิ่มประสิทธิภาพ RTO และ RPO สำหรับฐานข้อมูลที่สำคัญต่อภารกิจได้อย่างแม่นยำ โดยใช้กลไกการกู้คืนขั้นสูง เครื่องมือ CLI และการทดสอบอัตโนมัติ

หมวดหมู่