ลดความยุ่งยากในการใช้คลาวด์ พูดคุยกับเจ้าหน้าที่

ติดตั้ง MongoDB และสำรองข้อมูลบน Ubuntu
Home ติดตั้ง MongoDB และสำรองข้อมูลบน Ubuntu

ติดตั้ง MongoDB และสำรองข้อมูลบน Ubuntu

MongoDB เหมาะกับข้อมูลที่โครงสร้างไม่ตายตัว เช่น Log ข้อมูลจากอุปกรณ์ หรือแคตตาล็อกสินค้าที่แต่ละรายการมีคุณสมบัติต่างกัน คู่มือนี้ติดตั้งและตั้งค่าให้ปลอดภัยพร้อมใช้งานจริง

เรื่องที่ต้องให้ความสำคัญที่สุดคือ MongoDB รุ่นเก่าเปิดโดยไม่มีรหัสผ่านตามค่าเริ่มต้น ซึ่งเป็นสาเหตุของการรั่วไหลข้อมูลจำนวนมากทั่วโลก ขั้นตอนเปิดการยืนยันตัวตนจึงเป็นขั้นตอนที่ห้ามข้าม

สิ่งที่ต้องเตรียม

  • Ubuntu 22.04 หรือ 24.04 และสิทธิ์ sudo
  • หน่วยความจำอย่างน้อย 2 GB
  • ดิสก์ที่มีพื้นที่เพียงพอ แนะนำแยกจากไดรฟ์ระบบ

ขั้นตอนที่ 1: ติดตั้ง

curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | \
  sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmor

echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | \
  sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list

sudo apt update
sudo apt install -y mongodb-org
sudo systemctl enable --now mongod
sudo systemctl status mongod --no-pager

ขั้นตอนที่ 2: สร้างผู้ใช้ผู้ดูแลก่อนเปิดการยืนยันตัวตน

mongosh
use admin
db.createUser({
  user: "admin",
  pwd: passwordPrompt(),
  roles: [ { role: "userAdminAnyDatabase", db: "admin" },
           { role: "readWriteAnyDatabase", db: "admin" } ]
})
db.getUsers()
exit

ขั้นตอนที่ 3: เปิดการยืนยันตัวตนและจำกัดการเชื่อมต่อ

sudo nano /etc/mongod.conf
net:
  port: 27017
  bindIp: 127.0.0.1,10.0.0.51

security:
  authorization: enabled

storage:
  dbPath: /var/lib/mongodb

systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

operationProfiling:
  mode: slowOp
  slowOpThresholdMs: 100
sudo systemctl restart mongod
mongosh --quiet --eval "db.adminCommand({listDatabases:1})"

คำสั่งสุดท้ายควรถูกปฏิเสธเพราะยังไม่ได้ยืนยันตัวตน นั่นคือสัญญาณว่าตั้งค่าถูกต้อง

mongosh -u admin -p --authenticationDatabase admin

อย่าตั้ง bindIp: 0.0.0.0 ให้ระบุ IP ภายในที่ต้องใช้จริงเท่านั้น และปิดกั้นด้วย Firewall อีกชั้น

sudo ufw allow from 10.0.0.0/24 to any port 27017 proto tcp

ขั้นตอนที่ 4: สร้างผู้ใช้สำหรับแอปพลิเคชัน

use myapp
db.createUser({
  user: "myapp_rw",
  pwd: passwordPrompt(),
  roles: [ { role: "readWrite", db: "myapp" } ]
})

// ผู้ใช้สำหรับงานอ่านอย่างเดียว เช่น ระบบรายงาน
db.createUser({
  user: "myapp_ro",
  pwd: passwordPrompt(),
  roles: [ { role: "read", db: "myapp" } ]
})

// ผู้ใช้สำหรับสำรองข้อมูล
use admin
db.createUser({
  user: "backup",
  pwd: passwordPrompt(),
  roles: [ { role: "backup", db: "admin" } ]
})

ให้สิทธิ์เท่าที่จำเป็นเสมอ อย่าใช้ผู้ใช้ผู้ดูแลในแอปพลิเคชัน

ขั้นตอนที่ 5: ตั้งการสำรองข้อมูลอัตโนมัติ

sudo nano /usr/local/bin/mongo-backup.sh
#!/bin/bash
set -euo pipefail

DEST=/var/backups/mongodb
STAMP=$(date +%F-%H%M)
mkdir -p "$DEST"

mongodump \
  --uri="mongodb://backup:РАС[email protected]:27017/?authSource=admin" \
  --gzip \
  --archive="$DEST/all-$STAMP.archive.gz"

# เก็บย้อนหลัง 14 วัน
find "$DEST" -name 'all-*.archive.gz' -mtime +14 -delete

echo "backup ok: $DEST/all-$STAMP.archive.gz ($(du -h "$DEST/all-$STAMP.archive.gz" | cut -f1))"
sudo chmod 700 /usr/local/bin/mongo-backup.sh
sudo /usr/local/bin/mongo-backup.sh

เก็บรหัสผ่านในไฟล์สภาพแวดล้อมที่สิทธิ์ 600 แทนการเขียนในสคริปต์ตรง ๆ

ตั้งเวลาด้วย systemd Timer

sudo nano /etc/systemd/system/mongo-backup.service
[Unit]
Description=สำรองข้อมูล MongoDB

[Service]
Type=oneshot
EnvironmentFile=/root/.mongo-backup.env
ExecStart=/usr/local/bin/mongo-backup.sh
Nice=10
sudo nano /etc/systemd/system/mongo-backup.timer
[Unit]
Description=สำรองข้อมูล MongoDB ทุกวัน

[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true

[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now mongo-backup.timer

ขั้นตอนที่ 6: กู้คืนข้อมูล

# กู้ทั้งหมด
mongorestore --uri="mongodb://admin:[email protected]:27017/?authSource=admin" \
  --gzip --archive=/var/backups/mongodb/all-2026-09-25-0230.archive.gz

# กู้เฉพาะฐานข้อมูลเดียวไปยังชื่อใหม่เพื่อตรวจสอบก่อน
mongorestore --uri="mongodb://admin:[email protected]:27017/?authSource=admin" \
  --gzip --archive=/var/backups/mongodb/all-2026-09-25-0230.archive.gz \
  --nsFrom='myapp.*' --nsTo='myapp_restore.*'

ตัวเลือก --nsFrom และ --nsTo คือวิธีที่ปลอดภัยที่สุดในการกู้ข้อมูล เพราะไม่เขียนทับของจริง

ขั้นตอนที่ 7: ตรวจสอบประสิทธิภาพ

// ดูสถานะโดยรวม
db.serverStatus().connections
db.serverStatus().opcounters

// Query ที่ช้า ซึ่งถูกเก็บโดย profiler ที่เปิดไว้ในขั้นตอนที่ 3
use myapp
db.system.profile.find().sort({millis:-1}).limit(10).pretty()

// ดูแผนการทำงานของ Query
db.orders.find({status:"paid"}).explain("executionStats")

// ดู Index ที่มี
db.orders.getIndexes()

// สร้าง Index
db.orders.createIndex({ customer_id: 1, created_at: -1 })

// ขนาดของแต่ละคอลเลกชัน
db.getCollectionNames().forEach(function(c){
  var s = db[c].stats();
  print(c + ": " + Math.round(s.size/1024/1024) + " MB, " + s.count + " docs");
})

ในผลของ explain ให้ดูค่า totalDocsExamined เทียบกับ nReturned หากต่างกันมากแปลว่าต้องเพิ่ม Index

ปัญหาที่พบบ่อย

เชื่อมต่อจากเครื่องอื่นไม่ได้

ตรวจ bindIp ในคอนฟิกว่ามี IP ภายในแล้ว และตรวจ Firewall ทดสอบด้วย nc -vz 10.0.0.51 27017

MongoDB กินหน่วยความจำจนเต็ม

WiredTiger ใช้หน่วยความจำได้ถึงครึ่งหนึ่งของ RAM ลบ 1 GB ตามค่าเริ่มต้น จำกัดได้ด้วย storage.wiredTiger.engineConfig.cacheSizeGB ในคอนฟิก

บริการเริ่มไม่ขึ้น

ดู Log ที่ /var/log/mongodb/mongod.log สาเหตุที่พบบ่อยคือสิทธิ์ของโฟลเดอร์ข้อมูลไม่ถูกต้อง แก้ด้วย sudo chown -R mongodb:mongodb /var/lib/mongodb

ข้อมูลโตเร็วเกินคาด

ตรวจว่ามี Index ซ้ำซ้อนหรือไม่ และพิจารณาใช้ TTL Index สำหรับข้อมูลที่หมดอายุได้ เช่น Log หรือ Session

db.sessions.createIndex({ createdAt: 1 }, { expireAfterSeconds: 86400 })

ต้องการวางระบบฐานข้อมูลบนคลาวด์ในประเทศไทย ติดต่อ THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/

ผู้ให้บริการคลาวด์ไทย
เพื่อธุรกิจของคนไทย

"มุ่งมั่น" และ "มั่นคง"
พร้อมรับมือทุกการเติบโต
Trust Cloud
คลาว์ที่ปลอดภัย
คือรากฐานที่มั่นคง
cloud security