กลยุทธ์การแบ่งข้อมูล: แบบช่วง แบบแฮช และแบบไดเรกทอรี
เปรียบเทียบการแบ่งข้อมูลแบบช่วง แบบแฮช และแบบอาศัยไดเรกทอรี แล้วเลือกคีย์แบ่งข้อมูลที่กระจายภาระงานได้สมดุลและคงที่
กลยุทธ์การแบ่งข้อมูล: แบบช่วง แบบแฮช และแบบไดเรกทอรี เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
Sharding คืออะไร
การแบ่งฐานข้อมูลเชิงตรรกะหนึ่งฐานออกเป็นเซิร์ฟเวอร์จริงหลายเครื่อง (เรียกว่า "ชาร์ด") โดยแต่ละเครื่องเก็บข้อมูลเพียงบางส่วน มักทำเมื่อเซิร์ฟเวอร์เครื่องเดียวไม่สามารถรองรับภาระงานได้อีกต่อไป
Sharding ไม่เท่ากับการจำลองข้อมูล
- การจำลองข้อมูล — ข้อมูลเดียวกันอยู่บนเซิร์ฟเวอร์หลายเครื่อง (เพื่อ HA และการขยายการอ่าน)
- Sharding — ข้อมูลต่างกันอยู่บนเซิร์ฟเวอร์ต่างเครื่อง (เพื่อขยายการเขียนและเพิ่มความจุ)
คุณมักใช้ทั้งสองแบบร่วมกัน โดยให้แต่ละชาร์ดมี replica เพื่อรองรับ HA
กลยุทธ์ Sharding สามแบบ
- ช่วงค่า — แบ่งชาร์ดตามช่วงของค่า (id 1-1M อยู่บนชาร์ด A และ 1M-2M อยู่บนชาร์ด B)
- แฮช — แฮชคีย์ของชาร์ด แล้วหาค่าเศษด้วย N
- ไดเรกทอรี — ตารางแยกต่างหากจับคู่คีย์กับชาร์ด
การแบ่งชาร์ดตามช่วงค่า
เรียบง่ายและทำงานได้ดีกับข้อมูลอนุกรมเวลาและ ID ที่เรียงลำดับ ข้อควรระวังคืออาจเกิดชาร์ดร้อน หากข้อมูลล่าสุดได้รับทราฟฟิกทั้งหมด
-- Conceptually:
-- Shard A: user_id 1 - 1,000,000
-- Shard B: user_id 1,000,001 - 2,000,000
-- Shard C: user_id 2,000,001 - 3,000,000การแบ่งชาร์ดด้วยแฮช
โดยค่าเริ่มต้นจะแจกจ่ายข้อมูลได้สม่ำเสมอ แต่การเพิ่มชาร์ดทำได้ยาก เพราะการแบ่งชาร์ดใหม่จะย้ายคีย์ทั้งหมด:
-- shard_id = hash(user_id) % N
-- N=4: any user_id evenly distributed across 4 shardsการแบ่งชาร์ดด้วยไดเรกทอรี
ตารางค้นหาจะจับคู่แต่ละคีย์กับชาร์ดของคีย์นั้น:
CREATE TABLE shard_routing (
user_id BIGINT PRIMARY KEY,
shard_id INT NOT NULL
);
-- Looking up a user costs a directory query first; cache it.การแฮชแบบสอดคล้อง
การแฮชด้วยการหาค่าเศษจะเปราะบางเมื่อเพิ่มชาร์ด การแฮชแบบสอดคล้องช่วยลดจำนวนคีย์ที่ต้องย้าย:
-- Each shard owns a ring segment.
-- Adding a new shard moves only ~1/N of the keys.การเลือกคีย์ของชาร์ด
คีย์ของชาร์ดเป็นตัวกำหนดทุกอย่าง คีย์ของชาร์ดที่ดีจะมีลักษณะดังนี้:
- กระจายข้อมูลได้อย่างสม่ำเสมอ
- ปรากฏอยู่ใน query ส่วนใหญ่ (ช่วยหลีกเลี่ยงการกระจาย query ไปหลายชาร์ด)
- เปลี่ยนแปลงไม่ได้ หรือเปลี่ยนแปลงน้อยมาก
<p>Common picks: user_id, tenant_id, customer_id. Avoid: timestamps for write-heavy workloads (creates hot shards).</p>หนึ่งผู้เช่าต่อหนึ่งชาร์ด
SaaS แบบหลายผู้เช่า: ให้ผู้เช่าแต่ละรายอยู่บนชาร์ดเฉพาะของตนเอง ทำความเข้าใจได้ง่าย และแยกผู้เช่าที่ใช้ทรัพยากรมากผิดปกติได้สะดวก
การออกแบบที่แบ่งชาร์ดใหม่ได้
ออกแบบโดยคำนึงถึงการแบ่งชาร์ดใหม่ในอนาคต:
- ใช้ชาร์ดเสมือน (เช่น ชาร์ดเชิงตรรกะ 1024 ชุดที่แมปกับชาร์ดจริง)
- ทำให้การย้ายชาร์ดเชิงตรรกะไปยังเซิร์ฟเวอร์จริงเครื่องอื่นทำได้ง่าย
- หลีกเลี่ยงโค้ดแอปที่กำหนดจำนวนชาร์ดแบบตายตัว
Query ข้ามชาร์ด
นี่คือปัญหาที่ยากที่สุด JOIN และรายงานที่ครอบคลุมหลายชาร์ดต้องใช้ตรรกะกระจาย query แล้วรวมผลในแอป จะกล่าวถึงในบทเรียนถัดไป
ธุรกรรมข้ามชาร์ด
ธุรกรรมข้ามชาร์ดแบบอะตอมิกต้องใช้การคอมมิตสองระยะ (2PC) หรือซากา คำแนะนำทั่วไปคือออกแบบให้ธุรกรรมอยู่ภายในชาร์ดเดียว
สรุป
มีกลยุทธ์สามแบบ ให้เลือกตามรูปแบบทราฟฟิกของคุณ
- ช่วงค่า — เรียบง่าย แต่มีความเสี่ยงเกิดชาร์ดร้อน
- แฮช — กระจายสม่ำเสมอ แต่ยืดหยุ่นน้อย
- ไดเรกทอรี — ยืดหยุ่น แต่เพิ่มความหน่วง
- ใช้การแฮชแบบสอดคล้องเพื่อแบ่งชาร์ดใหม่ได้อย่างราบรื่น
ตรวจสอบความเข้าใจอย่างรวดเร็ว
คุณแบ่งตาราง users ด้วย hash(user_id) จาก 4 ชาร์ดเป็น 5 ชาร์ด จะต้องย้ายคีย์กี่คีย์
คำถามที่พบบ่อย
บทเรียน “กลยุทธ์การแบ่งข้อมูล: แบบช่วง แบบแฮช และแบบไดเรกทอรี” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “กลยุทธ์การแบ่งข้อมูล: แบบช่วง แบบแฮช และแบบไดเรกทอรี” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “กลยุทธ์การแบ่งข้อมูล: แบบช่วง แบบแฮช และแบบไดเรกทอรี”
เปรียบเทียบการแบ่งข้อมูลแบบช่วง แบบแฮช และแบบอาศัยไดเรกทอรี แล้วเลือกคีย์แบ่งข้อมูลที่กระจายภาระงานได้สมดุลและคงที่ คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “กลยุทธ์การแบ่งข้อมูล: แบบช่วง แบบแฮช และแบบไดเรกทอรี” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- กลยุทธ์การแบ่งข้อมูล: แบบช่วง แบบแฮช และแบบไดเรกทอรี
- คำสั่งค้นหาข้ามส่วนข้อมูล: ปัญหาที่ยากที่สุด
- Citus และ Postgres แบบกระจาย
- เมื่อใดไม่ควรแบ่งข้อมูล