ใช้ Mongodump และ Mongorestore ในการ migrate data ข้าม Database
ในบทความนี้เราจะมาใช้ MongoDB DBA tool 2 ตัว คือ mongodump และ mongorestore ทำ hands-on lab: “การ migrate data ข้าม Database (จาก MongoDB Atlas ลงมาที่ MongoDB Community Edition (CE) ที่ self-hosted บน vm)”
เกริ่นนำ
- mongodump เป็น cli tool ที่สามารถนำข้อมูลออกมาจาก source database โดย output ของ mongodump จะได้ไฟล์เป็น BSON, Archive หรือ Zip
- mongorestore เป็น cli tool ที่นำข้อมูลจากการ dump เพิ่มเข้าไปยัง target database
💡ข้อมูลใน hands-on lab นี้ จะใช้ข้อมูลของ sample ที่ mongo atlas ให้มา หน้าตาก็จะประมาณนี้ db: sample_mflix, collection: movies
มาลุยกันนน… 💪🏻
step 0: เตรียมเครื่อง VM + ลง MongoDB-CE
สามารถ follow ตามบทความนี้ได้เลย
* ด้วยที่เราลง MongoDB-CE จะมี Mongo DBA tool ติดมาให้ด้วย
เข้า database ด้วย mongo shell
mongosh localhost --quit
** ที่ใช้ localhost แทน mongo_connection_string ได้เพราะ เราลง mongo ไว้ใน vm มันจึงมองว่าอยู่ที่เดียวกันเลยใช้ localhost ได้
*** ตัว flag quit หมายถึงไม่ต้องพ่น info ออกมา
ตรวจดู database และ collection
show dbs
โอเคร ตอนนี้เรามีแค่ built-in database ที่ Mongo เตรียมไว้ให้
📌 Checkpoint 1: เราจะได้เครื่อง VM ที่มีการลง Mongo-CE v8 และสามารถ access database ด้วย mongo shell ได้
step 1: Mongodump
ใช้ Mongodump ในการ dump ข้อมูลจาก Mongo Atlas ลงมาที่ vm โดยเราจะเพิ่มเงื่อนไขเข้าไปคือ
- database: sample_mflix
- collection: movies
- ต้องการ movies ที่มี field year ตั้งแต่ปี 2000 เป็นต้นไป
script
mongodump \
--db=sample_mflix \
--collection=movies \
--query='{"year": {"$gte": 2000}}' \
--out='./dump_data'
--uri={{mongo_connection_string}}
(🚨ตอนรันให้ลบ \ ออก และทำให้อยู่ในบรรทัดเดียวกัน )
flag options:
- flag db เป็นการเลือก database
- flag collection เป็นการเลือก collection
- flag query เป็นการใช้ query ในการเป็นเงื่อนไข หรือ filter
- flag archive เป็นการกำหนด path และชื่อไฟล์
- flag uri เป็นการกำหนด mongo_connection_string ที่จะ connect ไปยัง source database
โดย mongo_connection_string จะมีหน้าตาประมาณนี้
mongodb+srv://{username}:{password}@{cluster_string}.mongodb.net
Authentication and Authorization
ในเคสนี้ การต่อ database เราจะต่อแบบ public ซึ่งจะต้องสร้าง credential และ whitelist ที่ Mongo Atlas ด้วยเพื่ออนุญาตให้สามารถใช้คำสั่งจาก VM ไป dump ข้อมูลได้
เพิ่ม credential และ whitelist ได้ที่ Mongo Atlas
- Database Access (aka credential): เราจะสร้าง username และ password และ role: clusterManager หรือ atlasAdmin
- Network Access (aka whitelist): เราจะกำหนด ip v4 ที่จะอนุญาติ เคสนี้เราจะเพิ่ม ipv4 ของเครื่อง VM เข้าไป
Output
จะได้ไฟล์ moveis.bson และ movies.metadata.json ที่ /dump/{{database_name}}/{{collection_name}} ตาม flag — out. ซึ่งได้มา 12,569 records จาก ทั้งหมด 21,349 ด้วยเงื่อนไข year ≥ 2000 นั่นเอง
- movies.bson เป็นข้อมูล documents
- movies.metadata.json เป็นข้อมูลของ document และ collection
📌 Checkpoint 2: เราจะได้ movies จากการ dump ซึ่งจะได้ 2 ไฟล์เป็นไฟล์ BSON data และ ไฟล์ metata
☁ Comparison Mongodump output
จริงๆแล้วสามารถกำหนด output ของการ dump ได้เพิ่มเติมอีก 2 รูปแบบ รวมเป็น 3 ดังนี้ bson (default), archive และ zip ซึ่งจะมีข้อดี ข้อเสีย และ use case ในการเลือกใช้งานดังนี้
BSON vs Archive vs Zip
BSON
✅pros:
- แต่ละ collection ที่ถูก store จะถูกแยกกันไปตาม BSON data ไฟล์ และ metadata
- สามารถ restore แบบขนานได้ และยืดหยุ่นในการ restore แยก collection
- เหมาะกับเคสที่ data มีขนาดใหญ่
❌cons
- ได้คู่ไฟล์ BSON และ metadata จำนวนมาก
Archive
✅pros:
- ได้ไฟล์เดียวเลย (BSON data รวมกับ metadata)
- เหมาะกับเคสที่ต้องการจัดการกับไฟล์ไฟล์เดียว และการ streaming ไปยัง cloud
❌cons:
- ขนาดความยืดหยุ่นในการ restore แยก collection
Zip
✅pros:
- ขนาดไฟล์มีขนาดเล็กที่สุด ทำให้การง่ายต่อการย้ายไฟล์ (storage optimize and speed to transfer)
- เหมาะกับเคสที่ต้องการ optimize เรื่อง storage
❌cons:
- ขั้นตอนการ dump และ restore จะใช้เวลา และ cpu utilize มาก เนื่องจากต้องผ่านการ unzip
Part 2: Mongorestore
เมื่อมีข้อมูลแล้วเราจะ restore เข้าตัว Mongo-CE ที่อยู่ที่เดียวกัน ด้วย mongorestore
script
mongorestore \
--db=sample_mflix \
--collection=movies \
--uri={{target_mongo_connection_string}}
{{path_to_file}}
(🚨ตอนรันให้ลบ \ ออก และทำให้อยู่ในบรรทัดเดียวกัน )
- target_mongo_connection_string ในเคสนี้เราจะ restore เข้า mongo ในเครื่อง vm นั่นคือ mongodb://localhost:27017
- path_to_file เราเก็บ output จากการ dump ไว้ ./dump_data/sample_mflix/movies.bson
Output
จะเห็นว่าเมื่อ restore data เสร็จแล้ว จะมีการสร้าง index ให้ เนื่องจาก mongodump จะเก็บข้อมูล index ไว้ใน metadata
มาดูที่ผลลัพธ์ data ของการ restore
index ที่ถูกสร้าง
📌 Checkpoint 3: เราจะได้ข้อมูล movies ใน database สามารถ
สรุป
บทความนี้ก็เป็น hands-on lab นึงที่ใช้เครื่องมือ mongodump และ mongorestore เพื่อ handle กับ task จำพวกการ migrate data ซึ่งจริงๆแล้วประกอบด้วย 3 step หลัก คือ การเตรียมเครื่อง vm, การ dump data และการ restore data. ซึ่งด้วย option flag ของ mongodump และ mongorestore ทำให้เรามีวิธีการที่หลากหลายในการจัดการ สามารถดู option เพิ่มเติมได้ที่ mongo document 😃
References