ปรับปรุง: เมษายน 2018
คำตอบนี้ถูกต้องในเวลาที่คำถาม แต่สิ่งต่าง ๆ ได้ย้ายไปตั้งแต่นั้นมา ตั้งแต่เวอร์ชั่น 3.4 ได้รับการแนะนำให้รู้จักกับความเท่าเทียมกันและตั๋วที่ฉันอ้างอิงในตอนแรกได้ถูกปิด สำหรับข้อมูลเพิ่มเติมฉันครอบคลุมรายละเอียดบางอย่างในคำตอบล่าสุดนี้ ฉันจะปล่อยให้คำตอบที่เหลือตามที่เป็นเพราะมันยังคงอ้างอิงที่ดีสำหรับปัญหา / ข้อ จำกัด ทั่วไปเช่นเดียวกับที่ถูกต้องสำหรับทุกคนในรุ่นที่เก่ากว่า
คำตอบเดิม
ฉันให้คำอธิบายอย่างเต็มรูปแบบเกี่ยวกับสิ่งที่เกิดขึ้นกับการโยกย้ายก้อนในหลักสูตรขั้นสูง M202หากคุณสนใจ โดยทั่วไปแล้วสมมุติว่าการย้ายข้อมูลไม่เร็วมากแม้แต่สำหรับการล้างข้อมูลเนื่องจากการดูแลทำความสะอาดเพื่อให้แน่ใจว่าการย้ายข้อมูลทำงานในระบบที่ใช้งานอยู่ (สิ่งเหล่านี้ยังคงเกิดขึ้นแม้ว่าจะไม่มีอะไรเกิดขึ้น
นอกจากนี้มีการโยกย้ายครั้งเดียวเกิดขึ้นในแต่ละครั้งบนทั้งคลัสเตอร์ - ไม่มีการขนานกัน ดังนั้นแม้ว่าคุณจะมีโหนด "เต็ม" สองโหนดและโหนด "ว่างเปล่า" สองโหนด แต่ ณ เวลาใดก็ตามมีการโยกย้ายข้อมูลเกิดขึ้นมากที่สุดหนึ่งรายการ (ระหว่างส่วนที่มีชิ้นส่วนมากที่สุดและส่วนอย่างน้อย) ดังนั้นการเพิ่ม 2 shards จะทำให้คุณไม่มีอะไรในแง่ของความสมดุลความเร็วและเพิ่มจำนวนของชิ้นส่วนที่ต้องเคลื่อนที่
สำหรับการย้ายข้อมูลด้วยตนเองก้อนน่าจะมีขนาดประมาณ ~ 30MiB (ขึ้นอยู่กับวิธีที่คุณเติมข้อมูล แต่โดยทั่วไปจะเป็นค่าเฉลี่ยของคุณด้วยขนาดก้อนสูงสุดเริ่มต้น) คุณสามารถเรียกใช้ข้อมูลdb.collection.getShardDistribution()
บางส่วนและดูคำตอบของฉันที่นี่เพื่อรับข้อมูลเพิ่มเติมเกี่ยวกับกลุ่มของคุณ
เนื่องจากไม่มีกิจกรรมอื่นเกิดขึ้นการโยกย้ายจะเกิดขึ้นเป้าหมายชิ้น (หนึ่งในชิ้นส่วนที่เพิ่มใหม่) จะต้องอ่าน ~ 30MiB ของข้อมูลจากแหล่งข้อมูล (หนึ่งใน 2 ดั้งเดิม) และอัปเดตเซิร์ฟเวอร์การตั้งค่าเป็น แสดงตำแหน่งอันใหม่เมื่อเสร็จสิ้น การย้ายข้อมูล 30MiB ไม่ควรเป็นคอขวดสำหรับระบบปกติโดยไม่โหลด
หากช้ามีหลายสาเหตุที่เป็นไปได้ที่เป็นเช่นนั้น แต่สาเหตุส่วนใหญ่สำหรับระบบที่ไม่ว่างคือ:
- Source Disk I / O - หากข้อมูลไม่ได้อยู่ในหน่วยความจำที่ใช้งานอยู่เมื่อมีการอ่านข้อมูลนั้นจะต้องได้รับการเพจจากดิสก์
- เครือข่าย - หากมีความหน่วงแฝงการ จำกัด อัตราการสูญหายของแพ็กเก็ตและอื่น ๆ การอ่านอาจใช้เวลาสักครู่
- Target Disk I / O - ข้อมูลและดัชนีต้องถูกเขียนไปยังดิสก์ดัชนีจำนวนมากสามารถทำให้สิ่งนี้แย่ลง แต่โดยปกติแล้วนี่ไม่ใช่ปัญหาในระบบที่โหลดเบา ๆ
- ปัญหาเกี่ยวกับการย้ายข้อมูลที่ก่อให้เกิดการยกเลิกและการโยกย้ายที่ล้มเหลว (ปัญหากับเซิร์ฟเวอร์การกำหนดค่า, ปัญหาเกี่ยวกับการลบในรายการ)
- ความล่าช้าในการจำลอง - สำหรับการย้ายข้อมูลไปยังชุดจำลองเขียนข้อกังวล
w:2
หรือw:majority
ถูกใช้โดยค่าเริ่มต้น
หากระบบไม่ว่างการแข่งขันในหน่วยความจำการล็อกการแข่งขันมักจะเป็นที่สงสัยเช่นกัน
หากต้องการรับข้อมูลเพิ่มเติมเกี่ยวกับระยะเวลาในการย้ายข้อมูลหากล้มเหลวเป็นต้นให้ดูที่รายการในconfig.changelog
:
// connect to mongos
use config
db.changelog.find()
อย่างที่คุณได้เห็นและตามปกติฉันจะบอกคนอื่นเมื่อฉันฝึกอบรม / ให้การศึกษาถ้าคุณรู้ว่าคุณจะต้องมี 4 เศษดังนั้นโดยปกติแล้วการเริ่มต้นด้วย 4 จะดีกว่า ถ้าคุณทำเช่นนั้นคุณต้องระวังว่าการเพิ่มส่วนที่ใช้อาจใช้เวลานานและในขั้นต้นเป็นผลลบสุทธิต่อทรัพยากรแทนที่จะได้รับ (ดูส่วนที่ II ของซีรีย์ที่ผิดพลาดของฉันเพื่อดูรายละเอียดเพิ่มเติม)
ในที่สุดหากต้องการติดตาม / โหวต / แสดงความคิดเห็นเกี่ยวกับคำขอคุณลักษณะเพื่อปรับปรุงความเท่าเทียมกันของการย้ายข้อมูลให้ดูที่SERVER-4355