มาย้ายออกจาก Mongo Atlas และมาใช้ MongoDB Self Managed On Cloud กันเถอะ

บทความเดิมจากตอนที่แล้วเป็นการติดตั้ง ​Mongo DB พร้อมกับตัว Monitor สามารถดูได้จากส่วนนี้ คลิกเลย

บทความนี้จะมาพูดถึงการติดตั้งฐานข้อมูลและไปเอาข้อมูลจาก Mongo Atlas มาไว้ที่ใหม่รวมไปถึงการ Backup และ Restore โดยใช้ Server ทำงานร่วมกับ S3

เกริ่นก่อนว่ามีเหตุการณ์บางอย่างที่ต้องมีการย้ายฐานข้อมูลออกออกจาก Mongo Atlas มาใช้ MongoDB Self Managed On Cloud เหตุเกิดจากปัญหาหลายๆอย่างทำให้ Mongo Atlas ระงับบัญชีแล้ว ทำให้ฐานข้อมูลทั้งหมดบน Atlas ใช้งานไม่ได้ และเมื่อติดต่อ Support ทาง Atlas ไปก็ใช้เวลาไปถึง 16 ชม ถึงทาง Atlas จะแก้ไขให้ ประเด็นย้ายออกคือ 16 ชม ที่เกิดขึ้นไม่สามารถทำอะไรกับระบบได้เลย แต่ลูกค้าที่ใช้ระบบมารอไม่ได้เป็นบทเรียนที่หนักเอาการคือ Support ช้ามากๆ ถ้าอยากให้ Support เร็วๆต้องจ่ายเงิน มันจะดีกว่าไหมที่ต้องมานั่งรอแบบมีความหวังมาทำ MongoDB Self Managed On Cloud เองทำเองเจ็บเองดีกว่า เอ่ยจบเอง

ข้อดีของการทำ MongoDB Self Managed On Cloud

  • ดูแลเองปรับแต่งได้ตามความต้องการ
  • ถูกกว่าหลายเท่าเมื่อเทียบกับ Spec เดียวกัน
  • พังก็สามารถแก้ไขได้รวดเร็ว
  • ปรับหรือขยายได้รวดเร็วกว่า Atlas ปกติ Atlas ใช้เวลา Scale DB ประมาณ 10 นาที+ แต่ Self Managed On Cloud อยู่ที่ประมาณ 5 นาทีเท่านั้น

ข้อเสียของการ MongoDB Self Managed On Cloud

  • ต้องดูแลด้วยตนเองทั้งหมด ทั้งแผนการ Backup,Restore,Monitoring และอื่นๆอีกมากมาย
  • ไม่มีผู้เชียวชาญ หรือ AI มาแนะนำแบบบน Atlas
  • ต้องมีทีม Stand by รอเมื่อเกิดปัญหาต่างๆ

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

  • ผมเลือกใช้ AWS ถ้าผู้อ่านใช้ Cloud อื่น หรือ เครื่อง Server ของตนเองอาจจะต้องดัดแปลงจากบทความนี้บางส่วน
  • เครื่อง Server Linux 1 ตัว
  • AWS Key สำหรับจัดการ S3

มาเริ่มกันเลย

ก่อนอื่นผมจะทำติดตั้ง Docker และ Docker Compose ก่อน

sudo apt  install awscli

จากนั้นก็ติดตั้ง AWS Cli

aws configure

จากนั้นก็ทำการ Set ตาม Key ที่เราไปสร้างที่ IAM
AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name [ap-southeast-1]
Default output format [json]:

จากนั้นก็มาติดตั้ง Mongo Command เพื่อที่เราจะเอาใช้ในส่วนของการ Backup และ Restore

เป็นอันเสร็จแล้วสำหรับขั้นเตรียมตัวในการเตรียมพร้อมเครื่อง Server ของเรา

mkdir mongo-dev
cd mongo-dev

จากนั้นก็สร้าง Folder และ CD เข้าไป

vi docker-compose.yml

จากนั้นก็สร้าง File Docker Compose ขึ้นมาและ Copy Souce Code ตัวอย่างไปวาง

vi init-mongo.js

จากนั้นก็สร้าง File Init สำหรับ Code ชุดนี้เป็นการให้ Permissions User สามารถเข้าถึงทุกอย่างใน MongoDB เพื่อที่จะทำ Report ออกมาได้ทุกมิติ

openssl rand -base64 756 >./mongo-keyfile
chmod 400 ./mongo-keyfile

จากนั้นมาสร้าง Key เพื่อที่เราจะไปทำ ReplicaSet

มาอธิบาย ReplicaSet คืออะไร Replica Set ใน MongoDB เป็นกลุ่มของเซิร์ฟเวอร์ฐานข้อมูลที่ดำเนินการคัดลอกข้อมูลกันและกัน. ประกอบด้วยโหนดหลัก (Primary Node) และหนึ่งหรือหลายโหนดสำรอง (Secondary Nodes) ส่วนใหญ่ที่เอาใช้ในงานคือเอามากันพวก Data Lose หรือ ข้อมูลไม่สมบูรณ์ เพื่อยกตัวอย่างให้เห็นภาพมากขึ้น เช่น Functions นี้ทำงาน 1 2 3 4 5 (สมมุติ 1–5 ทำการกระทำต่อฐานข้อมูลหมด) แต่เราทำสำเร็จแค่ 1 2 3 ซึ่งมันจะไปยกเลิก 1 2 3 ทิ้ง คือเอาง่ายๆมาลดขยะที่ไม่สมบูรณ์ออกจากฐานข้อมุล

docker-compose up -d

หลังจากทำตามขั้นตอนข้างบนทั้งหมดแล้วก็มา Run กัน

จากนั้น Docker เรา Run แล้วแต่ยังไม่จบเนื่องจากเรามีการ Set ReplicaSet
docker exec -it id sh

ทำการ SH เข้าไปใน Container mongodb

mongosh "mongodb://rootuser:rootpass@localhost:27017/admin"

คำสั่งนี้เริ่มต้นการเชื่อมต่อกับ MongoDB ที่ทำงานอยู่บน localhost

rs.initiate()

สร้างและเริ่มใช้งาน Replica Set

var cfg = rs.conf();
cfg.members[0].host = "your-ip or your hostname:27019";
rs.reconfig(cfg);

จากนั้นก็ทำการ Set Hostname หรือ IP Server ของเราและตามด้วย Port ที่เรากดหนดใน Docker Compose เพื่อให้สามารถเชื่อมต่อจากภายนอกได้

rs.status()

จากนั้นลอง Connect จากภายนอกดูว่าเข้าได้ไหมโดยผมจะใช้ MongoDB Compass เชื่อต่อเข้ามา

เราก็สามารถเชื่อมต่อได้แล้วหน้าตาเริ่มต้นจะได้แบบนี้ถือว่าขั้นติดตั้ง MongoDB เราทำจนสำเร็จแล้ว

จากนั้นลองมาทำการย้าย Mongodb Atlas เข้ามาอยู่ในนี้กันดีกว่า

จากนั้นมาเลือก Database ที่จะทำการย้านบน Atlas แล้วไปที่ Menu Database Access
จากนั้นผมจะสร้าง User สำหรับ ดึงข้อมูล Atlas มาโดย Role ต้องเป็นระดับ Atlas admin เท่านั้น
เป็นอันเรียบร้อยจากนั้นก็มาทำการเอาออกจาก Atlas กัน
mongodump --uri="mongodb+srv://backup:backup@your-cluster.mongodb.net/" --gzip --archive="./backup-old.gz"

จากนั้นทำการ Backup อันนี้ผมจะ Backup บน Server ที่ทำเลยจริงๆจะทำในเครื่องก็ได้แต่ผมลงทั้งหมดไว้บน Server อยู่แล้ว

หลังจากเสร็จก็จะมี File backup-old.gz มาไว้แล้ว
mongorestore --uri="mongodb://rootuser:rootpass@your-server:27019/" --gzip --archive="./backup-old.gz"

จากนั้นทำการ Restore ตาม Script ด้านบนได้เลยโดยเปลี่ยนเป็นที่อยู่ Server Mongodb ของเรา

จากนั้นเราก็จะได้ข้อมูลทั้งหมดที่เรา Backup จาก Atlas มาอยู่ในฐานข้อมูลใหม่เราแล้ว

มาดูขั้นตอนการ Backup และ Restore กันดีกว่า

มาสร้าง File SH สำหรับ Run และ ทำ Cronjob กัน

chmod +x file.sh

จากนั้น ให้สิท x เพื่อให้ cronjob มาอ่านได้

crontab -e
0 18 * * * /home/ubuntu/mongo-dev/sh-backup.sh

จากนั้นจะมา Set โดยผมจะให้ Run File ทุกตี 1 ของทุกวัน 0 18 * * * ที่ใส่ 18 เป็นเวลาของ UTC + 7 ก็จะเป็น ตี 1 ของทุกวัน

crontab -l
จากนั้นก็มาเช็คว่าเราตั้ง Cronjob ถูกต้องใช่ไหม
จากนั้น File ที่เรา Backup ก็จะไหลเข้ามาอยู่ใน S3 ตามที่เรา Set ไว้
ตอนนี้ใน Folder เราจะได้ประมาณนี้ทำมาถึงตรงนี้

ต่อไปมาทำการ Restore กันดีกว่า

docker-compose down

มาเอา Container ทั้งหมดลงก่อน

sudo rm -rf data

จากนั้นลบ Folder data ออกก่อนเพื่อที่จะได้เวลา Start container ขึ้นมาใหม่แล้วไม่มีข้อมูลอะไรเลย

docker-compose up -d
เมื่อเรา Start มาก็จะไม่มีข้อมูลอะไรเลยรวมถึงต้องไป ReplicaSet ใหม่ทั้งหมดนะเพราะเราดัน ลบทั้ง Folder ออกหมดเลย

จากนั้นเรามา Restore จาก File ที่อยู่บน S3 กัน

aws s3 cp "$S3_BUCKET_PATH" - | mongorestore --uri="$DB_URI" --gzip --archive=-

ด้วยเพียงคำสั่งเดียวเท่านั้น ความไวขึ้นอยู่ขนาดข้อมูล และ Server ที่ใช้ ข้อมูลเยอะก็ต้องเลือก Server ที่มี CPU และ RAM เยอะหน่อย

ข้อมูลเราก็กลับมาทั้งหมดแล้ว

เป็นยังไงกันบ้างสำหรับการติดตั้ง MongoDB ไม่ยากเลยใช่ไหมครับ ผู้ให้บริการ บริการเหมือนไม่อยากดูแลกัน ก็ออกมาดูแลตัวเองกันดีกว่าครับ เจ็บแต่จบ สำหรับคนไม่ใช้ ReplicaSet ก็ย้อนดูบทความก่อนหน้าของผมได้นะครับผมปักไว้บนสุดแล้ว วิธีนี้สามารถ เอาไป Adapt ใช้ได้กับทุก Cloud หรือ On-Prem ก็ได้นะครับ หวังว่าจะเป็นประโยชน์ไม่มากก็น้อยนะครับ

--

--

No responses yet