𝗦𝗵𝗮𝗿𝗱𝗶𝗻𝗴 𝗜𝗻 𝗔 𝗡𝘂𝘁𝘀𝗵𝗲𝗹𝗹
Sharding คือการแบ่งฐานข้อมูลขนาดใหญ่ให้เป็นชิ้นเล็กๆ ที่เรียกว่า shards แทนที่จะใช้ฐานข้อมูลขนาดมหึมาเพียงตัวเดียว คุณจะกระจายข้อมูลไปยังเซิร์ฟเวอร์หลายเครื่องแทน
วิธีนี้ช่วยให้คุณ:
- จัดการข้อมูลได้มากขึ้น
- ประมวลผลคำขอ (requests) ได้มากขึ้น
- ลดภาระการทำงานของเครื่องใดเครื่องหนึ่ง
- ขยายระบบในแนวราบ (Scale horizontally)
คุณต้องตัดสินใจว่าจะส่งข้อมูลไปยัง shard ที่ถูกต้องได้อย่างไร และนี่คือกลยุทธ์หลักๆ:
- Range Based Sharding คุณแบ่งข้อมูลตามช่วงของค่าต่างๆ ตัวอย่าง:
- Shard 1: ผู้ใช้ 1 ถึง 3000
- Shard 2: ผู้ใช้ 3001 ถึง 6000
- Shard 3: ผู้ใช้ 6001 ถึง 10000
Hash Based Sharding คุณใช้ฟังก์ชันทางคณิตศาสตร์ในการเลือก shard ตัวอย่าง: คุณใช้ตัวดำเนินการ modulo กับ user ID หากผลลัพธ์เป็น 0 ข้อมูลจะถูกส่งไปยัง Shard 1 หากผลลัพธ์เป็น 1 จะถูกส่งไปยัง Shard 2 วิธีนี้จะช่วยกระจายข้อมูลได้อย่างสม่ำเสมอ
Directory Based Sharding คุณใช้ตารางค้นหา (lookup table) เพื่อหา shard ที่ถูกต้อง ตัวอย่าง: ระบบแจ้งเตือนจะค้นหาชื่อแอป เช่น "YouTube" ในไดเรกทอรี จากนั้นไดเรกทอรีจะบอกระบบให้ใช้ "Shard 1" ซึ่งทำงานคล้ายกับโฟลเดอร์ในระบบไฟล์
Geographical Sharding คุณจัดเก็บข้อมูลตามตำแหน่งที่ตั้ง ตัวอย่าง:
- ผู้ใช้ในอินเดียจะไปที่ shard ของอินเดีย
- ผู้ใช้ในสหรัฐอเมริกาจะไปที่ shard ของสหรัฐอเมริกา
- ผู้ใช้ในยุโรปจะไปที่ shard ของยุโรป (EU)
Dynamic Sharding คุณไม่ได้กำหนดช่วงข้อมูลหรือค่าแฮชแบบตายตัว (hardcode) แต่แอปพลิเคชันของคุณจะตรวจสอบตารางการตั้งค่า (configuration table) ในขณะที่โปรแกรมทำงาน (runtime) ทำให้คุณสามารถเพิ่ม shard ใหม่ได้โดยไม่ต้องแก้ไขโค้ด
Hybrid Sharding คุณผสมผสานวิธีการต่างๆ เพื่อให้ได้ผลลัพธ์ที่ดีขึ้น รูปแบบที่พบบ่อยคือ Directory Based + Hash Based เริ่มจากการใช้ไดเรกทอรีเพื่อหากลุ่มข้อมูล จากนั้นจึงใช้แฮชเพื่อหา shard เฉพาะเจาะจงภายในกลุ่มนั้น วิธีนี้จะช่วยให้คุณได้รับทั้งความยืดหยุ่นและความสมดุล
Source: https://dev.to/code_with_aravind/sharding-in-a-nutshell-5f6b