Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> ฐานข้อมูล

Master MongoDB Space Management: Allocation, Dashboards, และ Scaling Tips

สำหรับมือใหม่ MongoDB Space Usage อาจดู Confusing บทความนี้อธิบาย MongoDB Allocate Space ยังไง และ Interpret Space Usage ใน ObjectRocket Dashboard ยังไง เพื่อ Decide เมื่อไหร่ Compact Instance หรือ Add Shard เพื่อขยาย Space

เริ่มจาก Brand New Medium Instance: Single 5GB Shard Populate Test Data ใน Database "ocean" Space Usage หลังเพิ่ม Test Data และสร้าง Indexes (สร้าง Indexes ใหญ่เพิ่มเพื่อ Demo):

Master MongoDB Space Management: Allocation, Dashboards, และ Scaling Tips

ทำไม 315MiB Data + 254MiB Indexes = ใช้ 2.1 GiB จาก 5 GiB Shard? อธิบายจาก MongoDB Store Data บน Disk เป็น Extents Series ObjectRocket Instances Run ด้วย Smallfiles Option Extent แรก Allocate 16MB Double จนถึง 512MB หลังจากนั้นทุก Extent = 512MB File Database "ocean" File Structure:

$ ls -lh ocean/ total 1.5G -rw------- 1 mongodb mongodb 16M Aug 20 22:30 ocean.0 -rw------- 1 mongodb mongodb 32M Aug 20 20:44 ocean.1 -rw------- 1 mongodb mongodb 64M Aug 20 22:23 ocean.2 -rw------- 1 mongodb mongodb 128M Aug 20 22:30 ocean.3 -rw------- 1 mongodb mongodb 256M Aug 20 22:30 ocean.4 -rw------- 1 mongodb mongodb 512M Aug 20 22:30 ocean.5 -rw------- 1 mongodb mongodb 512M Aug 20 22:30 ocean.6 -rw------- 1 mongodb mongodb 16M Aug 20 22:30 ocean.ns drwxr-xr-x 2 mongodb mongodb 4.0K Aug 20 22:30 _tmp

Extents เก็บ Data และ Indexes ทั้งคู่ MongoDB: เขียน Data ลง Extent ใดๆ -> Next Logical Extent Allocated ทันที ดัง Structure ข้างต้น ocean.6 น่าจะยังไม่มี Data แต่ Pre-allocated สำหรับตอน ocean.5 เต็ม เขียน Data ลง ocean.6 -> ocean.7 (512MB) Pre-allocated อีกที Delete Data -> Space ไม่ Release จนกว่า Compact -> Fragmented Over Time (Delete หรือ Document Outgrow Original Location) Compact Defrag เพราะ Replicate Data จาก Replica Set Member อื่น และ Recreate Data Files From Scratch

อีก 16MB File = Namespace (ocean.ns) Pattern เดียวกันทุก Database บน Instance นอกจาก "ocean" มี System Databases 2 ตัว: "admin" และ "local"

"admin": User Info ทุก Database Users (Pre-2.6.x ใช้แค่ Admin Users) แม้เล็กก็มี 16MB Extent, Pre-allocated 32MB Extent, 16MB Namespace File

"local": แต่ละ Shard = 3-member Replica Set Sync Replicas -> MongoDB Maintains Log = Oplog ใน "local" Database Capped Collection ObjectRocket Config Oplog Size = 10% Shard Size -> 5GB Shard = 500MB Oplog "local" Database = 16MB Extent, 512MB Extent, 16MB Namespace File

Journal: 1-3 Files ~128MB Each Write -> Write Sequentially to Journal -> Background Thread Flush to Data Files (Extents) ทุก 60s Double-write เพราะ Sequential Write to Journal เร็วกว่า Seek เข้า Data Files จึง Ensure Crash Recovery Current Primary มี 2 Journal Files:

$ ls -lh journal/ total 273M -rw------- 1 mongodb mongodb 149M Aug 20 22:26 j._1 -rw------- 1 mongodb mongodb 124M Aug 20 22:30 j._2

MongoDB Rotate Files Auto ตาม Frequency Updates vs Background Flushes

ตอนนี้ Map กับ Space Usage Bar ใน Dashboard:

  • NS Value, 48MB — Sum 3 Namespace Files (16MB x 3 Databases: ocean, admin, local)
  • Data Value, 315MiB — Sum dataSize จาก db.stats() ทุก Databases (รวม System)
  • Index Value, 253.9MiB — Sum indexSize จาก db.stats() ทุก Databases
  • Storage Value, 687.2MiB — Sum Data + Indexes ทุก DBs + Unreclaimed Space จาก Deletes
  • Total File Value, 2.0 GiB — Total Disk Used บน Primary Replica รวม Preallocated Extents แต่ไม่รวม Journal

จาก Metrics นี้ คำนวณ Fragmentation ได้:

100% - (Data + Indexes) / Storage

ตัวอย่าง: 17% (100% - (315+253.9)/687.2 = 17%) แนะนำ Compact เมื่อ Fragmentation เข้าใกล้ 20%

คำนวณ Overall Space Usage สำหรับ Add Shard:

(Total File / (Plan Size * Number of Shards)) * 100%

ตัวอย่าง: 40% ((2 GiB / 5 GiB * 1) * 100% = 40%) แนะนำ Add Shard เมื่อ Overall Space Usage เข้าใกล้ 80% หากถึง 80% ติดต่อ Support ช่วย Add Shard