ความแตกต่างระหว่างการแยกและการจำลองแบบบน MongoDB


77

ฉันแค่สับสนเกี่ยวกับการแยกส่วนและการจำลองแบบว่ามันทำงานอย่างไรตามคำจำกัดความ

การจำลองแบบ: ชุดแบบจำลองใน MongoDB เป็นกลุ่มของกระบวนการ mongod ที่รักษาชุดข้อมูลเดียวกัน

Sharding: Sharding เป็นวิธีการจัดเก็บข้อมูลในหลาย ๆ เครื่อง

ตามความเข้าใจของฉันหากมีข้อมูล 75 GB แล้วโดยการจำลองแบบ (3 เซิร์ฟเวอร์) จะเก็บข้อมูล 75GB ในแต่ละเซิร์ฟเวอร์หมายถึง 75GB บนเซิร์ฟเวอร์ -1, 75GB บนเซิร์ฟเวอร์ -2 และ 75GB บนเซิร์ฟเวอร์ -3 .. (ถูกต้องฉัน ถ้าฉันผิด) .. และโดยการแบ่งจะถูกเก็บไว้เป็นข้อมูล 25GB บนเซิร์ฟเวอร์ -1 ข้อมูล 25Gb บนเซิร์ฟเวอร์ -2 และ 25GB ข้อมูลบนเซิร์ฟเวอร์ -3 (ขวา?) ... แต่แล้วฉันก็พบบรรทัดนี้ใน บทช่วยสอน

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

เนื่องจากชุดแบบจำลองมีขนาด 75GB แต่มีชิ้นส่วนของขนาด 25GB ดังนั้นวิธีที่พวกเขาสามารถเทียบเท่าได้ ... นี่ทำให้ฉันสับสนมาก ... ฉันคิดว่าฉันขาดอะไรที่ยอดเยี่ยมในเรื่องนี้ โปรดช่วยฉันในเรื่องนี้

คำตอบ:


111

ชุดจำลองหมายความว่าคุณมี MongoDB หลายอินสแตนซ์ซึ่งแต่ละมิเรอร์ข้อมูลทั้งหมดของกันและกัน ชุดแบบจำลองประกอบด้วยอาจารย์หนึ่งคน (เรียกอีกอย่างว่า "หลัก") และหนึ่งหรือมากกว่าหนึ่งทาส (aka รอง) การอ่านการดำเนินการสามารถให้บริการโดยทาสใด ๆ ดังนั้นคุณสามารถเพิ่มประสิทธิภาพการอ่านได้โดยการเพิ่มทาสมากขึ้นในชุดแบบจำลอง แต่การดำเนินการเขียนจะเกิดขึ้นกับต้นแบบของชุดจำลองและจะแพร่กระจายไปยังทาสดังนั้นการเขียนจะไม่เร็วขึ้นเมื่อคุณเพิ่มทาสมากขึ้น

ชุดแบบจำลองยังมีการยอมรับข้อผิดพลาด เมื่อหนึ่งในสมาชิกของชุดแบบจำลองลงไปคนอื่น ๆ เข้ามาแทนที่ เมื่อนายลงไปทาสจะเลือกนายใหม่ ด้วยเหตุนี้จึงแนะนำให้การปรับใช้ที่มีประสิทธิผลให้ใช้ MongoDB เป็นชุดแบบจำลองของเซิร์ฟเวอร์อย่างน้อยสามตัวโดยสองตัวจัดเก็บข้อมูลไว้ (ตัวที่สามเป็นตัว "arbiter" ที่ไม่มีข้อมูลซึ่งจำเป็นสำหรับการพิจารณาต้นแบบใหม่เมื่อ ทาสคนหนึ่งลงไป)

Sharded คลัสเตอร์หมายความว่าชิ้นส่วนของแต่ละกลุ่ม (ซึ่งอาจจะเป็นแบบจำลองชุด) ดูแลส่วนหนึ่งของข้อมูล แต่ละคำร้องขอทั้งอ่านและเขียนให้บริการโดยคลัสเตอร์ที่มีข้อมูลอยู่ ซึ่งหมายความว่าทั้งการอ่านและการเขียนสามารถเพิ่มขึ้นได้โดยการเพิ่มเศษเพิ่มเติมลงในคลัสเตอร์ เอกสารใดที่อยู่บนเศษซึ่งจะถูกกำหนดโดยคีย์ shardของแต่ละคอลเลกชัน ควรเลือกในลักษณะที่ข้อมูลสามารถกระจายอย่างเท่าเทียมกันในทุกกลุ่มและเพื่อให้มีความชัดเจนสำหรับการค้นหาที่พบบ่อยที่สุดที่มี shard-key อยู่ (ตัวอย่าง: เมื่อคุณค้นหาบ่อยๆuser_nameshard-key ของคุณควรรวม เขตข้อมูลuser_nameเพื่อให้แบบสอบถามแต่ละรายการสามารถมอบหมายให้เพียงหนึ่งเศษซึ่งมีเอกสารนั้น)

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

ดังนั้นสิ่งที่มีความหมายสำหรับตัวอย่างของคุณ?

                            Sharded Cluster             
             /                    |                    \
      Shard A                  Shard B                  Shard C
        / \                      / \                      / \
+-------+ +---------+    +-------+ +---------+    +-------+ +---------+
|Primary| |Secondary|    |Primary| |Secondary|    |Primary| |Secondary|
|  25GB |=| 25GB    |    | 25 GB |=| 25 GB   |    | 25GB  |=| 25GB    |   
+-------+ +---------+    +-------+ +---------+    +-------+ +---------+

เมื่อคุณต้องการแบ่งข้อมูลของคุณ 75GB ออกเป็น 3 ส่วนของ 25GB แต่ละตัวคุณต้องมีเซิร์ฟเวอร์ฐานข้อมูลอย่างน้อย 6 ตัวที่จัดอยู่ในชุดแบบจำลองสามชุด แต่ละชุดเรพลิกาประกอบด้วยเซิร์ฟเวอร์สองตัวที่มีข้อมูล 25GB เหมือนกัน

คุณยังต้องการเซิร์ฟเวอร์สำหรับอนุญาโตตุลาการของชุดจำลองสามชุดรวมถึงเราเตอร์ mongos และเซิร์ฟเวอร์ปรับแต่งสำหรับคลัสเตอร์ อนุญาโตตุลาการมีน้ำหนักเบามากและจำเป็นเฉพาะเมื่อสมาชิกชุดแบบจำลองลดลงดังนั้นพวกเขาจึงมักจะสามารถแบ่งปันฮาร์ดแวร์เดียวกันกับสิ่งอื่น แต่เราเตอร์ Mongos และ config-server ควรซ้ำซ้อนและบนเซิร์ฟเวอร์ของตัวเอง


2
ขอบคุณมากสำหรับคำตอบรายละเอียด ... อีกคำถามหนึ่ง ... ถ้าหลักไม่ทำงานในขณะที่การดำเนินการเขียนหรืออ่านกำลังดำเนินอยู่ 1) ความล่าช้าในการเลือกหลักจากรองและ 2) คืออะไร ระหว่างการหน่วงเวลานั้นจะมีการจัดเก็บข้อมูลชั่วคราวอย่างไร
Saad Saadi

4
@SaadSaadi กระบวนการเลือกตั้งอธิบายไว้ในเอกสาร ใช้เวลาประมาณ 10 ถึง 12 วินาทีเพื่อให้ผู้ที่สองทำการสังเกตว่าอุปกรณ์หลักหยุดทำงาน การเลือกตั้งขั้นต้นมักจะใช้เวลาเพียงไม่กี่วินาทีเท่านั้น ชุดแบบจำลองเป็นแบบอ่านอย่างเดียวในขณะที่ไม่มีหลัก ความพยายามใด ๆ จากแอปพลิเคชันในการเขียนข้อมูลในช่วงเวลานี้จะล้มเหลว
ฟิลิปป์

1
@Philipp: เพียงสองความคิดเห็น: (1) คีย์ shard ไม่สามารถแก้ไขได้ (เช่นคุณไม่สามารถใช้ shard โดยใช้คีย์อื่น) และ (2) คุณสามารถอ่านได้จากโหนดลำดับที่สองของชุดเรพลิกา แต่ความสอดคล้องขึ้นอยู่กับข้อกังวลในการเขียน เพื่อให้สอดคล้องกันตัวเลือก w ควรเท่ากับ replica set sth ซึ่งไม่สามารถใช้งานได้เนื่องจากแต่ละ shard อาจมีขนาดชุด replica ต่างกันโดยเจตนาหรือเนื่องจากความล้มเหลวของโหนด)
Mike Argyriou

@Philipp คุณสามารถตอบคำถามติดตามเพิ่มเติมได้ที่dba.stackexchange.com/questions/208482/หรือไม่?
user3198603

18
  • การแบ่งพาร์ติชั่นชุดข้อมูลออกเป็นส่วนแยก
  • การจำลองข้อมูลซ้ำชุดข้อมูล

สองสิ่งนี้สามารถซ้อนกันได้เนื่องจากแตกต่างกัน การใช้ทั้งสองวิธีนี้จะทำให้คุณตั้งค่าข้อมูลในกลุ่มแบบจำลองหลายกลุ่ม อีกวิธีหนึ่งคุณทำซ้ำเศษ; ชุดข้อมูลที่ไม่มีเศษเป็น 'ชิ้นส่วนเดียว'

คลัสเตอร์ Mongo ที่มีสามส่วนและแบบจำลอง 3 อันจะมี 9 โหนด

  • แบบจำลอง 3-node 3 ชุด
  • แต่ละชุดจำลองมีเศษชิ้นส่วนเดียว

สำหรับไฟล์ขนาดใหญ่หนึ่งไฟล์จะถูกจัดเก็บไว้ในชาร์ดหนึ่งแชนเนลหรือหลายชาร์ต (ข้ามโหนด) หรือไม่
Tony

โปรดทราบว่าใน MongoDB 3.4 หรือสูงกว่าคุณจะต้องมีเซิร์ฟเวอร์ mongoDB สำหรับการกำหนดค่าและเซิร์ฟเวอร์เพิ่มเติมเพื่อทำหน้าที่เป็นเราเตอร์ mongos สิ่งนี้จะนำผลรวมของคลัสเตอร์ 3x3 ในตัวอย่างของคุณไปยังเซิร์ฟเวอร์รวม 13 แห่ง
dthrasher

9

โดยshardingคุณแยกออกคอลเลกชันของคุณลงในหลายส่วน
การทำซ้ำฐานข้อมูลของคุณหมายความว่าคุณสร้างมิเรอร์ของชุดข้อมูลของคุณ


4

ในแง่ของฟังก์ชั่นการส่งมอบ Sharding ให้ความยืดหยุ่นและความเท่าเทียม การจำลองแบบให้ความพร้อมใช้งาน


ไม่, การจำลองแบบยังให้ความสามารถในการขยายและความเท่าเทียมเนื่องจากการอ่านนั้นบ่อยกว่าการเขียนมากขึ้น
Kristóf Szalay
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.