Script backup mongoDB and source web trên Server

Hôm nay mình xin giới thiệu một cách để thực hiện chạy tự động backup dữ liệu(MongoDB và source Web)

Hoàn cảnh như sau: có 2 server

A: 192.168.0.1 chứa source web, kết nối database với server B. Đây là server sẽ chạy crontab.

B: 192.168.0.2 là server MongoDB

Lưu ý: việc chứng thực để 2 server có thể kết nối với nhau các bạn tự thực hiện nhá.

Thực hiện:

1. Khai báo các thông số ban đầu:


# Tên Database
DB_NAME="backup_production"
# Thư mục source web
WEB_DIR="/var/www/html/production/web"
# IP của server B server database
HOST="192.168.0.2"
# Lấy thời gian
TIMESTAMP=`date +%Y%m%d`
# Kiểu backup ở đây là backup hàng ngày
TYPE="daily"
# Thời gian bắt đầu script chạy
TIME_START=`date +"%T"`
echo "START: "$TIME_START
# Thư mục chứa file sau khi backup
BACKUP_DIR="/var/www/html/backup"
# Thư mục chứa file backup của Source WEB
BACKUP_WEB_DIR="$BACKUP_DIR/WEB"
# Thư mục chứa file backup của DB
BACKUP_DB_DIR="$BACKUP_DIR/DB"
# Thư mục chứa file tmp
BACKUP_TMP_DIR="$BACKUP_DIR/TMP"
# Tên file sau khi backup của Source WEB
BACKUP_WEB_NAME="web_backup_"$TIMESTAMP"_"$TYPE".tar"
# Tên file sau khi backup của DB
BACKUP_DB_NAME="DB_backup_"$TIMESTAMP"_"$TYPE".tar"
# Tên file log cho Source WEB
WEB_LOG_NAME=$BACKUP_WEB_DIR"/web_output.log"
# Tên file log cho DB
DB_LOG_NAME=$BACKUP_DB_DIR"/db_output.log"

Đoạn trên mình đều có ghi chú thích hết rồi, về tên file backup mình cho định dạng là .tar, nghĩa là mình sẽ nén các file lại thành định dạng .tar nên server phải cài đặt tar nhá.

2. Tạo các thư mục:


mkdir -p $BACKUP_DIR
mkdir -p $BACKUP_WEB_DIR
mkdir -p $BACKUP_DB_DIR
mkdir -p $BACKUP_TMP_DIR

3. Phân quyền các thư mục: mình phân quyền cho 777 luôn vì sau khi bakup xong mình sẽ xoá hết không để lại.


chmod -R 777 $BACKUP_DIR
chmod -R 777 $BACKUP_WEB_DIR
chmod -R 777 $BACKUP_DB_DIR
chmod -R 777 $BACKUP_TMP_DIR

4. Backup Source WEB

4-1. Xoá file cũ: có thể bỏ qua bước này nếu không muốn xoá đi file backup cũ.

find $BACKUP_WEB_DIR -type f -name "*_"$TYPE"*" -delete >> $WEB_LOG_NAME 2>&1

Tìm trong thư mục (/var/www/html/backup/WEB/) có tên gần giống(type = daily) sẽ xoá và ghi vào log(web_output.log)

4-2. Nén source

cd $WEB_DIR && tar -cf "$BACKUP_TMP_DIR/$BACKUP_WEB_NAME" ./ --exclude="./application/logs" >> $WEB_LOG_NAME 2>&1 && cd $BACKUP_DIR

Di chuyển vào thư mục source web(/var/www/html/production/web) và tiến hành nén các thư mục và tập tin, với đường dẫn và tên file đã khai báo. Ở đây có đoạn –exclude=”./application/logs” nghĩa là bỏ ra thư mục application/logs không nén nó. Ghi vào file log(web_output.log), sau cùng là di chuyển ra lại thư mục backup.

Sau bước này thì sẽ xuất hiện một file có đuôi .tar ở thư mục /var/www/html/backup/TMP/web_backup_****.tar

5. Backup DB

5-1. Xoá file DB cũ: có thể bỏ qua nếu không muốn xoá

find $BACKUP_DB_DIR -type f -name "*_"$TYPE"*" -delete >> $DB_LOG_NAME 2>&1

5-2. Dump database ra thư mục

mongodump --host $HOST -d $DB_NAME -o "$BACKUP_TMP_DIR/$TYPE" >> $DB_LOG_NAME 2>&1

Đây là cú pháp để export database trong mongoDB các bạn tự tìm hiểu nha, đương nhiên phải phân quyền để có thể thực thi được trên các database này. Sau lệnh này sẽ có thư mục chứ toàn bộ dữ liệu của database trong (/var/www/html/backup/TMP/daily/)

5-3. Nén thư mục vừa tạo ra ở 5-1

tar -cvf "$BACKUP_TMP_DIR/$BACKUP_DB_NAME" -C "$BACKUP_TMP_DIR/$TYPE" . >> $DB_LOG_NAME 2>&1

Nén các file và thư mục trong bước 5-1 thành file DB_backup_***.tar trong thư mục (/var/www/html/backup/TMP/DB_backup_***.tar)

6. Copy file backup hoặc move cũng được.

cp "$BACKUP_TMP_DIR/$BACKUP_WEB_NAME" "$BACKUP_WEB_DIR/$BACKUP_WEB_NAME" >> $WEB_LOG_NAME 2>&1
cp "$BACKUP_TMP_DIR/$BACKUP_DB_NAME" "$BACKUP_DB_DIR/$BACKUP_DB_NAME" >> $DB_LOG_NAME 2>&1

7. Xoá thư mục tmp đi (/var/www/html/backup/TMP)


rm -rf $BACKUP_TMP_DIR

Vậy là xong. Tổng hợp lại như sau:

# 1. Define
# Tên Database
DB_NAME="backup_production"
# Thư mục source web
WEB_DIR="/var/www/html/production/web"
# IP của server B
HOST="192.168.0.2"
# Lấy thời gian
TIMESTAMP=`date +%Y%m%d`
# Kiểu backup ở đây là backup hàng ngày
TYPE="daily"
# Thời gian bắt đầu script chạy
TIME_START=`date +"%T"`
echo "START: "$TIME_START
# Thư mục chứa file sau khi backup
BACKUP_DIR="/var/www/html/backup"
# Thư mục chứa file backup của Source WEB
BACKUP_WEB_DIR="$BACKUP_DIR/WEB"
# Thư mục chứa file backup của DB
BACKUP_DB_DIR="$BACKUP_DIR/DB"
# Thư mục chứa file tmp
BACKUP_TMP_DIR="$BACKUP_DIR/TMP"
# Tên file sau khi backup của Source WEB
BACKUP_WEB_NAME="web_backup_"$TIMESTAMP"_"$TYPE".tar"
# Tên file sau khi backup của DB
BACKUP_DB_NAME="DB_backup_"$TIMESTAMP"_"$TYPE".tar"
# Tên file log cho Source WEB
WEB_LOG_NAME=$BACKUP_WEB_DIR"/web_output.log"
# Tên file log cho DB
DB_LOG_NAME=$BACKUP_DB_DIR"/db_output.log"

# 2.Create directory
mkdir -p $BACKUP_DIR
mkdir -p $BACKUP_WEB_DIR
mkdir -p $BACKUP_DB_DIR
mkdir -p $BACKUP_TMP_DIR

# 3.Chmod directory for write
chmod -R 777 $BACKUP_DIR
chmod -R 777 $BACKUP_WEB_DIR
chmod -R 777 $BACKUP_DB_DIR
chmod -R 777 $BACKUP_TMP_DIR
# Ghi log
echo $TIMESTAMP"-DAILY:" >> $WEB_LOG_NAME 2>&1
echo $TIMESTAMP"-DAILY:" >> $DB_LOG_NAME 2>&1

# 4.Backup source
# 4.1.Remove old source
find $BACKUP_WEB_DIR -type f -name "*_"$TYPE"*" -delete >> $WEB_LOG_NAME 2>&1

# 4.2.Tar new source
cd $WEB_DIR && tar -cf "$BACKUP_TMP_DIR/$BACKUP_WEB_NAME" ./ --exclude="./application/logs" >> $WEB_LOG_NAME 2>&1 && cd $BACKUP_DIR

# 5.Backup DB
# 5.1.Remove old db
find $BACKUP_DB_DIR -type f -name "*_"$TYPE"*" -delete >> $DB_LOG_NAME 2>&1

# 5.2.Dump database
mongodump --host $HOST -d $DB_NAME -o "$BACKUP_TMP_DIR/$TYPE" >> $DB_LOG_NAME 2>&1

# 5.3.Tar new db
tar -cvf "$BACKUP_TMP_DIR/$BACKUP_DB_NAME" -C "$BACKUP_TMP_DIR/$TYPE" . >> $DB_LOG_NAME 2>&1

# 6.Copy Backup file
cp "$BACKUP_TMP_DIR/$BACKUP_WEB_NAME" "$BACKUP_WEB_DIR/$BACKUP_WEB_NAME" >> $WEB_LOG_NAME 2>&1
cp "$BACKUP_TMP_DIR/$BACKUP_DB_NAME" "$BACKUP_DB_DIR/$BACKUP_DB_NAME" >> $DB_LOG_NAME 2>&1

# 7.Delete TMP directory
rm -rf $BACKUP_TMP_DIR

TIME_END=`date +"%T"`

Việc tiếp theo thì tạo script với nội dung vừa làm xong rồi cho nó chạy crontab thôi, cái này thì mình cho nó chạy 1 ngày 1 lần vào buổi tối chẳng hạn.

0 2 * * * sh /root/shell/backup_daily.sh

Phần này xin hết ở đây, mong là có thể giúp được ai cần sử dụng.

Kết luận

  1. Nếu có thắc mắc gì các bạn để lại comment bên dưới mình sẽ trả lời sớm nhất có thể.
  2. Cảm ơn các bạn đã đọc.

Nongdanit.info
[Server]Script backup mongoDB and source web linux
Tagged on: