MongoDB จัดการกับการโยกย้ายข้อมูลระหว่างเศษเป็นหลักผ่านกระบวนการที่เรียกว่าการย้ายถิ่นของ Chunk ซึ่งเป็นส่วนสำคัญของสถาปัตยกรรมการออกแบบที่ออกแบบมาเพื่อแจกจ่ายข้อมูลอย่างสม่ำเสมอในหลาย ๆ เศษในคลัสเตอร์ การทำลายล้างใน MongoDB เป็นวิธีที่ใช้ในการปรับขนาดฐานข้อมูลในแนวนอนโดยการแบ่งพาร์ติชันข้อมูลข้ามเซิร์ฟเวอร์หรือเศษซากหลายตัว ระบบนี้ใช้ประโยชน์จากคีย์ Shard ซึ่งเป็นฟิลด์หรือชุดของฟิลด์ในเอกสารที่กำหนดการกระจายข้อมูล ในการจัดการการโยกย้ายข้อมูลระหว่างเศษ MongoDB ใช้กระบวนการพื้นหลังที่เรียกว่า Balancer ซึ่งปรับการกระจายข้อมูลให้เหมาะสมโดยการโยกย้ายช่วงข้อมูล (หรือชิ้น) ตามความจำเป็น
คลัสเตอร์ที่มีการถาวรและภาพรวมการโยกย้าย
MongoDB แบ่งคอลเลกชันที่มีการเก็บเป็นชิ้นซึ่งเป็นช่วงที่ต่อเนื่องกันของค่าคีย์ของ Shard ก้อนแต่ละอันเป็นของเศษที่เฉพาะเจาะจงและชิ้นเหล่านี้รวมกันเก็บชุดข้อมูลทั้งหมด Balancer ตรวจสอบการกระจายชิ้นส่วนข้ามเศษและย้ายชิ้นส่วนระหว่างเศษเพื่อรักษาสมดุล กลไกการย้ายถิ่นนี้ช่วยหลีกเลี่ยงฮอตสปอตปรับปรุงประสิทธิภาพการค้นหาและเพิ่มประสิทธิภาพการใช้ทรัพยากร
การโยกย้ายแบบก้อนมีประโยชน์ในสถานการณ์เช่นเมื่อมีการเพิ่มเศษใหม่ลงในคลัสเตอร์เมื่อข้อมูลเพิ่มขึ้นอย่างไม่สมดุลหรือเมื่อจำเป็นต้องกำหนดโซนสำหรับสถานที่ข้อมูลหรือข้อกำหนดด้านกฎระเบียบ การโยกย้ายทำงานในระดับก้อนย้ายค่าคีย์ของ Shard ทั้งหมดจากหนึ่งในเศษหนึ่งไปยังอีก
รายละเอียดกระบวนการโยกย้าย
การโยกย้ายก้อนของ MongoDB ทำงานได้หลายขั้นตอน:
1. การเลือกก้อนเพื่อย้าย: balancer หรือผู้ดูแลระบบเลือกก้อนที่ต้องการการกำหนดใหม่ให้กับเศษอื่นเพื่อปรับสมดุลคลัสเตอร์
2. ระยะโคลน: ผู้บริจาค Shard (ผู้ที่ถือชิ้นส่วน) สำเนาเอกสารทั้งหมดในก้อนให้กับผู้รับ ในช่วงเวลานี้มีการติดตามการเขียนใหม่เกี่ยวกับชิ้นส่วนของผู้บริจาค Shard
3. ขั้นตอนการจับ: เศษของผู้รับใช้การเขียนใด ๆ ที่เกิดขึ้นในระหว่างขั้นตอนการโคลนเพื่อให้แน่ใจว่ามีข้อมูลที่ทันสมัยที่สุด
4. ส่วนที่สำคัญและการกระทำ: ผู้บริจาค Shard เข้าสู่ส่วนที่สำคัญซึ่งการดำเนินการเขียนไปยังก้อนถูกบล็อกสั้น ๆ และการเป็นเจ้าของก้อนจะเปลี่ยนเป็นอะตอมไปเป็นผู้รับของผู้รับ
5. ขั้นตอนการลบ: ผู้บริจาค Shard Asynchronously ลบเอกสารที่เป็นของก้อนอพยพเมื่อยืนยันว่าผู้รับได้ทำสิ่งที่ได้สำเร็จ
Balancer ช่วยให้มั่นใจได้ว่ามีการอพยพเพียงครั้งเดียวต่อ Shard ในเวลาเดียวกันเพื่อลดผลกระทบต่อประสิทธิภาพการทำงานของ Shard มันสามารถทำการอพยพหลายครั้งในแบบคู่ขนานข้ามคู่เศษต่าง ๆ หากพวกเขาเป็นอิสระ
balancer อัตโนมัติ
Balancer ทำงานเป็นเธรดพื้นหลังบนโหนดหลักของเซิร์ฟเวอร์ config และตรวจสอบสมดุลข้อมูลของ Shard มันติดตามขนาดข้อมูลต่อก้อนเพื่อตรวจสอบว่าจำเป็นต้องมีการย้ายถิ่นตามเกณฑ์ยอดคงเหลือที่กำหนดค่าได้หรือไม่ เมื่อความแตกต่างของขนาดข้อมูลระหว่างเศษนั้นเกินเกณฑ์นี้ Balancer จะเริ่มต้นการอพยพ
Balancer ทำงานในลักษณะที่โปร่งใสส่วนใหญ่ไปยังแอปพลิเคชัน แต่สามารถปิดใช้งานได้ชั่วคราวเพื่อการบำรุงรักษาหรือการปรับจูน นอกจากนี้ยังเคารพโซนที่กำหนดค่าภายในคลัสเตอร์เพื่อให้แน่ใจว่าชิ้นส่วนจะถูกย้ายภายในขอบเขตโซนที่เหมาะสม
คำสั่งการโยกย้ายด้วยตนเอง
ในขณะที่ Balancer โดยอัตโนมัติการโยกย้ายก้อน MongoDB ยังอนุญาตให้ควบคุมด้วยตนเองโดยใช้คำสั่งเช่น `MoveChunk` และ` Moverange ' คำสั่งเหล่านี้บังคับให้การโยกย้ายของชิ้นส่วนหรือชิ้นส่วนที่เฉพาะเจาะจงจากชิ้นส่วนหนึ่งไปยังอีกชิ้นหนึ่ง
- `MoveChunk` ใช้เพื่อโยกย้ายก้อนที่มีค่าคีย์เศษที่เฉพาะเจาะจงไปยังเศษที่ระบุ สิ่งนี้มีประโยชน์สำหรับการโยกย้ายเป้าหมายสำหรับโหลดบาลานซ์หรือสถานที่ข้อมูล
- `moverange` อนุญาตให้ย้ายช่วงของคีย์ Shard ที่ต่อเนื่องกันซึ่งมีประโยชน์สำหรับกลยุทธ์การปรับสมดุลข้อมูลที่ซับซ้อนมากขึ้น
ผู้ดูแลระบบอาจใช้คำสั่งเหล่านี้สำหรับชิ้นส่วนที่แยกออกก่อนเพื่อแจกจ่ายข้อมูลอย่างสม่ำเสมอก่อนการกลืนกินจำนวนมากหรือเพื่อแก้ไขความล้มเหลวในการย้ายถิ่นที่เกิดจากข้อ จำกัด ของหน้าต่าง
การจัดการเอกสารกำพร้าและความสอดคล้อง
ในระหว่างและหลังการย้ายถิ่นจำนวนมากเอกสารกำพร้า (เอกสารไม่ได้เป็นของช่วงที่ได้รับมอบหมายของผู้บริจาคของ Shard) อาจมีอยู่ชั่วคราวบน Shard ผู้บริจาคชั่วคราวจนกว่าพวกเขาจะได้รับการทำความสะอาด
MongoDB ช่วยให้มั่นใจได้ถึงความสอดคล้องตลอดการย้ายถิ่นโดยการใช้การดำเนินการตามลำดับและใช้กลไกการประสานงานที่บล็อกเขียนในช่วงวิกฤต หลังจากการโยกย้ายการทำความสะอาดเด็กกำพร้าทำงานแบบอะซิงโครนัสในขณะที่หลีกเลี่ยงการรบกวนด้วยการสืบค้นอย่างต่อเนื่อง
การเริ่มต้น MongoDB 5.3 การเปลี่ยนสตรีมไม่ได้สร้างเหตุการณ์สำหรับการอัปเดตไปยังเอกสารกำพร้าในระหว่างการย้ายถิ่นเพื่อรักษาความแม่นยำของสตรีมเหตุการณ์
ส่งผลกระทบต่อประสิทธิภาพและการดำเนินงาน
การอพยพแบบก้อนมีค่าใช้จ่ายรวมถึงการใช้แบนด์วิดท์เครือข่าย CPU และ DISK I/O ซึ่งอาจส่งผลกระทบต่อประสิทธิภาพของคลัสเตอร์ MongoDB ลดผลกระทบนี้โดย:
- จำกัด การมีส่วนร่วมของ Shard ในการอพยพครั้งละหนึ่งครั้ง
- การเข้าคิวการอพยพและอนุญาตให้ลบเฟสให้ทำงานซ้อนทับกันเพื่อขนถ่ายที่เร็วขึ้น
- การใช้ตัวเลือกการควบคุมปริมาณเพื่อปรับการย้ายถิ่นพร้อมกันและเขียนข้อกังวลระหว่างการย้ายถิ่น
การย้ายข้อมูลยังส่งผลกระทบต่อการอ่านทุติยภูมิชั่วคราวซึ่งอาจพลาดเอกสารในระหว่างขั้นตอนการทำความสะอาดเด็กกำพร้าดังนั้นแอปพลิเคชันจำเป็นต้องพิจารณาสิ่งนี้เมื่อออกแบบการสืบค้น
การย้ายถิ่นในสถานการณ์เฉพาะ
ในกรณีเช่นการย้ายข้อมูลระหว่างโซนที่มีช่วงแท็กหรือจากการตั้งค่าที่ไม่ได้รับการเลื่อนไปจนถึงการตั้งค่าที่ไม่ได้รับการเลื่อนข้อมูล MongoDB จะย้ายข้อมูลค่อยๆขึ้นอยู่กับช่วงคีย์หรือโซนที่ได้รับการปรับปรุงใหม่หลังจากการกำหนดค่าใหม่ ตัวอย่างเช่นการลบช่วงแท็กเก่าและการสร้างแท็กใหม่ทริกเกอร์การโยกย้าย Balancer เพื่อย้ายข้อมูลตามนั้น
เมื่อย้ายกลุ่ม MongoDB ไปยังโซลูชันที่มีการจัดการคลาวด์หรือระหว่างกลุ่มที่มีการถาวรเครื่องมือการโยกย้ายมักจะทำการโยกย้ายแบบชาร์ดที่ชาร์ดคัดลอกข้อมูลชิ้นส่วนแยกเป็นรายบุคคลในขณะที่ยังคงการแจกแจงกุญแจ
เครื่องมือและสาธารณูปโภคสำหรับการย้ายถิ่นฐาน
บริการการส่งข้อมูล (DTS) และเครื่องมือของบุคคลที่สามอื่น ๆ ช่วยย้ายข้อมูลระหว่างอินสแตนซ์หรือกลุ่ม MongoDB การจัดการการทำแผนที่ Shard ความสอดคล้องของข้อมูลและการอัปเดตที่เพิ่มขึ้น เครื่องมือเหล่านี้มักจะสนับสนุนการย้ายจากกลุ่มที่ไม่ได้ถูกทำลายไปจนถึงกลุ่มโดยการกำหนดค่าคีย์ชาร์ดเริ่มต้นให้กับข้อมูลแหล่งข้อมูลที่ขาดคีย์
สรุปประเด็นสำคัญ
- MongoDB พาร์ติชันข้อมูลเป็นชิ้นที่แจกจ่ายข้ามเศษโดยใช้ปุ่ม Shard
- balancer จะย้ายชิ้นส่วนโดยอัตโนมัติเพื่อรักษาการกระจายข้อมูลที่สมดุล
- การโยกย้ายเกี่ยวข้องกับการโคลนนิ่งข้อมูลการเขียนการเขียนการส่งมอบอะตอมและการทำความสะอาดแบบอะซิงโครนัส
- การย้ายถิ่นถูก จำกัด ไว้ที่หนึ่งต่อชาร์ดเพื่อลดผลกระทบของระบบ
- คำสั่งการโยกย้ายด้วยตนเองให้การควบคุมการดูแลระบบสำหรับการกระจายก้อน
- เอกสารกำพร้าได้รับการทำความสะอาดหลังการย้ายถิ่นแบบอะซิงโครนัส
- การโยกย้ายส่งผลกระทบต่อประสิทธิภาพและการอ่านที่สอดคล้องกันชั่วคราว
- การโยกย้ายระหว่างโซนหรือการเปลี่ยนแปลงช่วงคีย์ชาร์ดได้รับการจัดการโดยการกำหนดค่าใหม่ที่กระตุ้นการย้ายถิ่น
- เครื่องมือการโยกย้ายช่วยในการเคลื่อนย้ายข้อมูลระหว่างกลุ่มหรือสถาปัตยกรรม
กลไกการโยกย้ายนี้ช่วยให้มั่นใจได้ว่ากลุ่ม MongoDB ยังคงสมดุลปรับขนาดได้และมีประสิทธิภาพเมื่อข้อมูลเพิ่มขึ้นและการกำหนดค่าคลัสเตอร์มีวิวัฒนาการซึ่งให้ความพร้อมใช้งานอย่างต่อเนื่องโดยมีการหยุดชะงักน้อยที่สุด