mongodb shard chunk migration 500GB ใช้เวลา 13 วัน - สิ่งนี้ช้าหรือปกติหรือไม่?


9

ฉันมี mongodb shard cluster, shard key ถูกแฮช มันมีชุดเลียนแบบ 2 ชิ้น ชุดจำลองแต่ละชุดมี 2 เครื่อง

ฉันทำการทดลองโดยเพิ่มชุดจำลอง 2 ชิ้นอีกชุดและเริ่มปรับสมดุลใหม่

อย่างไรก็ตามหลังจากที่ในขณะที่ฉันพบว่าการโยกย้ายก้อนค่อนข้างช้า ใช้เวลา 1 ชั่วโมงในการย้ายข้อมูล 1.4GB

มันทำให้ฉันกังวลมันหมายความว่าฉันต้องรอ 13 วันเพื่อให้การย้ายข้อมูลก้อนใหญ่เสร็จสมบูรณ์ 500GB!

ฉันใหม่สำหรับสิ่งนี้และฉันไม่มีพระเจ้าที่รู้สึกว่ามันช้าเร็วหรือปกติ แต่ถึงกระนั้นตัวเลขเหล่านี้ก็ไม่ทำให้ฉันเชื่อ

หมายเหตุเพิ่มเติมเกี่ยวกับการทดลอง: - การใช้เครื่อง m3 ขนาดกลาง aws - ไม่มีกระบวนการอื่นทำงานเพียงการโยกย้ายก้อน - การติดตั้ง mongodb sharding เริ่มต้นที่ไม่มีการกำหนดค่าเพิ่มเติม - shardkey กำลังใช้ hashed ที่ object id (_id) - ขนาดก้อนสูงสุด 64MB

คำตอบ:


10

ปรับปรุง: เมษายน 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


ขอบคุณสิ่งนี้อธิบายกลไกการโอนย้ายข้อมูลจำนวนมากได้มากกว่าเอกสาร mongodb
rendybjunior

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

ดูเหมือนว่าจะช้าไปเล็กน้อยตามคำอธิบายของคุณ แต่ฉันจะต้องใช้อินสแตนซ์มาตรฐานเพื่อให้แน่ใจ อัตราปัจจุบันของคุณอาจทั้งหมดที่พวกเขามีความสามารถหรือคุณอาจมีหนึ่งในปัญหาที่ฉันกล่าวถึงในคำตอบ การควบคุมอย่างหนึ่งที่คุณสามารถลองได้คือการเคลื่อนที่แบบแมนนวล - ปิดบาลานเซอร์และทำมันเองเพื่อดูว่ามีปัญหาใด ๆ หรือไม่และผลกระทบที่การเคลื่อนไหวมีต่อระบบต้นทาง / เป้าหมาย คุณสามารถค้นหารายละเอียดที่เกี่ยวข้องเกี่ยวกับ moveChunk ได้ที่นี่: docs.mongodb.org/manual/reference/method/sh.moveChunk
Adam C

เพียงเพื่อเพิ่มการสร้างภาพก้อนที่มีลำดับความสำคัญต่ำบน mongoDB และแม้แต่ในระบบประสิทธิภาพสูงอาจใช้เวลาสักครู่หากพวกเขาไม่ว่าง
Antonios

@ อันโตนิส - ไม่แน่ใจว่าคุณหมายถึงความสำคัญการโอนย้ายข้อมูลเป็นส่วนที่อ่านจากแหล่งข้อมูล (เช่นเดียวกับการอ่านอื่น ๆ ) และการเขียนบนชิ้นส่วนเป้าหมาย (ด้วยความกังวลการเขียนดังกล่าว) ไม่มีการจัดลำดับความสำคัญ กับคนอื่น ๆ พวกเขาจะช้าในระบบไม่ว่าง แต่ไม่ใช่เพราะความแตกต่างลำดับความสำคัญโดยธรรมชาติ
Adam C
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.