Distributed Systems · บทที่ 9 จาก 11

Replication

การมีสำเนาข้อมูลหลายชุดแก้ปัญหาทั้ง fault tolerance และ scalability ได้ในคราวเดียว — แต่ทันทีที่มีมากกว่าหนึ่งสำเนา คำถาม "ใครถืออันที่ถูกต้องจริง" ก็ตามมา บทนี้คือการสำรวจ trade-off ที่ไม่มีทางเลี่ยงได้ระหว่าง consistency, availability และ performance

📚
อิงเนื้อหาจาก Coulouris บทที่ 15 (Replication) — Eventual Consistency ในบทนี้คือรากฐานทางทฤษฎีของหัวข้อเดียวกันในวิชา Network Computing หัวข้อที่ 4 (Microservice Patterns)

1ทำไมต้อง Replicate ข้อมูล

เหตุผลรายละเอียด
Fault toleranceถ้าสำเนาหนึ่งล่ม ยังมีสำเนาอื่นให้บริการต่อได้ — ระบบทนต่อความล้มเหลวได้มากขึ้นตามจำนวนสำเนา
Performance/Scalabilityกระจาย read request ไปยังหลายสำเนา (โดยเฉพาะสำเนาที่อยู่ใกล้ผู้ใช้ทางภูมิศาสตร์) ลดภาระที่ต้องกระจุกอยู่ที่เครื่องเดียว
ราคาที่ต้องจ่าย
เมื่อมีหลายสำเนา การเขียนข้อมูลใหม่ต้องกระจายไปให้ครบทุกสำเนา (หรืออย่างน้อยพอที่จะถือว่า "สำเร็จ") — ถ้าทำสิ่งนี้ให้เกิดขึ้นทันทีทุกครั้ง ระบบจะช้าลงและเปราะบางขึ้น (ต้องรอทุกสำเนาตอบ) นี่คือจุดเริ่มต้นของ trade-off ที่ทั้งบทนี้พยายามคลี่คลาย

2Replication Model พื้นฐาน

Passive (Primary-Backup) Replication
มี replica เดียวที่เป็น primary รับ request ทั้งหมดจาก client ประมวลผลแล้วส่งผลลัพธ์ที่เปลี่ยนแปลงไปอัปเดตยัง backup replica ทุกตัว — ถ้า primary ล่ม ต้องมีกระบวนการเลือก backup ตัวหนึ่งขึ้นเป็น primary ใหม่ (เชื่อมโยงกับ Election Algorithm ในบทที่ 10)
Active Replication
ทุก replica มีสถานะเท่ากัน (ไม่มี primary) — request ถูกส่งไปยังทุก replica พร้อมกันด้วยtotal order multicast (ดูบทที่ 2 และ 10) แต่ละ replica ประมวลผล request แบบเดียวกันอย่างอิสระ ต้องได้ผลลัพธ์เหมือนกันทุกตัว (state machine replication) เพราะได้รับ request ตามลำดับเดียวกันและเป็น deterministic operation
มิติPassiveActive
ความซับซ้อนง่ายกว่า — มีจุดตัดสินใจเดียว (primary)ซับซ้อนกว่า — ต้องการ total order multicast และ operation ต้อง deterministic
Failoverต้องเลือก primary ใหม่เมื่อ primary ล่ม (มี downtime สั้น ๆ)ไม่มีจุดเดียวที่เป็นคอขวด — replica ที่เหลือทำงานต่อได้ทันที

3Quorum-Based (Voting) Protocol

แนวคิด
ไม่ต้องรอให้ทุกสำเนาตอบรับการอ่าน/เขียน — กำหนดจำนวนเสียงขั้นต่ำ (quorum) ที่ต้องได้เพื่อให้ operation นั้นถือว่าสำเร็จ
เงื่อนไข Quorum ที่ป้องกันข้อมูลขัดแย้งกัน
ให้ N = จำนวนสำเนาทั้งหมด, R = จำนวนสำเนาที่ต้องอ่านสำเร็จ (read quorum), W = จำนวนสำเนาที่ต้องเขียนสำเร็จ (write quorum)
R + W > N (รับประกันว่าทุกการอ่านจะเจอสำเนาล่าสุดอย่างน้อยหนึ่งชุด) W + W > N (รับประกันว่าสองการเขียนจะไม่เกิดพร้อมกันโดยไม่รู้ตัว)

ตัวอย่าง: N=5, W=3, R=3 — R+W=6 > 5 ดังนั้นทุกครั้งที่อ่าน อย่างน้อยหนึ่งในสำเนาที่อ่านได้จะเป็นสำเนาที่เพิ่งถูกเขียนล่าสุด (เพราะเซตของ R replica และเซตของ W replica ต้องมี overlap กันอย่างน้อยหนึ่งตัวเสมอในทางคณิตศาสตร์)

ปรับ R และ W ได้ตามต้องการ
W น้อย (R มาก) = เขียนเร็ว อ่านช้ากว่า เหมาะกับ workload ที่อ่านบ่อยกว่าเขียนมาก — W มาก (R น้อย) = เขียนช้ากว่า อ่านเร็ว เหมาะกับ workload ตรงข้าม — นี่คือกลไกที่ Cassandra และ DynamoDB ให้ผู้ใช้ปรับ consistency level ต่อ query ได้จริง

4Gossip Architecture: การกระจายอัปเดตแบบ Eventually Consistent

แนวคิด
Replica manager แต่ละตัวไม่รอส่งอัปเดตให้ทุกตัวพร้อมกันทันที แต่ค่อย ๆ "ซุบซิบ" (gossip) แลกเปลี่ยนข้อมูลกับ replica manager ตัวอื่นเป็นคู่ ๆ ทีละคู่แบบสุ่มหรือเป็นรอบ ๆ ทำให้ update แพร่กระจายไปทั่วทั้งกลุ่มในที่สุด (eventually) โดยไม่ต้องมี process ใดรู้จักหรือติดต่อกับทุก process อื่นโดยตรง

แต่ละ replica manager เก็บ timestamp table ของตัวเอง (แนวคิดคล้าย vector clock ในบทที่ 7) เพื่อรู้ว่าตนเองมีอัปเดตล่าสุดจากแต่ละ replica อื่นถึงจุดไหนแล้ว — เมื่อ gossip กับ replica อื่น จะแลกเฉพาะอัปเดตที่อีกฝ่ายยังไม่มี

Trade-off ของ Gossip
Gossip สเกลได้ดีมาก (ไม่ต้องมี broadcast แบบเต็มรูปแบบ) ทนต่อความล้มเหลวของบาง node ได้สูง แต่แลกมาด้วยความล่าช้าก่อนที่อัปเดตจะไปถึงทุก replica ครบ (propagation delay) — ระหว่างนั้น replica ต่างตัวอาจตอบค่าต่างกันชั่วคราว

5CAP Theorem: กรอบคิดที่รวมทุกอย่างในบทนี้เข้าด้วยกัน

ทฤษฎีบทของ Eric Brewer
เมื่อเกิด network partition (การเชื่อมต่อระหว่าง replica ขาดออกจากกัน) ระบบ replicate ข้อมูลเลือกได้แค่อย่างใดอย่างหนึ่งระหว่าง:
  • Consistency — ทุก replica ต้องตอบค่าตรงกัน (ยอมปฏิเสธ request ถ้าไม่แน่ใจว่าค่าตรงกันจริง)
  • Availability — ทุก request ต้องได้รับคำตอบเสมอ (ยอมให้คำตอบที่อาจไม่ตรงกับ replica อื่น)
Partition tolerance ไม่ใช่ตัวเลือก — เครือข่ายจริงเกิด partition ได้เสมอ (สอดคล้องกับ asynchronous distributed system ในบทที่ 1) ระบบทุกระบบต้องทนต่อมันไม่ทางใดก็ทางหนึ่ง คำถามจึงเหลือแค่ตอนที่ partition เกิดขึ้นจริง จะเลือก C หรือ A
ทางเลือกตัวอย่างระบบผล
CPEtcd, ZooKeeper (ใช้ consensus แบบบทที่ 10)เมื่อ partition เกิด บาง node จะปฏิเสธ request แทนที่จะตอบค่าที่อาจไม่ตรงกัน
APCassandra (เมื่อตั้ง consistency level ต่ำ), DynamoDBทุก node ยังตอบ request ได้เสมอ แต่ค่าที่ตอบอาจไม่ตรงกันชั่วคราว (eventual consistency)
เชื่อมโยงกับ Network Computing
Eventual Consistency ที่สอนใน Network Computing หัวข้อที่ 4 คือผลโดยตรงของการเลือก AP ใน CAP theorem — ตอนนั้นอธิบายไว้ในระดับ pattern (ผลจาก Database per Service + Async Messaging) บทนี้อธิบายรากทางทฤษฎีว่าทำไมการเลือกนั้นถึงจำเป็นไม่ใช่แค่ทางเลือกเชิง design
ข้อควรระวังในการใช้ CAP
CAP มักถูกเข้าใจผิดว่า "ต้องเลือกทิ้งอย่างใดอย่างหนึ่งตลอดเวลา" — จริง ๆ แล้วเป็นทางเลือกที่เกิดขึ้นเฉพาะตอน partition เกิดขึ้นจริงเท่านั้น ในสภาวะปกติ (ไม่มี partition) ระบบให้ได้ทั้ง consistency และ availability พร้อมกัน — กรอบคิดที่ละเอียดกว่า CAP คือ PACELC ซึ่งเสริมว่า แม้ไม่มี partition ก็ยังต้องเลือกระหว่าง Latency กับ Consistency อยู่ดี (เพราะการรอ replica ยืนยันตรงกันย่อมช้ากว่าการไม่รอ)

6Replication ไม่ใช่ Backup และไม่ใช่ Sharding

คำสามคำนี้มักถูกพูดรวมกันเพราะต่างก็เกี่ยวข้องกับการมีข้อมูลหลายที่ แต่แก้คนละปัญหา การแยกให้ชัดตั้งแต่ต้นช่วยลดการออกแบบผิดประเภทได้มาก

แนวคิดคำถามที่พยายามตอบภาพเปรียบเทียบ
Replicationถ้าเครื่องหนึ่งล่มหรือรับงานไม่ไหว จะมีสำเนาอื่นรับช่วงได้อย่างไรถ่ายเอกสารฉบับเดียวกันไว้หลายสาขา
Backupถ้าข้อมูลถูกลบ เขียนทับ หรือเสียหายไปแล้ว จะย้อนกลับไปหาอดีตได้อย่างไรเก็บเอกสารคนละรุ่นไว้ในห้องนิรภัย
Shardingถ้าข้อมูลทั้งหมดใหญ่เกินกว่าจะอยู่ในเครื่องเดียว จะแบ่งความรับผิดชอบอย่างไรแยกแฟ้มลูกค้าตามจังหวัดให้แต่ละสาขาดูแล
สำเนาที่ผิดก็ยังเป็นสำเนา
ถ้าผู้ใช้เผลอลบข้อมูลและคำสั่งลบถูก replicate ไปครบทุก replica ระบบถือว่าทำงานถูกต้อง แต่ข้อมูลก็หายจากทุกชุดอยู่ดี Replication จึงช่วยเรื่อง availability แต่ไม่แทน versioned backup, point-in-time recovery และการซ้อมกู้คืนจริง

7Consistency Model: คำว่า “ตรงกัน” มีหลายระดับ

ระบบไม่จำเป็นต้องรับประกันความสอดคล้องแบบเดียวให้ทุกงาน ธนาคารอาจต้องเข้มงวดกับยอดเงิน แต่หน้าแสดงจำนวนผู้ชมวิดีโออาจยอมคลาดเคลื่อนชั่วคราวได้ ประเด็นจึงไม่ใช่ว่า consistency มากหรือน้อยแบบลอย ๆ แต่คือ ผู้ใช้สังเกตเห็นพฤติกรรมอะไรได้บ้าง

Linearizability

แต่ละ operation ดูเหมือนเกิดขึ้นทันที ณ จุดหนึ่งระหว่างเวลาที่ส่ง request กับเวลาที่ได้รับ response ถ้า A เขียนเสร็จก่อน B เริ่มอ่าน B ต้องเห็นค่าของ A เป็นโมเดลที่เข้าใจง่าย แต่ต้องประสานงานมากและไวต่อ network partition

Sequential Consistency

ทุก process เห็นลำดับ operation เดียวกัน แต่ลำดับนั้นไม่จำเป็นต้องตรงกับเวลาจริงบนผนัง จึงอ่อนกว่า linearizability ตรงที่ operation ซึ่งเกิดก่อนในโลกจริงอาจถูกจัดลำดับทีหลังได้ ถ้ายังไม่ขัดกับลำดับของแต่ละ process

Causal Consistency

เหตุการณ์ที่มีความสัมพันธ์เชิงเหตุและผลต้องถูกเห็นตามลำดับ เช่น โพสต์ต้องปรากฏก่อนข้อความตอบโพสต์นั้น ส่วนเหตุการณ์อิสระจากกันอาจปรากฏคนละลำดับได้ ช่วยลดการประสานงานโดยยังรักษาความหมายที่ผู้ใช้คาดหวัง

Eventual Consistency

ถ้าหยุดเขียนข้อมูลใหม่และเครือข่ายกลับมาปกติ ทุก replica จะค่อย ๆ ลงเอยที่ค่าเดียวกัน คำว่า eventually ไม่ได้บอกว่าจะใช้เวลากี่วินาที และไม่ได้บอกว่าระหว่างทางผู้ใช้จะเห็นอะไร จึงต้องระบุ session guarantee เพิ่มเติม

Session Guarantee: สัญญาเล็ก ๆ ที่ทำให้ผู้ใช้ไม่งง

ภาพเปรียบเทียบ
ร้านอาหารหลายสาขามีเมนูฉบับสำเนา Linearizability คือทุกสาขาต้องเปลี่ยนราคาพร้อมกันก่อนรับลูกค้าคนต่อไป ส่วน eventual consistency คือแต่ละสาขาค่อย ๆ ได้เมนูใหม่ แต่ต้องมีกติกาว่าลูกค้าที่เพิ่งได้รับส่วนลดจากสาขาหนึ่งจะไม่กลับมาเห็นราคาที่แพงกว่าเพียงเพราะคำขอครั้งถัดไปถูกส่งไปอีกสาขา

8Primary–Backup แบบลงรายละเอียด

คำว่า primary–backup ดูเหมือนง่าย: ส่งทุกคำสั่งไปที่ primary แล้วคัดลอกไป backup แต่รายละเอียดว่า “ตอบ client ตอนไหน” เปลี่ยนความหมายของความทนทานโดยตรง

  1. Client ส่งคำสั่งเขียนไปที่ primary
  2. Primary บันทึกคำสั่งลง log ของตนเองและส่งไปยัง backup
  3. Backup บันทึกหรือประมวลผล แล้วตอบรับกลับมา
  4. Primary จึงถือว่าคำสั่ง commit และตอบ client

ถ้า primary ตอบตั้งแต่ข้อ 2 latency ต่ำลง แต่ primary อาจล่มก่อน backup ได้รับข้อมูล Client ได้ยินคำว่า “สำเร็จ” แล้วข้อมูลกลับหายหลัง failover เรียกว่า acknowledged-write loss หากรอ backup ทุกตัว ระบบทนต่อข้อมูลหายมากขึ้นแต่ replica ที่ช้าเพียงตัวเดียวทำให้ทั้งระบบช้า วิธีที่ใช้จริงจึงมักรอเพียง quorum หรือ replica ตามจำนวนที่กำหนด

Split brain
อันตรายกว่าการไม่มี leader คือมี leader สองตัวพร้อมกัน เปรียบเหมือนร้านสองสาขาต่างเชื่อว่าตนเป็นสำนักงานใหญ่และออกเลขใบเสร็จชุดเดียวกัน การมี election อย่างเดียวไม่พอ ต้องมี term, epoch หรือ fencing token เพื่อพิสูจน์ว่า leader รุ่นเก่าไม่มีสิทธิ์เขียนต่อแล้ว

9Multi-Leader และ Leaderless Replication

Multi-Leader: เขียนได้หลายศูนย์ข้อมูล

ระบบที่กระจายข้ามทวีปอาจตั้ง leader หนึ่งตัวต่อภูมิภาค ผู้ใช้เขียนไปยัง leader ที่ใกล้ ทำให้ latency ต่ำและยังทำงานในพื้นที่ของตนได้เมื่อเส้นทางข้ามทวีปขาด แต่การเขียนพร้อมกันคนละภูมิภาคอาจขัดแย้งกัน จึงต้องกำหนดวิธีตรวจจับและรวมผลอย่างชัดเจน

Leaderless: ไม่มีใครเป็นเจ้าของคำตอบคนเดียว

ระบบแบบ Dynamo ให้ coordinator ส่งการเขียนไป replica หลายตัวโดยไม่ตั้ง primary ถาวร การอ่านอาจได้หลาย version แล้วเลือกค่าล่าสุดหรือรวมผล ข้อดีคือรับงานต่อได้แม้บาง node ล่ม ข้อเสียคือความซับซ้อนย้ายจาก leader ไปอยู่ที่ versioning, conflict resolution และกระบวนการซ่อมสำเนา

รูปแบบข้อดีสิ่งที่ต้องระวัง
Single leaderลำดับการเขียนชัด เข้าใจง่ายfailover, leader bottleneck, write latency ข้ามภูมิภาค
Multi-leaderเขียนใกล้ผู้ใช้และทน partition ระหว่างภูมิภาคwrite conflict และ topology การ replicate
Leaderlessavailability สูง ไม่มี leader ถาวรstale read, sibling versions และ repair

10Quorum ในโลกจริง: Sloppy Quorum และการซ่อมข้อมูล

สมการ R + W > N ให้ภาพทางคณิตศาสตร์ที่ดี แต่สมมติว่า quorum ที่อ่านและเขียนมาจากชุด replica เดียวกันเสมอ ในระบบจริง node เจ้าของข้อมูลอาจล่ม ระบบจึงยอมฝากข้อมูลไว้กับ node อื่นชั่วคราว เรียกว่า sloppy quorum ความพร้อมใช้งานดีขึ้น แต่เซตอ่านกับเซตเขียนอาจไม่ทับกันตามที่คิด จึงไม่ได้ linearizability มาโดยอัตโนมัติ

เหมือนการตรวจสต็อก
Hinted handoff คือฝากพัสดุไว้โกดังข้างเคียงระหว่างโกดังเจ้าของปิด Read repair คือพบยอดไม่ตรงกันตอนลูกค้ามาถามแล้วแก้ทันที ส่วน anti-entropy คือการตรวจนับสต็อกตามรอบ แม้ยังไม่มีลูกค้ามาพบความผิดปกติ

11ความขัดแย้ง: ตรวจอย่างไร และรวมอย่างไร

Timestamp จากนาฬิกาจริงดูสะดวก แต่เครื่องแต่ละตัวเดินไม่ตรงกันและเวลาย้อนกลับได้ การเลือก last-write-wins จึงอาจทิ้งข้อมูลที่มีความหมายเพียงเพราะนาฬิกาเครื่องหนึ่งเร็วกว่า Vector clock หรือ version vector บอกได้ว่ารุ่นหนึ่งสืบต่อจากอีกรุ่นหรือเป็น concurrent siblings แต่สุดท้ายระบบยังต้องตอบว่าเมื่อพบ siblings แล้วจะทำอย่างไร

วิธีเหมาะกับข้อจำกัด
Last-write-winsค่าที่ทับกันได้ เช่น cache หรือสถานะชั่วคราวข้อมูลหายเงียบและพึ่งพา timestamp
รวมโดย applicationตะกร้าสินค้า เอกสาร หรือข้อมูลที่มีกฎธุรกิจต้องเก็บหลาย version และเขียนกฎเฉพาะโดเมน
CRDTข้อมูลที่ออกแบบ operation ให้ merge ได้โดยไม่ขัดกันไม่ใช่โครงสร้างข้อมูลทุกชนิดจะแปลงเป็น CRDT ได้ง่าย

CRDT ใช้กฎทางคณิตศาสตร์ทำให้ replica รวมผลคนละลำดับแล้วได้คำตอบเดียวกัน เช่น grow-only counter เพิ่มได้อย่างเดียว หรือ observed-remove set ที่เก็บบริบทของการเพิ่มและลบ จุดสำคัญไม่ใช่ว่า CRDT “ไม่มี conflict” แต่เป็นการย้ายกฎแก้ conflict เข้าไปอยู่ในชนิดข้อมูลตั้งแต่ตอนออกแบบ

12Gossip และ Anti-Entropy: ข่าวลือที่มีวินัย

คำว่า gossip ทำให้นึกถึงการส่งข่าวแบบไร้แบบแผน แต่ protocol จริงควบคุมว่าเลือก peer อย่างไร ส่ง digest อะไร และจำกัดข้อมูลต่อรอบเท่าใด ถ้าแต่ละ node สุ่มคุยกับ peer จำนวนเล็กน้อย ข่าวจะกระจายแบบทวีคูณ ในไม่กี่รอบ node ส่วนใหญ่ก็รับรู้ โดยไม่ต้องให้เครื่องกลาง broadcast ไปหาทุกคน

ต้องวัด convergence time, fanout, payload size และผลของ node ที่เข้าออกบ่อย ไม่ใช่เพียงบอกว่า “เดี๋ยวข้อมูลก็ตรงกัน” เพราะคำว่าเดี๋ยวอาจหมายถึง 200 มิลลิวินาทีหรือ 20 นาที ซึ่งส่งผลต่อผู้ใช้ต่างกันมาก

13CAP และ PACELC แบบไม่ใช้เป็นคำขวัญ

CAP พูดถึงพฤติกรรมเมื่อเครือข่ายแบ่งฝั่งและข้อความข้ามฝั่งส่งไม่ถึง ถ้าแต่ละฝั่งยังตอบการเขียนต่อ ระบบรักษา availability แต่ไม่อาจรับประกัน linearizability เพราะสองฝั่งไม่รู้การตัดสินใจของกันและกัน ถ้าต้องรักษา consistency อย่างเข้ม ฝั่งที่ไม่มี quorum ต้องหยุดรับบางคำขอ

PACELC เติมอีกครึ่งหนึ่งว่า ถ้ามี Partition ให้เลือกระหว่าง Availability กับ Consistency; Else เมื่อเครือข่ายปกติ ก็ยังเลือกระหว่าง Latency กับ Consistency การรอ replica ไกลเพื่อยืนยันค่าล่าสุดย่อมช้ากว่าตอบจากสำเนาใกล้ ๆ ดังนั้น trade-off ไม่ได้หายไปหลัง partition จบ

อย่าติดป้ายฐานข้อมูลทั้งก้อนว่า CP หรือ AP
ระบบเดียวกันอาจเลือก consistency ต่อ operation ได้ เช่น อ่านแบบ local สำหรับหน้า feed แต่ใช้ quorum เข้มสำหรับการจองสินค้า ควรถามให้ละเอียดว่า guarantee ใด ภายใต้ failure แบบไหน และ configuration ใด

14จาก Replication ไปสู่ Consensus

Replication ตอบว่า “จะทำสำเนาสถานะอย่างไร” ส่วน consensus ตอบว่า “หลาย node จะตกลงลำดับคำสั่งเดียวกันได้อย่างไร” State machine replication นำสองเรื่องมาประกบกัน: ใช้ consensus ตกลง log แล้วให้ state machine ที่ deterministic ประมวลผล log เดียวกันตามลำดับเดียวกัน ทุก replica จึงควรได้สถานะเดียวกัน

แต่ไม่ควรใช้ consensus กับทุกข้อมูลเพียงเพราะให้คำตอบชัด ค่าใช้จ่ายคือ latency, quorum dependency และความซับซ้อนในการดำเนินงาน ข้อมูลที่ merge ได้หรือยอม stale ได้อาจเหมาะกับ eventual consistency มากกว่า บทถัดไปจึงไม่ใช่คำตอบที่ “ดีกว่า” replication แต่เป็นเครื่องมือสำหรับส่วนที่ระบบต้องตกลงร่วมกันจริง ๆ

15กรณีศึกษา: ออกแบบระบบตะกร้าสินค้าหลายภูมิภาค

  1. ตั้ง invariant — การเพิ่มสินค้าควรไม่หาย การลบต้องนิยามว่าชนะการเพิ่มพร้อมกันหรือไม่ และจำนวนติดลบไม่ได้
  2. เลือกรูปแบบ — ใช้ multi-leader หรือ leaderless เพื่อให้ผู้ใช้เพิ่มสินค้าได้แม้เส้นทางข้ามภูมิภาคขาด
  3. เก็บ version context — แยกให้ได้ว่า update ใดเกิดสืบต่อกันและ update ใดเกิดพร้อมกัน
  4. กำหนด merge — รวมรายการโดย product ID พร้อมกฎเรื่องจำนวนและการลบ ไม่ใช้ last-write-wins แบบเหมารวม
  5. แยก checkout — ตอนชำระเงินจริง ความต้องการเปลี่ยนจาก availability ไปเป็นการตรวจ stock และ payment อย่างเข้มกว่าเดิม
กิจกรรมในชั้นเรียน
แบ่งกลุ่มออกแบบ replication ของระบบหนึ่ง เช่น คะแนนสอบ เวชระเบียน หรือจำนวน like ให้ระบุ consistency guarantee, failure ที่ยอมรับได้, ค่า R/W/N, วิธีแก้ conflict และหลักฐานที่ใช้พิสูจน์ว่าระบบทำตามสัญญา ห้ามตอบเพียงชื่อฐานข้อมูล เพราะชื่อผลิตภัณฑ์ไม่ใช่ design rationale

16สิ่งที่ควรวัดและคำถามก่อนนำขึ้นระบบจริง

ระบบ replication ที่ดีจึงไม่ได้วัดเพียงว่า replica “up” กี่ตัว แต่ต้องวัดว่าข้อมูลแต่ละชุดใหม่เพียงใด ตรงกันหรือไม่ และเมื่อไม่ตรงกันระบบรู้ตัวเร็วแค่ไหน

17Geo-Replication: สำเนาใกล้ผู้ใช้ แต่ไกลกันเอง

เมื่อ replica อยู่คนละภูมิภาค ประโยชน์คือผู้ใช้อ่านข้อมูลจากศูนย์ที่ใกล้และระบบยังให้บริการบางส่วนได้เมื่อทั้งภูมิภาคมีปัญหา แต่ speed of light ทำให้การยืนยันข้ามทวีปมีต้นทุนที่ลดด้วยการปรับโค้ดไม่ได้ เราจึงต้องจำแนกข้อมูลตามความต้องการแทนการใช้ policy เดียวทั้งระบบ

ข้อมูลแนวทางที่เป็นไปได้เหตุผล
ยอดคงเหลือหรือสิทธิ์ใช้งานHome region หรือ quorum ข้ามพื้นที่หลีกเลี่ยงการใช้สิทธิ์เกิน แม้เขียนช้าลง
Feed และจำนวนการชมLocal write + async replicationรับความคลาดเคลื่อนชั่วคราวได้และต้องตอบเร็ว
Profile ผู้ใช้Single writer ต่อผู้ใช้ + read replicasลด conflict โดยยังอ่านได้ทั่วโลก
Configuration สำคัญConsensus group ขนาดเล็กการเปลี่ยนไม่ถี่แต่ต้องเห็นลำดับเดียวกัน

ต้องกำหนดเรื่อง data residency ด้วย บางข้อมูล replicate ข้ามเขตอำนาจศาลไม่ได้ แม้ทางเทคนิคจะทำได้ง่าย ดังนั้น topology ของสำเนาเป็นทั้งการตัดสินใจด้าน latency, fault domain, ค่าใช้จ่าย และกฎระเบียบ

18Hot Key และ Replica ที่ไม่ได้ช่วยเท่ากัน

การมี replica หลายตัวช่วย read scaling เมื่อคำขอกระจายได้ แต่ hot key เช่นผลการแข่งขันนัดชิงหรือโพสต์ไวรัลอาจทำให้ทุกคนขอ key เดียวพร้อมกัน Replica แต่ละตัวจึงยังร้อนพร้อมกัน และถ้าค่าต้องสดมาก cache ก็หมดอายุพร้อมกันเกิด cache stampede

19ความหมายของ “เขียนสำเร็จ”

API ตอบ 200 ไม่ควรเป็นคำสัญญาที่คลุมเครือ ทีมต้องตกลงว่าหมายถึงรับไว้ในหน่วยความจำ บันทึกลง local disk, fsync แล้ว, replicate ถึงหนึ่ง backup หรือ commit บน quorum แล้ว แต่ละระดับมี latency และความเสี่ยงต่างกัน หาก client เข้าใจว่า durable แต่ server หมายเพียง queued ข้อมูลอาจหายโดยไม่มีใครทำผิดตามนิยามของตนเอง

แบบฝึกสั้น
ให้นักศึกษาเขียน service-level promise ของคำสั่ง POST หนึ่งรายการเป็นประโยคเดียว แล้วสร้าง failure timeline สามแบบ: process crash, disk loss และ region loss ตรวจว่าคำว่า “สำเร็จ” ยังจริงในแต่ละกรณีหรือไม่ แบบฝึกนี้บังคับให้แปลงศัพท์ replication เป็นสัญญาที่ทดสอบได้

20สรุปและขั้นตอนถัดไป

Replication เริ่มจากความตั้งใจที่ดี คืออยากให้ระบบเร็วขึ้นและไม่หยุดเมื่อเครื่องหนึ่งล่ม แต่เมื่อข้อมูลมีหลายสำเนา เราแลกปัญหาเครื่องล่มหนึ่งตัวกับปัญหาการตกลงกันของหลายตัว จึงต้องระบุ consistency model, วิธีรับมือ conflict, quorum, repair และ failover ให้ครบ

คำถามสำคัญจึงไม่ใช่เพียง “มีกี่ replica” แต่คือ replica เหล่านั้นตอบคำถามใดแทนกันได้ รับรู้การเปลี่ยนแปลงช้าเพียงใด และเมื่อเห็นต่างกันใครมีหน้าที่ตัดสินหรือรวมผลครับ

ขั้นตอนถัดไปคือบท Coordination & Agreement ซึ่งจะลงลึกว่า เมื่อบางการตัดสินใจยอมให้ replica เห็นต่างกันไม่ได้ เราจะเลือกผู้นำ จัดลำดับคำสั่ง และตกลงค่าเดียวกันภายใต้ความล้มเหลวได้อย่างไร

คำถามทบทวน
  1. อธิบายความแตกต่างระหว่าง passive (primary-backup) replication กับ active replication พร้อมข้อดี-ข้อเสียของแต่ละแบบ
  2. อธิบายเงื่อนไข R + W > N ในระบบ quorum และยกตัวอย่างค่า N, R, W ที่ต่างจากในบทเรียน พร้อมอธิบายผลที่ตามมา
  3. อธิบายว่า gossip architecture แลกอะไรเพื่อให้ได้ scalability และ fault tolerance
  4. อธิบาย CAP theorem และเหตุผลที่ partition tolerance ไม่ใช่ "ตัวเลือก" ในระบบกระจายจริง
  5. อธิบายว่า Eventual Consistency ในวิชา Network Computing สัมพันธ์กับการเลือก AP ใน CAP theorem อย่างไร และ PACELC เสริมข้อจำกัดของ CAP อย่างไร