𝗦𝗵𝗮𝗿𝗱𝗶𝗻𝗴 𝗜𝗻 𝗔 𝗡𝘂𝘁𝘀𝗵𝗲𝗹𝗹

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

วิธีนี้ช่วยให้คุณ:

  • จัดการข้อมูลได้มากขึ้น
  • ประมวลผลคำขอ (requests) ได้มากขึ้น
  • ลดภาระการทำงานของเครื่องใดเครื่องหนึ่ง
  • ขยายระบบในแนวราบ (Scale horizontally)

คุณต้องตัดสินใจว่าจะส่งข้อมูลไปยัง shard ที่ถูกต้องได้อย่างไร และนี่คือกลยุทธ์หลักๆ:

  1. Range Based Sharding คุณแบ่งข้อมูลตามช่วงของค่าต่างๆ ตัวอย่าง:
  • Shard 1: ผู้ใช้ 1 ถึง 3000
  • Shard 2: ผู้ใช้ 3001 ถึง 6000
  • Shard 3: ผู้ใช้ 6001 ถึง 10000
  1. Hash Based Sharding คุณใช้ฟังก์ชันทางคณิตศาสตร์ในการเลือก shard ตัวอย่าง: คุณใช้ตัวดำเนินการ modulo กับ user ID หากผลลัพธ์เป็น 0 ข้อมูลจะถูกส่งไปยัง Shard 1 หากผลลัพธ์เป็น 1 จะถูกส่งไปยัง Shard 2 วิธีนี้จะช่วยกระจายข้อมูลได้อย่างสม่ำเสมอ

  2. Directory Based Sharding คุณใช้ตารางค้นหา (lookup table) เพื่อหา shard ที่ถูกต้อง ตัวอย่าง: ระบบแจ้งเตือนจะค้นหาชื่อแอป เช่น "YouTube" ในไดเรกทอรี จากนั้นไดเรกทอรีจะบอกระบบให้ใช้ "Shard 1" ซึ่งทำงานคล้ายกับโฟลเดอร์ในระบบไฟล์

  3. Geographical Sharding คุณจัดเก็บข้อมูลตามตำแหน่งที่ตั้ง ตัวอย่าง:

  • ผู้ใช้ในอินเดียจะไปที่ shard ของอินเดีย
  • ผู้ใช้ในสหรัฐอเมริกาจะไปที่ shard ของสหรัฐอเมริกา
  • ผู้ใช้ในยุโรปจะไปที่ shard ของยุโรป (EU)
  1. Dynamic Sharding คุณไม่ได้กำหนดช่วงข้อมูลหรือค่าแฮชแบบตายตัว (hardcode) แต่แอปพลิเคชันของคุณจะตรวจสอบตารางการตั้งค่า (configuration table) ในขณะที่โปรแกรมทำงาน (runtime) ทำให้คุณสามารถเพิ่ม shard ใหม่ได้โดยไม่ต้องแก้ไขโค้ด

  2. Hybrid Sharding คุณผสมผสานวิธีการต่างๆ เพื่อให้ได้ผลลัพธ์ที่ดีขึ้น รูปแบบที่พบบ่อยคือ Directory Based + Hash Based เริ่มจากการใช้ไดเรกทอรีเพื่อหากลุ่มข้อมูล จากนั้นจึงใช้แฮชเพื่อหา shard เฉพาะเจาะจงภายในกลุ่มนั้น วิธีนี้จะช่วยให้คุณได้รับทั้งความยืดหยุ่นและความสมดุล

Source: https://dev.to/code_with_aravind/sharding-in-a-nutshell-5f6b