12/08/2018, 16:00

Hướng dẫn tự động sao lưu dữ liệu mongodb lên AWS S3

Bài toán này xuất phát từ nhu cầu thực tế của team Machine Learning. Chẳng là anh em đang muốn backup dữ liệu của viblo lên cloud, để tiện sau này dùng, ngoài ra thì lưu nhiều data tại con product server của viblo cũng không phải giải pháp lâu dài. Thế là mình ngồi mày mò viết code ... php để sao ...

Bài toán này xuất phát từ nhu cầu thực tế của team Machine Learning. Chẳng là anh em đang muốn backup dữ liệu của viblo lên cloud, để tiện sau này dùng, ngoài ra thì lưu nhiều data tại con product server của viblo cũng không phải giải pháp lâu dài. Thế là mình ngồi mày mò viết code ... php để sao lưu dữ liệu ... mongodb và ném lên một cái cloud storage nào đó, quá trình này diễn ra tự động, mỗi tháng một lần. Nhưng ngồi 1 lúc, tự dưng nghĩ ra: quái, sao mình lại phải dùng code php để sao lưu ... mongodb, trong khi chính nó và AWS S3 cũng hỗ trợ tận răng cho việc này.

Thế là lại lên mạng search một vài key words thì ra được 2 link sau, hướng dẫn khá chi tiết về việc auto backup: https://www.codeproject.com/Tips/547759/Automating-backup-for-MongoDB-using-CRON-and-S-CMD https://medium.com/@bansalnagesh/backing-up-mongodb-on-aws-ec2-to-s3-b045b5727fd6

ok, bắt tay vào làm xem thế nào.

Các Khái Niệm Cơ Bản

Trước khi tiến hành các bước, ta sẽ tìm hiểu một vài khái niệm mà mình nghĩ là không quá xa lạ với các developer:

  1. AWS S3 (Amazon Simple Storage Service) là một service do Amazon cung cấp giúp người dùng lưu trữ, truy cập, thao tác vỡi dữ liệu online, cũng giống như google drive hay dropbox, là một cloud storage.

Amazon Simple Storage Service is storage for the Internet. It is designed to make web-scale computing easier for developers.

Amazon S3 cung cấp cho ta khá nhiều api, sdk để ta có thể làm việc được với các ngôn ngữ khác nhau như python, java, php. Trước thì mình định dùng aws-sdk-php để up dữ liệu, may quá trong quá trình làm thì chợt nghĩ ra là tự dưng mình mất thêm bước nữa để thao tác tới php, trong khi chỉ mongodb và Amazon s3 là đủ. 2. S3cmd: là một command line tool để upload, truy cập và thao tác dữ liệu trong Amazon S3 và các cloud storage service providers sử dụng S3 protocol như google cloud storage hay DreamHost.

Bước 1: Đăng Kí Storage

Bước đầu tiên ta phải đăng kí S3 service của Amazon. Và đầu tiên của đầu tiên là ... đăng kí tài khoản. Các bạn truy cập Amazon https://www.console.aws.amazon.com để đăng kí tài khoản.

Nhưng để cho nhanh, thì mình sẽ mặc định là tất cả các bạn đang xem post này đều đã có 1 tài khoản. Ta sẽ chuyển ngay sang bước 2.

Bước 2: Cài Đặt S3cmd

Linux

sudo su
sudo yum --enablerepo epel install s3cmd

Ubuntu

wget -O- -q http://s3tools.org/repo/deb-all/stable/s3tools.key | sudo apt-key add -
sudo wget -O/etc/apt/sources.list.d/s3tools.list http://s3tools.org/repo/deb-all/stable/s3tools.list
sudo apt-get install s3cmd

Chạy lệnh sau để bắt đầu cấu hình s3cmd: Lưu ý, để bắt đầu config thì bạn phải có tài khoản tại amazon và đã đăng kí sử dụng Amazon services. Sau đó, tạo một IAM user, trong thông tin user sẽ có một access key id và một secret key. Trước đó tôi đã đăng kí 1 user viblo, cấp AmazonS3FullAccess permission cho user này để tiện thao tác với s3.

s3cmd --configure

Sau đó, vào Amazon S3, tạo 1 bucket (folder) cho việc lưu data. Ở đây tôi đã tạo 1 folder là viblo-logs. Ta sẽ test xem s3cmd tool đã hoạt động chưa bằng cách chạy lệnh sau:

s3cmd ls

Nếu nó list đúng các bucket trong S3 của chúng ta thì mọi thứ ok.

/var/www/html/viblo $ s3cmd ls
2017-09-18 03:05  s3://viblo-logs

Bước 3: Viết Backup Script

touch mongo_backup.sh
gedit mongo_backup.sh

post đoạn script sau:

#!/bin/bash
 
#Force file syncronization and lock writes
mongo admin --eval "printjson(db.fsyncLock())"
 
MONGODUMP_PATH="/usr/bin/mongodump"
MONGO_DATABASE="viblo" #replace with your database name
 
TIMESTAMP=`date +%F-%H%M`
S3_BUCKET_NAME="viblo-logs" #replace with your bucket name on Amazon S3
S3_BUCKET_PATH="mongodb-backups"
 
# Create backup
$MONGODUMP_PATH -d $MONGO_DATABASE
 
# Add timestamp to backup
mv dump mongodb-$HOSTNAME-$TIMESTAMP
tar cf mongodb-$HOSTNAME-$TIMESTAMP.tar mongodb-$HOSTNAME-$TIMESTAMP
 
# Upload to S3
s3cmd put mongodb-$HOSTNAME-$TIMESTAMP.tar s3://$S3_BUCKET_NAME/$S3_BUCKET_PATH/mongodb-$HOSTNAME-$TIMESTAMP.tar
 
#Unlock database writes
mongo admin --eval "printjson(db.fsyncUnlock())"
#Delete local files
rm -rf mongodb-*

Chạy đoạn script

bash mongo_backup.sh

Kết quả sau khi chạy: sau khi dump dữ liệu ra, nén lại, và up lên storage ta được file mongodb-james-MS-7817-2017-09-19-0841.tar trong folder viblo-logs/mongodb-backups

Bước 4: Setup Cron Để Tiến Hành Automatic backup

Bật cron lên để setup

sudo su
crontab -e
 +---------------- minute (0 - 59)
 |  +------------- hour (0 - 23)
 |  |  +---------- day of month (1 - 31)
 |  |  |  +------- month (1 - 12)
 |  |  |  |  +---- day of week (0 - 6) (Sunday=0 or 7)
 |  |  |  |  |
 *  *  *  *  *  command to be executed

Ở đây tôi muốn vào 3h sáng ngày 01 hàng tháng, đoạn bash này sẽ được chạy. Nên tôi sẽ setup như sau:

#1st of every month at 9 am
00 03 1 * * /bin/bash /home/ubuntu/mongo_backup.sh

Vậy là xong, chúc các bạn thành công.

0