บทที่ 13 · Part 3 — Scale & Reliability

Multi-AZ, Multi-Region & DR

RTO/RPO, active-active กับ active-passive, การ failover ฐานข้อมูล, backup ที่กู้ได้จริง และ game day

"เราต้องทำ multi-region" เป็นข้อเสนอที่มักถูกยอมรับเร็วเกินไป หลายทีม ลด availability ของตัวเองด้วยการไป multi-region เพราะความซับซ้อนที่เพิ่มขึ้นล้มบ่อยกว่าที่ region เดียวเคยล้ม บทนี้คือวิธีคุยเรื่องนี้ด้วยตัวเลขและคำถามที่ถูก

จบบทนี้คุณจะ

  • ใช้คำ RTO, RPO, failure domain ได้ถูกต้อง
  • เลือก topology ได้ตามความจำเป็นจริง ไม่ใช่ตามความอยาก
  • รู้ว่าทำไม replication ไม่ใช่ backup
  • รู้ว่า RTO จริงของคุณคือเวลาที่วัดได้จากการ restore ครั้งล่าสุด ไม่ใช่ตัวเลขในเอกสาร
  • รัน game day ที่ให้ action item ออกมาได้

คำศัพท์ที่จะถูกถาม

คำความหมายผลต่อ design
RTO (Recovery Time Objective)ล่มได้นานที่สุดเท่าไหร่กำหนดว่าต้องมี failover automation ระดับไหน
RPO (Recovery Point Objective)เสียข้อมูลได้ย้อนหลังเท่าไหร่ เป็นหน่วยเวลาRPO 0 บังคับให้ต้องมี synchronous replication
Failure domainชุดของสิ่งที่ล้มพร้อมกันrack, AZ, region, cloud account, certificate, config push, shared library version, deployment pipeline, vendor

Failure domain ที่คนลืมนับ

ทีมส่วนใหญ่นับแค่ rack/AZ/region แต่ failure domain ที่ทำให้ redundancy กลายเป็นนิยายมักไม่ใช่เรื่องกายภาพ:

  • Certificate ใบเดียวกัน หมดอายุพร้อมกันทุก replica
  • Config push ชุดเดียวกัน ไปถึงทุก node ใน 30 วินาที
  • Library version เดียวกัน ที่มี bug เดียวกัน
  • Deployment pipeline เดียวกัน ที่ deploy โค้ดเสียไปทุกที่พร้อมกัน
  • Vendor รายเดียวกัน ที่ล่มทั้ง region ของเขา

ทางแก้: ทยอย rollout config และ certificate และ map failure domain ออกมาเป็นตารางในเอกสาร design

เลือก topology

TopologyRTO / RPOความซับซ้อนประเมินอย่างซื่อสัตย์
Single AZชั่วโมง / ชั่วโมงง่ายมากไม่รับได้สำหรับบริการทางการเงินบน production
Multi-AZ, region เดียววินาที–นาที / 0ปานกลาง; ส่วนใหญ่ managed ให้แล้วคำตอบที่ถูกสำหรับระบบส่วนใหญ่ — synchronous replication ใน region เดียวเสียแค่ ~1–2 ms เอาอันนี้แล้วหยุด
Multi-region, warm standbyนาที–ชั่วโมง / วินาที–นาทีสูงสมเหตุสมผลเมื่อมีข้อกำหนด DR จาก regulator · ส่วนที่ยากไม่ใช่ replication — คือการซ้อม failover แผน DR ที่ไม่เคยทดสอบคือเอกสาร ไม่ใช่ความสามารถ
Multi-region active-active~0 / ~0 สำหรับ readสูงมากทำเฉพาะเมื่อจำเป็นจริง · ต้องแก้ปัญหา write conflict และสำหรับเงิน คำตอบที่ซื่อสัตย์มักคือ "1 region เป็นเจ้าของ 1 account" (partition ownership) ไม่ใช่ multi-master จริงๆ

Multi-region ไม่ใช่การอัปเกรด reliability โดยปริยาย

การเพิ่ม region ที่ 2 เพิ่ม: replication lag ที่คุณต้องคิดถึงทุกที่, ความเสี่ยง split-brain, ค่าใช้จ่าย 2 เท่า, เรื่อง deployment ที่ยากกว่ามาก, และ cross-region latency ในทุกเส้นทางที่เป็น synchronous

ก่อนเสนอ ตอบ 3 คำถามนี้อย่างซื่อสัตย์:

  1. failure แบบไหนโดยเฉพาะ ที่อันนี้ป้องกันได้แต่ multi-AZ ป้องกันไม่ได้
  2. ใครจะรันและทดสอบ failover ทุกเดือน
  3. สำหรับการเคลื่อนย้ายเงิน — region ไหนเป็น authoritative สำหรับ account หนึ่งๆ และ region อีกฝั่งปฏิเสธการเขียนได้อย่างไร

ถ้าตัวขับคือข้อผูกพัน DR ตามกฎ ให้พูดออกมาตรงๆ ว่า "เราทำเพราะข้อกำหนด X จาก [แหล่งที่มา]" แล้วออกแบบ topology ที่ถูกที่สุดที่ตอบข้อนั้น — นั่นเป็นเหตุผลที่ชอบธรรม และการเรียกชื่อมันป้องกัน scope creep ไปเป็น active-active

ถ้าต้องทำ multi-region สำหรับเงิน — partition ownership

Account ownership แบบชัดเจน (ปลอดภัยกว่า multi-master มาก)

acc_A00000 - acc_M99999   -> region SG เป็นเจ้าของ (เขียนได้)
acc_N00000 - acc_Z99999   -> region TH เป็นเจ้าของ (เขียนได้)

region ที่ไม่ใช่เจ้าของ:
  - อ่านได้จาก replica (บอกผู้ใช้ว่าข้อมูลอาจช้า X วินาที)
  - เขียน -> ปฏิเสธด้วย 409 หรือ proxy ไปหาเจ้าของ
  - ห้าม "เขียนแล้วค่อย merge ทีหลัง" กับเงิน

การย้ายเจ้าของ (ตอน failover):
  1. หยุดรับ write ที่ region เดิม (fence)
  2. ยืนยันว่า replica ตามครบแล้ว (LSN/GTID ตรงกัน)
  3. เปลี่ยน shard map ให้ region ใหม่เป็นเจ้าของ
  4. ค่อยเปิดรับ write
--> ขั้นที่ 1 กับ 2 คือสิ่งที่ทำให้ split-brain เป็นไปไม่ได้
    และเป็น 2 ขั้นที่ automated failover มักข้าม

Automated failover ข้าม region เป็นความเสี่ยง ไม่ใช่แค่ฟีเจอร์

incident ของ GitHub ปี 2018 (บทที่ 12) คือกรณีตัวอย่าง — network blip 43 วินาทีทำให้ failover ทำงาน แล้ว 2 ฝั่งรับ write ที่แยกทางกัน

สำหรับเงิน failover ข้าม region ควรต้องมีคนตัดสินใจ โดยมีข้อมูลว่า replication lag เท่าไหร่และมีรายการค้างเท่าไหร่ ไม่ใช่ automation ที่ trigger จาก health check เพียงลำพัง

Backup — รากฐานที่ไม่หวือหวา

Replication ไม่ใช่ backup

Replication คัดลอก DELETE FROM accounts ของคุณไปทุก replica อย่างซื่อสัตย์ ภายในไม่กี่มิลลิวินาที

สิ่งที่ต้องมีจริง:

สิ่งที่ต้องมีเหตุผล
Point-in-time recoveryกู้กลับไปยังวินาทีก่อนที่คำสั่งผิดจะรัน
เก็บใน account / credential domain แยกcredential ของ production ที่ถูกเจาะต้องลบ backup ไม่ได้
Immutability / object-lock ถ้ามีให้ใช้กัน ransomware และกันการลบโดยไม่ตั้งใจ
Encryptionทั้ง at rest และ in transit และจัดการ key แยกจากข้อมูล

Backup ที่ไม่เคย restore คือสมมติฐาน ไม่ใช่ความสามารถ

จัดตาราง restore test จริง — restore ลง environment ที่แยกออกมา, ยืนยันจำนวนแถวและ checksum ของตารางที่สำคัญ, และบันทึกว่าใช้เวลานานเท่าไหร่

ระยะเวลาที่วัดได้นั้นคือ RTO จริงของคุณ ไม่ว่าเอกสารนโยบายจะเขียนว่าอะไร

ทดสอบ restore ของของที่ยุ่งยากด้วย

  • ตารางเดียว (เวลาแก้ข้อมูลผิดจุดเดียว)
  • ข้อมูลของลูกค้าคนเดียว — คุณจะต้องใช้สำหรับคำขอตาม PDPA หรือกรณีข้อพิพาท
  • Secret และ config ไม่ใช่แค่ฐานข้อมูล
Restore test log ที่ควรมี (เก็บเป็น artefact ให้ auditor ดูได้)

วันที่           2026-07-15
Backup ที่ใช้    2026-07-14 23:00 UTC (point-in-time -> 2026-07-15 02:17)
Environment      dr-restore-test (isolated VPC, ไม่มี network ออก)
เวลาที่ใช้        1 ชม. 48 นาที   <-- นี่คือ RTO จริง
ผลการตรวจ        accounts        row count ตรง, checksum ตรง
                 ledger_entries  row count ตรง, sum(amount) ตรง
                 transfers       row count ตรง
ปัญหาที่เจอ       secret ของ rail adapter ไม่อยู่ใน backup -> action item
ผู้ทำ / ผู้ตรวจ   <ชื่อ> / <ชื่อ>

Chaos และ game day

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

1. Tabletop ก่อน (ฟรี)

รวมทีม 1 ชั่วโมง

"ตอนนี้บ่าย 2 ของวันที่ 25 ฐานข้อมูล primary เพิ่ง failover และ transfer 20% ค้างอยู่ที่ PENDING เริ่มเลย"

ดูว่าใช้เวลานานแค่ไหนกว่าจะหา dashboard ที่ถูกเจอ ทุกช่องว่างคือ action item

2. Fault injection ใน non-prod

kill pod · เพิ่ม latency 500 ms · เติม disk ให้เต็ม · ทำให้ certificate หมดอายุ · ให้ dependency ตอบ 503 · ชี้ service ไปที่ read-only replica

3. Production แบบมีขอบเขตและประกาศล่วงหน้า

Fault injection บน production ในองค์กรที่ถูกกำกับดูแล

ทำได้เฉพาะเมื่อมีครบทุกข้อ: เจ้าของ, สมมติฐานที่จะทดสอบ, ขอบเขต blast radius, kill switch, และ stakeholder ที่เห็นด้วย

และต้องมี การอนุมัติอย่างชัดแจ้งจากผู้รับผิดชอบที่มีอำนาจ — ขอเป็นลายลักษณ์อักษร

ห้ามรัน experiment ที่อาจเคลื่อนย้ายหรือทำให้เงินของลูกค้าหายเด็ดขาด

อ้างอิง: Principles of Chaos Engineering

Lab 13 — Game day

ส่วน A — เตรียม (20 นาที) เลือก 1 scenario จาก failure table ของคุณ กำหนดบทบาท: incident commander, comms, investigator 2 คน, และ 1 คนเล่นเป็น "dashboard" (คนนี้ตอบได้แค่สิ่งที่ทีมมองเห็นได้จริงในวันนี้)

ส่วน B — รัน (30 นาที) จับเวลาเข้ม 30 นาที ห้ามเกิน

ส่วน C — Debrief (30 นาที) ให้คะแนน 3 ตัว:

ตัวชี้วัดความหมาย
นาทีถึงการตรวจพบถ้าไม่มีใครรู้จนลูกค้าโทรมา นั่นคือช่องว่างที่ใหญ่ที่สุด
นาทีถึงสมมติฐานที่ถูกวัดว่า observability ชี้ทางได้จริงไหม
จำนวนครั้งที่พูดว่า "เราไม่มี metric นั้น"ทุกครั้งคือ action item 1 ข้อ

ส่วน D — ผูกมัด (20 นาที) เปลี่ยนช่องว่างเป็นรายการเปลี่ยนแปลง 5 ข้อที่มีเจ้าของ โดย1 ข้อต้องเป็น alert บน business outcome และ 1 ข้อต้องเป็น runbook ที่คุณเขียนจริงในสัปดาห์นี้

Checklist DR

  • RTO และ RPO เขียนไว้เป็นตัวเลข และใครเป็นคนกำหนด
  • Multi-AZ พร้อม synchronous standby (RPO 0) สำหรับข้อมูลการเงิน
  • Failure domain map ออกมาเป็นตาราง รวม certificate, config push, pipeline, vendor
  • Config และ certificate rollout แบบทยอย ไม่ใช่พร้อมกันทั้งหมด
  • Backup อยู่ใน credential domain แยก, immutable, encrypted
  • มี restore test ที่ทำจริงในรอบ 6 เดือน พร้อมเวลาที่วัดได้
  • ทดสอบ restore ของตารางเดียว, ของลูกค้าคนเดียว, และของ secret/config แล้ว
  • ถ้ามี multi-region — ตอบได้ว่า region ไหนเป็นเจ้าของ account ไหน และ region อื่นปฏิเสธ write อย่างไร
  • Failover ข้าม region สำหรับเงินต้องมีคนตัดสินใจ ไม่ใช่ automation ล้วน
  • เคยรัน game day และมี action item ที่ปิดแล้ว

สรุปบทนี้

Multi-AZ + synchronous standby คือคำตอบสำหรับระบบส่วนใหญ่ — เอาแล้วหยุด · multi-region เพิ่ม failure mode มากกว่าที่ลบ ให้ตอบ 3 คำถามให้ได้ก่อน · สำหรับเงินใช้ partition ownership ไม่ใช่ multi-master · replication ไม่ใช่ backup · RTO จริงคือเวลาที่วัดได้จาก restore ครั้งล่าสุด · และ game day ที่ดีวัดกันที่จำนวนครั้งที่ทีมพูดว่า "เราไม่มี metric นั้น"