Mongodb การสำรองข้อมูลที่เพิ่มขึ้น


26

ฉันได้รับมอบหมายให้ตั้งค่าการสำรองข้อมูลเพิ่มเติมสำหรับ MongoDB replicaset ซึ่งเป็นจุดเริ่มต้นแน่นอนว่าฉัน googled และไม่พบสิ่งใด ๆ บน MongoDB docs แต่ฉันพบคำถามนี้ใน Stack Overflow ซึ่งสนับสนุนให้พัฒนาโซลูชันของฉันเอง อย่างที่ไม่พบว่า Tayra กระตือรือร้นมาก

ฉันอ่านoplogและรู้ว่ามันง่ายมากที่จะพัฒนาสิ่งที่จะเล่นซ้ำบันทึก แต่ปรากฎว่าฉันไม่ต้องmongorestoreทำแบบนั้นสำหรับฉัน

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

ด้านล่างวิธีฉันใช้งาน:

ขั้นตอนการสำรองข้อมูลเต็มรูปแบบ

  1. ล็อคเขียนในสมาชิกรอง db.fsyncLock()
  2. ถ่ายภาพ
  3. บันทึกตำแหน่งสุดท้ายจาก oplog

    db.oplog.rs.find().sort({$natural:-1}).limit(1).next().ts
  4. ปลดล็อกการเขียน db.fsyncUnlock()

ขั้นตอนการสำรองข้อมูลที่เพิ่มขึ้น

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

    mongodump --host <secondary> -d local -c oplog.rs -o /mnt/mongo-test_backup/1 
        --query '{ "ts" : { $gt :  Timestamp(1437725201, 50) } }'
  3. บันทึกตำแหน่ง oplog ล่าสุด (เช่นเดียวกับการสำรองข้อมูลเต็มรูปแบบ)

  4. ปลดล็อกการเขียน

ขั้นตอนการกู้คืนการสำรองข้อมูลเต็มรูปแบบ

  1. หยุดทุกกรณีของ mongod
  2. คัดลอกสแนปชอตไปยัง data dir ของกล่องซึ่งจะเป็นไฟล์หลัก แต่ต้องแน่ใจว่าไม่รวมทั้งหมดlocal*และmongod.lock เทคนิคการกู้คืนนี้เรียกว่ากำหนดค่าใหม่โดยการแบ่งมิรเรอร์
  3. เริ่มต้นหลัก
  4. กำหนดค่าเรพลิกาใหม่
  5. เริ่มที่สองโดยไม่มีข้อมูลใด ๆ ให้พวกเขาทำการซิงค์เริ่มต้น หรือคัดลอกข้อมูลจากหลักใหม่ด้วยlocalฐานข้อมูลใหม่

คืนค่าการสำรองข้อมูลเพิ่มเติม

เมื่อเราสร้างการสำรองข้อมูลส่วนเพิ่มจะถูกเก็บไว้ในลักษณะนี้:

/mnt/mongo-test_backup/1/local/oplog.rs.bson
/mnt/mongo-test_backup/1/local/oplog.rs.metadata.json

เราถูก instered oplog.rs.bsonแต่เราจะต้องเปลี่ยนชื่อดังนั้นนี่คือขั้นตอน:

  1. เปลี่ยนไดเรกทอรีเป็นการสำรองข้อมูล: cd /mnt/mongo-test_backup/1/local
  2. ลบไฟล์ json rm *.json
  3. เปลี่ยนชื่อไฟล์ bson mv oplog.rs.bson oplog.bson
  4. กู้คืนมัน:

    mongorestore -h <primary> --port <port> --oplogReplay /mnt/mongo-test_backup/1/local

ฉันมีสคริปต์ทั้งหมดฉันอาจส่งมอบใน GitHub ในภายหลัง

คำถามคือถ้ามีข้อบกพร่องใด ๆ ในตรรกะ? ฉันค่อนข้างสงสัยเพราะขั้นตอนค่อนข้างตรงไปตรงมาและยังหาเอกสารไม่พบทุกที่


2
คุณใช้ Mongo รุ่นใด หากคุณใช้ wiredtiger รายการแรกที่คุณอ้างอิงกับ db.fsyncLock () จะเป็นปัญหา MongoDB Inc อ้างว่า "ด้วย WiredTiger คำสั่ง fsync พร้อมตัวเลือกการล็อกไม่สามารถรับประกันได้ว่าไฟล์ข้อมูลจะไม่เปลี่ยนแปลงดังนั้นอย่าใช้วิธีการเหล่านี้เพื่อให้แน่ใจว่ามีจุดประสงค์ในการสร้างการสำรองข้อมูลอย่างสม่ำเสมอ" ลิงก์
SDillon

1
@SDillon ใช้ 3.0.4 แต่ยังไม่ได้ใช้ WiredTiger อย่างน้อยก็ตอนนี้ ฉันตัดสินใจใช้มันแทนที่จะล็อคเขียนเราจะต้องหยุด mongod ทั้งหมดเข้าด้วยกัน มันเป็นจุดที่เป็นธรรมขอบคุณ
Tiago

ฉันพบเครื่องมือต่อไปนี้สำหรับการสำรองข้อมูลแบบเพิ่มหน่วยgithub.com/EqualExperts/Tayraหวังว่าสิ่งนี้จะช่วยได้
Ahmad Abuhasna

1
"เปลี่ยนเป็นเวอร์ชัน 3.2: คำสั่ง fsync พร้อมตัวเลือกการล็อคสามารถมั่นใจได้ว่าไฟล์ข้อมูลจะไม่เปลี่ยนแปลงสำหรับอินสแตนซ์ของ MongoDB โดยใช้ MMAPv1 หรือเครื่องมือการเก็บข้อมูล WiredTiger ดังนั้นจึงมีความสอดคล้องสำหรับวัตถุประสงค์ในการสร้างการสำรองข้อมูล"
ความปลอดภัย

วิธีปกติ (และง่ายที่สุด) ในการสำรองข้อมูลเพิ่มเติมคือใช้ LVM และสแน็ปช็อต docs.mongodb.com/manual/tutorial/…
JJussi

คำตอบ:


3

เพื่อตอบคำถามของคุณ No! ไม่มีตรรกะของคุณล้มเหลวและควรทำงานโดยไม่มีปัญหา อย่างไรก็ตามหากสามารถใช้สแน็ปช็อต LVM ได้วิธีที่ดีกว่าคือการสำรองข้อมูล


คุณจะทำการสำรองข้อมูลส่วนเพิ่มของ LVM snapshot ได้อย่างไร ขอบคุณ!
TanisDLJ

LVM snapshots เพิ่มขึ้นตามธรรมชาติ สแนปชอตเป็นช่วงเวลาและบันทึกการเปลี่ยนแปลงเท่านั้น
JJussi

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