美文网首页我用 LinuxLinux学习|Gentoo/Arch/FreeBSDLinux
服务器数据的实时备份与定时备份(rsync+inotify)

服务器数据的实时备份与定时备份(rsync+inotify)

作者: 肉山大魔王i | 来源:发表于2019-12-04 09:21 被阅读0次

    需求:对服务器数据进行实时备份,不能丢失任何已生成数据
    思路:需要新增一台备份服务器,利用inotify监测主服务器需要备份的目录下的数据,有任何改动立即调用rsync进行数据同步。并且在备份服务器上对同步数据每天进行定时备份(如果两台都是阿里云服务器,建议开通内网通讯,这样不会影响外网流量而且传输速度很快)

    server name IP
    主服务器 171.12.13.36
    备份服务器 171.12.13.37

    安装调试inotify(主服务器)

    安装inotify步骤参考:https://blog.51cto.com/sndapk/1252218


    调试rsync

    ubuntu 16.04默认已安装rsync,rsync服务默认不是启动的,我们要修改rsync文件。

    sudo vim /etc/default/rsync
    

    1.修改配置项:

    RSYNC_ENABLE=true   #false改true
    

    2.备份端创建账号密码文件,主服务器端只需创建密码文件
    备份端创建:

    vim /etc/rsyncd.secret 
    JackMa:wobuxihuanqian
    

    主服务器创建:

    vim /etc/rsyncd.pwd 
    wobuxihuanqian
    

    3.创建配置文件(备份端)
    将rsyncd.conf 复制到/etc目录下,并进行配置

    sudo cp /usr/share/doc/rsync/examples/rsyncd.conf /etc
    
    sudo vi /etc/rsyncd.conf
    
    #日志存放地址
    log file=/home/hyperledger_data/rsync_logs/rsync_log
    
    pid file=/var/run/rsyncd.pid
    syslog facility=daemon
    #以下配置的代表名称
    [demo]
    comment = demo
    path = /home/hyperledger_data/volumes/
    use chroot = no
    lock file = /var/lock/rsyncd
    read only = no
    list = yes
    uid = 0
    gid = 0
    #用户名
    auth users = JackMa
    #密码文件地址
    secrets file = /etc/rsyncd.secret
    strict modes = yes
    #允许同步的客户端地址
    hosts allow = 171.12.13.36
    ignore errors = yes
    ignore nonreadable = yes
    transfer logging = yes
    log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes.
    timeout = 600
    #refuse options = checksum dry-run
    dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.
    
    

    4.两边均启动rsync服务,并设置成开机启动

    service rsync start
    update-rc.d rsync defaults 90
    

    5.在主服务器端先执行一次全量同步,看下rsync能不能用

    #-a 归档模式,表示递归传输并保持文件属性
    #-v 显示rsync过程中详细信息
    #-z 传输时进行压缩提高效率
    #-R 在备份端创建绝对路径上的所有目录
    rsync -avzR --password-file=/etc/rsync.pwd /var/lib/docker/volumes/ JackMa@171.12.13.37::demo
    

    编写实时同步脚本(主服务器)

    本脚本参考自:http://www.ttlsa.com/web/let-infotify-rsync-fast/

    vim /home/backups_script/rsync_scripts
    
    #!/bin/bash
    src=/var/lib/docker/volumes/         # 需要同步的源路径
    des=demo                             # 目标服务器上 rsync --daemon 发布的名称,rsync --daemon这里就不做介绍了,网上搜一下,比较简单。
    rsync_passwd_file=/etc/rsync.pwd     # rsync验证的密码文件
    ip1=171.12.13.37                     # 目标服务器1       
    user=JackMa                      # rsync --daemon定义的验证用户名
    cd ${src}                            # 此方法中,由于rsync同步的特性,这里必须要先cd到源目录,inotify再监听 ./ 才能rsync同步后目录结构一致,有兴趣的同学可以进行各种尝试观看其效果
    /usr/local/bin/inotifywait -mrq --format  '%Xe %w%f' -e modify,create,delete,attrib,close_write,move $src | while read file         # 把监控到有发生更改的"文件路径列表"循环
    do
            INO_EVENT=$(echo $file | awk '{print $1}')      # 把inotify输出切割 把事件类型部分赋值给INO_EVENT
            INO_FILE=$(echo $file | awk '{print $2}')       # 把inotify输出切割 把文件路径部分赋值给INO_FILE
            echo "-------------------------------$(date)------------------------------------"
            echo $file
            #增加、修改、写入完成、移动进事件
            #增、改放在同一个判断,因为他们都肯定是针对文件的操作,即使是新建目录,要同步的也只是一个空目录,不会影响速度。
            if [ "$INO_EVENT" = "CREATE" ] || [ "$INO_EVENT" = "MODIFY" ] || [ "$INO_EVENT" = "CLOSE_WRITE" ] || [ "$INO_EVENT" = "MOVED_TO" ];then
                    echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'
                    rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des}         # INO_FILE变量代表路径哦  -c校验文件内容
                     #仔细看 上面的rsync同步命令 源是用了$(dirname ${INO_FILE})变量 即每次只针对性的同步发生改变的文件的目录(只同步目标文件的方法在生产环境的某些极端环境下会漏文件 现在可以在不漏文件下也有不错的速度 做到平衡) 然后用-R参数把源的目录结构递归到目标后面保证目录结构一致性
            fi
            #删除、移动出事件
            if [ "$INO_EVENT" = "DELETE" ] || [ "$INO_EVENT" = "MOVED_FROM" ];then
                    echo 'DELETE or MOVED_FROM'
                    rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des}
                    #看rsync命令 如果直接同步已删除的路径${INO_FILE}会报no such or directory错误 所以这里同步的源是被删文件或目录的上一级路径,并加上--delete来删除目标上有而源中没有的文件,这里不能做到指定文件删除,如果删除的路径越靠近根,则同步的目录月多,同步删除的操作就越花时间。这里有更好方法的同学,欢迎交流。
            fi
            #修改属性事件 指 touch chgrp chmod chown等操作
            if [ "$INO_EVENT" = "ATTRIB" ];then
                    echo 'ATTRIB'
                    if [ ! -d "$INO_FILE" ]                 # 如果修改属性的是目录 则不同步,因为同步目录会发生递归扫描,等此目录下的文件发生同步时,rsync会顺带更新此目录。
                    then
                            rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des}
                    fi
            fi
    done
    ~           
    

    将实时脚本设置成开机自启动

    vim /etc/rc.local
    #这句话加在exit0之前
    nohup bash /home/backups_script/rsync_scripts >> /home/backups_script/rsync.log 2>&1 &
    






    编写定时备份脚本(备份端)

    vim /home/hyperledger_data_bakup/backup.sh
    
    #!/bin/bash
    bak_dir=/home/hyperledger_data_bakup
    tmp_dir=/home/hyperledger_data_bakup/tmp
    target_dir=/home/hyperledger_data
    
    #创建一个临时文件(要保存备份的路径)
    mkdir $tmp_dir
    #数据存在backups目录下,备份到beifen目录下,所以先将数据拷过来
    cp -r $target_dir  $tmp_dir
    #将数据所在文件夹beifen打包
    tar -zcPvf $bak_dir/backup$(date +%Y%m%d).tar.gz $tmp_dir
    #删除临时文件内容
    rm -rf $tmp_dir
    #删除改文件夹下超过10天的文件
    find $bak_dir -mtime +10 -name "*.tar.gz" -exec rm -rf {} \;
    ~                                                                     
    

    利用crontab进行定期执行备份脚本

    crontab -e
    #每天的凌晨两点对同步数据进行全量备份
    0 2 * * * bash /home/hyperledger_data_bakup/backup.sh
    

    相关文章

      网友评论

        本文标题:服务器数据的实时备份与定时备份(rsync+inotify)

        本文链接:https://www.haomeiwen.com/subject/buskgctx.html