HONGWEI's Blog

基于 Docker 的 Django 容器化部署之三:定时备份,两步实现服务器迁移

Django 257

本文章为原创内容,只发布于 CSDN 博客我的私人博客,这里是为了让大家预览 Django-Blog 项目的时候好跳转,转载请注明,谢谢


基于 Docker 的 Django 容器化部署教程分为三部分,当前所在的是第三部分 - 基于 Docker 的 Django 容器化部署之一:定制属于自己的 docker 镜像 - 基于 Docker 的 Django 容器化部署之二:docker-compose 部署 Django 项目 - 基于 Docker 的 Django 容器化部署之三:定时备份,两步实现服务器迁移

Django 博客进行 Docker 容器化之后,所需要的就是定时备份功能,能够将数据随时迁移到任何地方,毕竟容器化进行部署需要的就是轻量和易用。

既然备份了就要能够恢复数据,这样在迁移的时候,就可以保证数据不会丢失。

看了这个教程,简单几个命令就可以实现无损迁移项目。

脚本

自己编写的 shell 脚本 migrate.sh 功能: - 自动备份 - 自动清理 - 自动恢复 - 自动设置备份规则

#!/bin/bash

mysql_db=hw_mysql
mysql_table=website
mysql_username=root
mysql_password=zhwei.cn
meida_dir=./django/media
backup_dir=./backup

backup_dir_date=${backup_dir}/`date +%Y-%m-%d`
backup_date=`date +%Y%m%d-%H%M`


if [ ! -n "$1" ] ;then
    echo -e "\nUsage: migrate [-b] [-c] [-r <*.sql.gz> <*.tar.gz>] [-t <\"0 3 * * *\">]\n"
    echo "  -b,   backup mysql and media"
    echo "  -c,   clean old-to-date backup"
    echo "  -r,   restore mysql and media"
    echo -e "  -t,   set cron schedule expressions\n"
fi


while getopts :bcr:t: opt

do
    case $opt in
        b)
        echo -e "\n-----  Current start Backup  -----"

        echo "1. mkdir backup filedir: ${backup_dir_date}"
        mkdir -p ${backup_dir_date}

        echo "2. Backup MySQL to ${backup_dir_date}"
        docker exec ${mysql_db} /usr/bin/mysqldump -u ${mysql_username} --password=${mysql_password} ${mysql_table} | gzip > ${backup_dir_date}/website-${backup_date}.sql.gz

        echo "3. Backup media to ${backup_dir_date}"
        tar -zcvf  ${backup_dir_date}/media-${backup_date}.tar.gz ${meida_dir}

        echo -e "-----  Backup Success!  -----\n"
        ;;
        c)
        echo -e "\n-----  Current start Clean  -----"

        echo "1. Remove old-to-date website-*.sql"
        find ${backup_dir} -mtime +1 -name "*.sql.gz" -exec rm -rf {} \;

        echo "2. Remove old-to-date media-*.tar.gz"
        find ${backup_dir} -mtime +1 -name "*.tar.gz" -exec rm -rf {} \;

        echo "3. Remove empty filedir"
        while [ "$(find ${backup_dir} -empty)" ]; do find ${backup_dir} -empty | xargs -i rm -r {}; done

        echo -e "-----  Clean Success!  -----\n"
        ;;
        r)
        backup_sql=$2
        backup_meida=$3

        echo -e "\n-----  Current start Restore  -----" 

        echo "1. Unzip ${backup_sql}"
        gzip -cd ${backup_sql} > ${backup_sql%.*} 

        echo "2. Restore MySQL Databases"
        cat ${backup_sql%.*} | docker exec -i ${mysql_db} /usr/bin/mysql -u ${mysql_username} --password=${mysql_password} ${mysql_table}

        echo "3. Restore Media File"
        tar -zxvf ${backup_meida}

        echo -e "-----  Restore Done!  -----\n"
        ;;  
        t)
        echo "
        $2$3$4$5$6 cd `pwd` && sh migrate.sh -b -c

        " >> /var/spool/cron/root
        echo "Like crontab -e. Set cron schedule expressions: $2$3$4$5$6"
        echo "Command:cd `pwd` && sh migrate.sh -b -c"
        ;;         
        ?)
        echo -e "\nUsage: migrate [-b] [-c] [-r <*.sql.gz> <*.tar.gz>] [-t <\"0 3 * * *\">]\n"
        echo "  -b,   backup mysql and media"
        echo "  -c,   clean old-to-date backup"
        echo "  -r,   restore mysql and media"
        echo -e "  -t,   set cron schedule expressions\n"
        exit 1
    esac
done

使用方法

Usage: migrate [-b] [-c] [-r <*.sql.gz> <*.tar.gz>] [-t <"0 3 * * *">]

  -b,   backup mysql and media
  -c,   clean old-to-date backup
  -r,   restore mysql and media
  -t,   set cron schedule expressions
  • sh migrate -b 开始备份
  • sh migrate -c 开始清理旧文件
  • sh migrate -r *.sql.gz *.tar.gz 开始恢复,注意顺序
  • sh migrate -t "0 3 * * *" 定时备份规则

备份

从我的 Django 项目来看,我要迁移的数据无非就是这两个 1. MySQL 数据库的备份 2. media 媒体文件,图片、视频、音乐之类的

操作

sh migrate -b

如果脚本保持默认,即将 MySQL备份(*.sql.gz)media备份(*.tar.gz) 存入 backup/****-**-**/文件夹中,请按需修改

目录

.
└── backup/
    ├── 2019-12-11/
    │   ├── media-20191211-1235.tar.gz
    │   └── website-20191211-1235.sql.gz
    ├── 2019-12-12/
    │   ├── media-20191212-0326.tar.gz
    │   └── website-20191212-0326.sql.gz
    └── 2019-12-13/
        ├── media-20191213-1624.tar.gz
        └── website-20191213-1624.sql.gz

清理

因为定时备份会占用很大的硬盘空间,而硬盘空间又是有限的,所以要定时清理,当前默认只保存3天的备份

sh migrate -c

开启定时备份

我使用的是 Linux 自带的 crontab 定时任务。

定时备份是一个好习惯,不要等到了服务器崩了的时候再去备份,那样可能会很麻烦。

以下操作 需要使用 root 用户

sh migrate -t "0 3 * * *"
  • "0 3 * " 是备份的周期,表示每天凌晨3点备份一次,参考时间规则查询网站:crontab guru

原理: 1. 输入crontab -e 2. 添加内容:0 3 * * * cd 目录 && sh migrate.sh -b -c 3. 保存退出

crontab命令查询

  1. 查看当前用户的定时任务
crontab -l
  1. 检查 cron 服务是不是在运行
service crond status

[[email protected] blogtest]# service crond status
Redirecting to /bin/systemctl status crond.service
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since 五 2019-12-06 15:42:39 CST; 1 weeks 2 days ago
 Main PID: 30726 (crond)
    Tasks: 1
   Memory: 1.2M
   CGroup: /system.slice/crond.service
           └─30726 /usr/sbin/crond -n

12月 16 10:12:01 localhost.localdomain crond[30726]: (root) RELOAD (/var/spool/cron/root)
...
  1. cron 不在运行启动服务
service cron start
  1. 查看定时任务日志执行信息
tail -f /var/log/cron

备份文件的导出和导入

导出

手动导出或者利用 e-mail 将备份文件定时发到自己邮箱,这个按需使用吧,基于Python的邮件模块可以参考我的 基于Python的邮件发送模块封装,只要配置邮箱基本信息就可发送。

导入

  1. 放在项目根目录,sql 无所谓,但 media 还是要的,所以干脆都放相同目录
  2. 项目容器运行,可用 docker-compose ps 查看

目录:

.
├── django
├── migrate.sh
├── docker-compose.yml
├── media-20191212-0326.tar.gz
├── nginx
└── website-20191212-0326.sql.gz

恢复

在一台新服务器上恢复项目,只需安装 dockerdocker-compose 后,运行容器,恢复数据,即可完成迁移的全部工作

sh migrate -r *.sql.gz *.tar.gz

自动 导入sql文件解压静态媒体文件

好了,导入文件恢复SQL和mdeia两步就完成了服务器的迁移,用的了五分钟?那在导入文件的时间一定用了四分五十九秒~~

就这样,神奇的事情发生了,一切数据全部保留~ enjoy~~


本文链接: https://blog.zhwei.cn/article/ji-yu-docker-de-django-rong-qi-hu-2
版权声明: 本博客所有文章除特别声明外,均遵循 CC 4.0 BY-NC-SA 版权协议。转载请附上原文链接!