System Design: ทำความรู้จัก Sharding ทางออกสุดท้ายของฐานข้อมูล
เจาะลึก Sharding วิธีการสเกลฐานข้อมูลเมื่อเครื่องเดียวไม่พอ พร้อม 4 วิธีแบ่งข้อมูลและปัญหาที่ต้องเจอ

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
- Sharding คือการกระจายฐานข้อมูลออกไปหลายเครื่องเพื่อเพิ่มพื้นที่จัดเก็บและความสามารถในการเขียน
- หัวใจสำคัญคือ Shard Key ที่ต้องช่วยกระจายโหลดได้อย่างสมดุลและตรงกับคำสั่งค้นหา
- ข้อแลกเปลี่ยนที่ต้องจ่ายคือความซับซ้อนของระบบ ข้อมูลข้าม Shard และปัญหา Hot Key
- ควรเลือกใช้ Sharding เป็นทางเลือกสุดท้ายเมื่อการปรับแต่งอื่นๆ ไม่เพียงพอแล้ว
เมื่อเซิร์ฟเวอร์ฐานข้อมูลเครื่องเดียวเริ่มมีข้อจำกัด การเพิ่มขนาดเครื่องหรือ Vertical Scaling จะไปถึงจุดตันในที่สุด การเพิ่ม Read Replicas ช่วยให้อ่านข้อมูลได้รวดเร็วขึ้นแต่ไม่ช่วยเรื่องการเขียนข้อมูล เพราะทุกคำสั่งเขียนยังคงวิ่งเข้าสู่ Primary Server ตัวเดียว เมื่อปริมาณข้อมูลเกินกว่าดิสก์ของเครื่องเดียวจะรับไหว หรืออัตราการเขียนเกินความสามารถของ CPU ทางออกสุดท้ายที่เหลืออยู่คือการแยกฐานข้อมูลออกเป็นหลายๆ เครื่อง โดยแต่ละเครื่องจะรับผิดชอบข้อมูลคนละส่วน กระบวนการนี้เรียกว่า Sharding ซึ่งถือเป็นกลไกการขยายระบบที่ทรงพลังที่สุดและมีต้นทุนสูงสุดเช่นกัน
บทความนี้เป็นส่วนที่ 3 ของซีรีส์ System Design, Plainly ที่นำเสนอแนวคิดทีละเรื่องเข้าใจง่ายพร้อมตัวเลขและกรณีศึกษา โดยจะพาไปทำความรู้จัก Sharding แนวทางการแบ่งข้อมูลทั้ง 4 แบบ เหตุผลที่ทำให้ Shard Key เป็นการตัดสินใจครั้งสำคัญที่สุด รวมถึง 3 ต้นทุนหลัก ได้แก่ คำสั่งข้าม Shard การปรับสมดุล และปัญหา Hot Key ที่จะเป็นตัวตัดสินว่าการทำ Sharding นั้นคุ้มค่าหรือไม่
เพื่อให้เห็นภาพชัดเจน ลองจินตนาการถึงห้องสมุดที่มีบรรณารักษ์เพียงคนเดียว เธอย่อมจัดเก็บหนังสือและให้บริการยืมคืนได้ในจำนวนที่จำกัด เมื่อห้องสมุดเติบโตขึ้น คิวย่อมยาวขึ้น การจ้างบรรณารักษ์ที่ทำงานเร็วจนถึงขีดสุดก็ยังไม่เพียงพอต่อความต้องการ

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
ทางออกคือการแบ่งห้องสมุดออกเป็น 10 สาขา โดยแต่ละสาขาจะมีส่วนของหนังสือและบรรณารักษ์เป็นของตัวเอง ทำให้สามารถให้บริการยืมคืนพร้อมกันได้ 10 เท่า และรองรับคลังหนังสือที่ใหญ่ขึ้นสิบเท่า แต่ปัญหารูปแบบใหม่ 3 ประการก็จะตามมา
การทำ Sharding เปรียบเสมือนการขยายกิจการจากร้านค้าเดี่ยวไปเป็นแฟรนไชส์ แม้จะช่วยแก้ปัญหาคอขวดเรื่องพื้นที่และความหนาแน่นของลูกค้าได้ แต่สิ่งที่แลกมาคือต้นทุนในการบริหารจัดการสาขา ระบบสื่อสารระหว่างสาขา และกระบวนการทำงานที่ซับซ้อนขึ้นอย่างเลี่ยงไม่ได้
ปัญหาแรกคือการกำหนดกฎเกณฑ์ว่าจะให้สาขาใดเก็บหนังสือเล่มใด เช่น เรียงตามตัวอักษร ชื่อผู้แต่ง หรือหมวดหมู่ กฎข้อนี้เรียกว่า Shard Key ซึ่งเป็นตัวกำหนดว่าข้อมูลจะกระจายตัวสม่ำเสมอแค่ไหน การค้นหาจะรวดเร็วเพียงใด และจะมีสาขาใดที่ต้องแบกรับหนังสือยอดฮิตทั้งหมดในขณะที่สาขาอื่นว่างงานหรือไม่
ปัญหาที่สองคือความจำเป็นต้องมีไดเรกทอรี เมื่อผู้อ่านเข้ามาถามหาหนังสือ จำเป็นต้องมีระบบเส้นทางหรือ Routing Layer ที่รู้ทันทีว่าหนังสือเล่มนั้นอยู่ที่สาขาใดโดยไม่ต้องเดินถามทั้ง 10 สาขา ซึ่งทุกๆ คำขอจะต้องมีต้นทุนในการประมวลผลส่วนนี้เพิ่มขึ้น
ปัญหาที่สามคือคำสั่งที่ต้องครอบคลุมหลายสาขา เช่น คำถามว่าวันนี้มีหนังสือถูกยืมไปกี่เล่ม จากเดิมที่เคยยิงคำสั่งครั้งเดียวจบ ตอนนี้ต้องกลายเป็นคำสั่ง 10 ชุดแล้วนำผลมารวมกัน รวมถึงกระบวนการย้ายหนังสือจากสาขา 3 ไปสาขา 7 ที่เคยเป็นธุรกรรมเดี่ยว ก็จะกลายเป็น Distributed Transaction ทันที
หลักการสำคัญจากทุกทีมวิศวกรที่เคยทำ Sharding มาแล้วคือ "Shard เป็นทางเลือกสุดท้าย" ควรเริ่มต้นด้วยการปรับแต่งคำสั่งค้นหา เพิ่ม Index แยกตารางที่ใช้งานบ่อยในแนวตั้ง และเพิ่ม Read Replicas ก่อน จนกว่าการเขียนหรือพื้นที่จัดเก็บจะเกินขีดจำกัดของโหนดเดียวจริงๆ จึงค่อยพิจารณาทำ Sharding
การเลือก Shard Key ที่ดียังต้องคำนึงถึงเงื่อนไขสองข้อที่ขัดแย้งกันในตัว นั่นคือต้องกระจายโหลดได้อย่างสม่ำเสมอ และต้องปรากฏอยู่ในคำสั่งค้นหาที่ใช้งานจริง Key ที่กระจายตัวได้ดีแต่ไม่เคยอยู่ในคำสั่งค้นหาเลยจะไร้ประโยชน์ ขณะที่ Key ที่ปรากฏในทุกคำสั่งแต่รวมศูนย์โหลดไว้ที่จุดเดียวจะยิ่งสร้างปัญหา Hotspot มากขึ้น
วิธีการแบ่งข้อมูลแบบ Range Sharding จะเป็นการจัดสรรช่วงของ Key ให้กับแต่ละ Shard เช่น ID 0 ถึง 1 ล้านอยู่บน Shard ที่ 1 ข้อมูลภายในจะถูกเรียงลำดับทำให้การค้นหาช่วงเวลาทำได้ง่ายและมีต้นทุนต่ำ แต่ข้อเสียคือ Hot Tail โดยเฉพาะข้อมูลประเภทเวลาหรือ Auto-increment ID ที่จะวิ่งเข้าหา Shard ล่าสุดตลอดเวลา ในทางกลับกัน Hash Sharding จะนำ Key ไปผ่านฟังก์ชัน Hash ก่อนเพื่อทำลายการเรียงลำดับและช่วยกระจายโหลดได้อย่างสม่ำเสมอ แต่อาจส่งผลให้การค้นหาช่วงข้อมูลทำได้ยากขึ้นเนื่องจากข้อมูลที่เกี่ยวข้องกันจะกระจัดกระจายไปคนละ Shard
ที่มา: Dev.to
พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้
ความคิดเห็น
แสดงความคิดเห็น