มาย้ายออกจาก 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 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 Atlas เข้ามาอยู่ในนี้กันดีกว่า
mongodump --uri="mongodb+srv://backup:backup@your-cluster.mongodb.net/" --gzip --archive="./backup-old.gz"
จากนั้นทำการ Backup อันนี้ผมจะ Backup บน Server ที่ทำเลยจริงๆจะทำในเครื่องก็ได้แต่ผมลงทั้งหมดไว้บน Server อยู่แล้ว
mongorestore --uri="mongodb://rootuser:rootpass@your-server:27019/" --gzip --archive="./backup-old.gz"
จากนั้นทำการ Restore ตาม Script ด้านบนได้เลยโดยเปลี่ยนเป็นที่อยู่ Server Mongodb ของเรา
มาดูขั้นตอนการ 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
ต่อไปมาทำการ Restore กันดีกว่า
docker-compose down
มาเอา Container ทั้งหมดลงก่อน
sudo rm -rf data
จากนั้นลบ Folder data ออกก่อนเพื่อที่จะได้เวลา Start container ขึ้นมาใหม่แล้วไม่มีข้อมูลอะไรเลย
docker-compose up -d
จากนั้นเรามา 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 ก็ได้นะครับ หวังว่าจะเป็นประโยชน์ไม่มากก็น้อยนะครับ