Appuim环境搭建 网站favicon图标制作 extjs6.5 Redis 哨兵模式 methods pyspark routing grunt Modernizr vue使用教程 vue中文 vue传值 vue自定义组件 vue绑定点击事件 less用法 click事件 jquery触发点击事件 jq触发点击事件 leach算法 python正则匹配中文 python编程教程 python中time java中scanner java语法 java获取 java方法调用 java字符串操作 java的多线程 pascal教程 骁龙435 eml文件阅读器下载 raid0教程 tomcat修改端口 流程图制作工具 js给标签添加属性 服务器文件共享软件 fireworks 欧洲卡车模拟2存档 onaccuracychanged
当前位置: 首页 > 学习教程  > 编程语言

Linux上脱机备份方案

2021/1/28 23:41:00 文章标签:

目录 一、系统环境要求 二、准备脚本运行环境 三、准备脚本文件 四、修改脚本全局变量 五、测试脚本运行 六、配置定时任务执行脚本 一、系统环境要求 1、 项目中工程部署在Linux环境上,备份工程文件到另一台Linux上,要满足两台服务器都是Linux系…

目录

一、系统环境要求

二、准备脚本运行环境

三、准备脚本文件

四、修改脚本全局变量

五、测试脚本运行

六、配置定时任务执行脚本


一、系统环境要求

1、 项目中工程部署在Linux环境上,备份工程文件到另一台Linux上,要满足两台服务器都是Linux系统才行。

2、 Linux服务器能使用外网,目的是为了能方便安装pip,fabric。

3、 两台Linux服务器均需要安装ssh服务,并开放相关端口(ssh协议默认使用TCP/22端口)。要满足两台服务器上使用ssh可以互相连接

二、准备脚本运行环境

1、检查当前系统是否有python

[root@ecs-new-0016 ~]# python

Python 2.7.5 (default, Nov 16 202022:23:17)

[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux2

Type "help""copyright""credits" or "license" for more information.

>>> exit()

[root@ecs-new-0016 ~]#

一般Linux服务器默认有python2.7,有python即可。

PS:千万别卸载python,很难装回来的,卸载了python,yum就不能用了,接着满世界找rpm包,导入进去手动安装,贼费事。

2、安装pip

(1) 检查是否有pip

[root@ecs-new-0016 ~]# pip -V

 pip 20.3.3 from /usr/lib/python2.7/site-packages/pip (python 2.7)

 

(2) 没有就直接执行

yum install python-pip

 

(3) 如果上一步没有python-pip包就执行命令 yum -y install epel-release,执行成功之后,再次执行yum install python-pip

 

(4) 对安装好的pip进行升级

pip install --upgrade pip

3、安装fabric

(1) 用pip指定版本安装fabric

pip install fabric==1.14.0

  

(2) 执行fab -V检查是否安装成功

[root@ecs-new-0016 ~]# fab -V

/usr/lib/python2.7/site-packages/paramiko/transport.py:33: CryptographyDeprecationWarning: Python 2 is no longer supported by the Python core team. Support for it is now deprecated in cryptography, and will be removed in the next release.

  from cryptography.hazmat.backends import default_backend

Fabric 1.14.0       #有这个就说明安装成功了。

Paramiko 2.7.2

 

(3) 查看fabric安装路径

[root@ecs-new-0016 ~]# which fab

/usr/bin/fab

至此,脚本运行环境准备结束。

三、准备脚本文件

脚本源码:

# -*- coding: utf-8 -*
from fabric.api import *
from fabric.colors import *
from fabric.context_managers import *
from fabric.contrib.console import confirm
import time
import datetime
    
#备份服务器信息
env.user = 'root'
#定义端口,默认为22
env.port = '22'
#多台主机,用‘,’隔开,例如:env.hosts=['192.168.1.21','192.168.1.22']
env.hosts= ['192.168.0.1']
#多台主机,这样写:env.passwords = {'root@192.168.1.21:22':'123456','root@192.168.1.22:22':'654321'}
env.password='password'
  
#自定义全局变量,格式:env. + '变量名称',如env.deploy_version;下行获取一个“年月日时分秒”给备份文件命名
env.deploy_version = time.strftime("%Y%m%d%H%M%S")
#本地备份留存备份天数
env.local_days = '7'
#备份服务器上留存天数
env.remote_days = '7'
  
#本机需备份文件路径,多个文件这样写:env.project_dev_source = ['文件1','文件2','...']
env.project_dev_source = ['/var/www/']
#本机打包存放路径
env.project_tar_source = '/root/backup/'
  
#备份服务器上存放文件位置
env.deploy_project_dir = '/root/backup/'
#备份服务器上存放日志位置
env.deploy_logs_dir = '/root/backup/logs/'
#备份服务器上存放文件夹名
env.deploy_address_ip  = '192.168.0.1'
#备份服务器上完整存放地址
env.deploy_address_dir = env.deploy_project_dir + env.deploy_address_ip
#至此,全局变量定义结束~
   
#在本地打包目标备份文件
@task
@runs_once
def tar_backup():
    print("Creating backup package...")
    #创建本地存放打包的文件夹
    local("mkdir -p %s" % env.project_tar_source)
    #循环处理文件
    for source in env.project_dev_source:
        with lcd(source):
            local("tar -czf %s-%s.tar.gz . " % ((env.project_tar_source + env.deploy_version),source.split('/')[-2]))
    local("find %s -name '*.tar.gz' -mtime +%s|xargs rm -f" % (env.project_tar_source,env.local_days))
    print green("Creating backup package success!")
   
   
#将打包文件推送至备份服务器
@task
def put_package():
    print("Start put package...")
    #创建备份服务器上文件的存放位置&日志存放位置
    run("mkdir -p %s "% env.deploy_address_dir)
    run("mkdir -p %s "% env.deploy_logs_dir)
   
    with settings(warn_only=True):
      for source in env.project_dev_source:
        result = put(env.project_tar_source+env.deploy_version+"-"+source.split('/')[-2]+".tar.gz",env.deploy_address_dir)
    run("find %s -name '*.tar.gz' -mtime +%s|xargs rm -f" % (env.deploy_address_dir,env.remote_days))
    print green("Put & backup package success!")
   
   
#md5校验备份服务器和本地备份文件的完整性
@task
@runs_once
def md5_check():
    print ("check backup package...")
   
   
    with lcd(env.project_tar_source):
        lmd5 = local("md5sum %s%s*.gz|awk '{print $1}'"% (env.project_tar_source,env.deploy_version),capture=True).split()
        rmd5 = run("md5sum %s/%s*.gz|awk '{print $1}'"% (env.deploy_address_dir,env.deploy_version)).split()
           
        #将备份状态信息写入备份服务器的日志文本
        if lmd5==rmd5:
            status = '备份时间 : %-25s备份IP : %-30s备份状态 : 备份成功!'% (datetime.date.today(),env.deploy_address_ip)
            run("echo '%s' >> %s/backup_%s.log"% (status,env.deploy_logs_dir,env.deploy_version))
            print green("backup package md5 contrast success!")
        else:
            status = '备份时间 : %-25s备份IP : %-30s备份状态 : 备份失败!'% (datetime.date.today(),env.deploy_address_ip)
            run("echo '%s' >> %s/backup_%s.log"% (status,env.deploy_logs_dir,env.deploy_version))
            print green("backup package md5 contrast failure!")
    
@task
def back():
    tar_backup()
    put_package()
    md5_check()

 

四、修改脚本全局变量

编辑三中的脚本文件,修改代码中全局变量。

#SSH连接备份服务器的用户名

env.user = 'root'

 

#SSH端口,默认为22,如果修改了SSH端口,这里一定要有该变量。例:SSH端口是2222,那么env.port = '2222'

env.port = '22'

 

#备份主机地址;如果多台备份主机,用‘,’隔开,例如:env.hosts=['192.168.1.21','192.168.1.22',···]

env.hosts= ['192.168.0.1']

 

#SSH连接备份服务器密码;多台主机这样写:env.passwords = {'root@192.168.1.21:22':'123456','root@192.168.1.22:22':'654321'}

env.password='password'

 

#以下是,自定义全局变量,格式:env. + '变量名称',如env.deploy_version

#获取一个“年月日时分秒”给备份文件命名

env.deploy_version = time.strftime("%Y%m%d%H%M%S")

 

#本地备份留存备份天数

env.local_days = '7'

 

#备份服务器上留存天数

env.remote_days = '7'

  

#本机需备份文件路径,多个文件这样写:env.project_dev_source = ['文件1','文件2','...']

env.project_dev_source = ['/var/www/']

 

#本机打包存放路径

env.project_tar_source = '/root/backup/'

  

#备份服务器上存放文件位置

env.deploy_project_dir = '/root/backup/'

 

#备份服务器上存放日志位置

env.deploy_logs_dir = '/root/backup/logs/'

 

#备份服务器上存放文件夹名

env.deploy_address_ip  = '192.168.0.1'

 

#备份服务器上完整存放地址

env.deploy_address_dir = env.deploy_project_dir + env.deploy_address_ip

 

#至此,全局变量定义结束~

其中,备份天数配置说明:

配置的env.local_days 和 env.remote_days 实际作用位置在代码-mtime 后面:

local("find %s -name '*.tar.gz' -mtime +%s|xargs rm -f" % (env.project_tar_source,env.local_days))

run("find %s -name '*.tar.gz' -mtime +%s|xargs rm -f" % (env.deploy_address_dir,env.remote_days))

 

#这个配置保留天数的参数 -mtime +n说明

+1  表示 1 24 24 小时以外···

+0  表示 0 24 24 小时以外···

+n 表示 n * 24 24 小时以外···

 1  表示 1 24 24 到 24 之间···

 0  表示 0 24 24 到 0 之间···

-1  表示 0 24 24 内,甚至为未来时间···

例如:

local("find /root/backup -name '*.tar.gz' -mtime +0|xargs rm -f") #表示删除/root/backup目录下时间范围在(0 24 24)即24小时以外,结尾是tar.gz的文件。

所以,env.local_days 本地保留天数最小0(不能小于0,否则会出现压缩文件还没拷贝就被删除的情况),表示只保留24小时以内的文件。env.local_days 和 env.remote_days最大值取决于服务器硬盘空间大小。

查看硬盘空间:df -h

[root@ecs-new-0016 ~]# df -h

Filesystem      Size  Used Avail Use% Mounted on

devtmpfs        3.9G     0  3.9G   0% /dev

tmpfs           3.9G     0  3.9G   0% /dev/shm

tmpfs           3.9G   41M  3.8G   2% /run

tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup

/dev/vda1        40G  4.2G   34G  12% /

/dev/vdb        197G   61M  187G   1% /data

tmpfs           783M     0  783M   0% /run/user/0

[root@ecs-new-0016 ~]#

查看单个文件大小:du -sh {目标文件}

[root@ecs-new-0016 ~]# du -sh tomcat-linux.tar.gz

410M    tomcat-linux.tar.gz

[root@ecs-new-0016 ~]#

五、测试脚本运行

# 在脚本所在目录,执行以下命令

fab -f backup.py back

如果提示fab没找到,返回去检查fab是否安装成功!

或者,which fab寻找fab位置,用绝对路径执行,如下:

/usr/bin/fab -f /root/backup.py back

根据终端回显判断是否执行成功!

 

我这是本地测试的图,出现三个success 就代表备份脚本执行成功!可以在两个机器上都看下压缩的文件是否正常。

六、配置定时任务执行脚本

1、配置Linux上的定时任务,这里用到的是crontab。

可以参考链接学习一下crontab:https://www.runoob.com/linux/linux-comm-crontab.html

2、举例:每天凌晨3:00开始执行备份

[root@ecs-new-0016 ~]# crontab -e

 

#输入下面这一行,这表示:每天凌晨3:00,用/usr/bin/fab执行/root/backup.py,从back方法开始执行,把终端回显写入文件/root/back.log中。

0 3 * * * /usr/bin/fab -f /root/backup.py back >> /root/back.log

 


本文链接: http://www.dtmao.cc/news_show_650271.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?