ฉันได้รับมอบหมายให้ตั้งค่าการสำรองข้อมูลเพิ่มเติมสำหรับ MongoDB replicaset ซึ่งเป็นจุดเริ่มต้นแน่นอนว่าฉัน googled และไม่พบสิ่งใด ๆ บน MongoDB docs แต่ฉันพบคำถามนี้ใน Stack Overflow ซึ่งสนับสนุนให้พัฒนาโซลูชันของฉันเอง อย่างที่ไม่พบว่า Tayra กระตือรือร้นมาก
ฉันอ่านoplog
และรู้ว่ามันง่ายมากที่จะพัฒนาสิ่งที่จะเล่นซ้ำบันทึก แต่ปรากฎว่าฉันไม่ต้องmongorestore
ทำแบบนั้นสำหรับฉัน
ตอนนี้ฉันมีวิธีการทำงานกับสคริปต์ทุบตีและมันค่อนข้างง่ายนั่นคือเหตุผลที่ฉันถามที่นี่หากมีข้อบกพร่องในตรรกะของฉันหรืออาจเป็นสิ่งที่จะกัดฉันในอนาคต
ด้านล่างวิธีฉันใช้งาน:
ขั้นตอนการสำรองข้อมูลเต็มรูปแบบ
- ล็อคเขียนในสมาชิกรอง
db.fsyncLock()
- ถ่ายภาพ
บันทึกตำแหน่งสุดท้ายจาก oplog
db.oplog.rs.find().sort({$natural:-1}).limit(1).next().ts
ปลดล็อกการเขียน
db.fsyncUnlock()
ขั้นตอนการสำรองข้อมูลที่เพิ่มขึ้น
- ล็อคเขียนในสมาชิกรอง
การถ่ายโอนข้อมูล oplog จากตำแหน่ง oplog ที่บันทึกไว้ในการสำรองข้อมูลเต็มรูปแบบ (หรือเพิ่มขึ้นล่าสุด):
mongodump --host <secondary> -d local -c oplog.rs -o /mnt/mongo-test_backup/1 --query '{ "ts" : { $gt : Timestamp(1437725201, 50) } }'
บันทึกตำแหน่ง oplog ล่าสุด (เช่นเดียวกับการสำรองข้อมูลเต็มรูปแบบ)
- ปลดล็อกการเขียน
ขั้นตอนการกู้คืนการสำรองข้อมูลเต็มรูปแบบ
- หยุดทุกกรณีของ
mongod
- คัดลอกสแนปชอตไปยัง data dir ของกล่องซึ่งจะเป็นไฟล์หลัก แต่ต้องแน่ใจว่าไม่รวมทั้งหมด
local*
และmongod.lock
เทคนิคการกู้คืนนี้เรียกว่ากำหนดค่าใหม่โดยการแบ่งมิรเรอร์ - เริ่มต้นหลัก
- กำหนดค่าเรพลิกาใหม่
- เริ่มที่สองโดยไม่มีข้อมูลใด ๆ ให้พวกเขาทำการซิงค์เริ่มต้น หรือคัดลอกข้อมูลจากหลักใหม่ด้วย
local
ฐานข้อมูลใหม่
คืนค่าการสำรองข้อมูลเพิ่มเติม
เมื่อเราสร้างการสำรองข้อมูลส่วนเพิ่มจะถูกเก็บไว้ในลักษณะนี้:
/mnt/mongo-test_backup/1/local/oplog.rs.bson
/mnt/mongo-test_backup/1/local/oplog.rs.metadata.json
เราถูก instered oplog.rs.bson
แต่เราจะต้องเปลี่ยนชื่อดังนั้นนี่คือขั้นตอน:
- เปลี่ยนไดเรกทอรีเป็นการสำรองข้อมูล:
cd /mnt/mongo-test_backup/1/local
- ลบไฟล์ json
rm *.json
- เปลี่ยนชื่อไฟล์ bson
mv oplog.rs.bson oplog.bson
กู้คืนมัน:
mongorestore -h <primary> --port <port> --oplogReplay /mnt/mongo-test_backup/1/local
ฉันมีสคริปต์ทั้งหมดฉันอาจส่งมอบใน GitHub ในภายหลัง
คำถามคือถ้ามีข้อบกพร่องใด ๆ ในตรรกะ? ฉันค่อนข้างสงสัยเพราะขั้นตอนค่อนข้างตรงไปตรงมาและยังหาเอกสารไม่พบทุกที่