码迷,mamicode.com
首页 > 其他好文 > 详细

使用rsync实现服务器数据备份

时间:2015-04-17 11:53:09      阅读:289      评论:0      收藏:0      [点我收藏+]

标签:rsync + inotify rsync + ssh

知识点:


    实战1: 备份/var/www/html 目录

    实战2: 使用ssh密钥实现无交互备份

    实战3: 配置rsync 服务器及需要备份的目录,不使用系统用户

    实战4: rsync + inotify实现实时同步


简述


    rsync (remote synchronize) 是一个远程数据同步工具,可通过网络快速同步多台主机间的文件。 基于 rsync算法


    rsync的基本特点:

        1,可以镜像保存整个目录树和文件系统;

        2,较高的数据传输效率;      

        3,可以很容易做保持原来文件的属性、权限、时间、软硬符号链接等;       

        4,可以使用rcp, ssh,sftp等方式来传输文件;

        5,支持匿名传输;


    rsync 命令的工作模式:

        1,shell模式,也称作本地模式;

        2,远程shell模式,可以利用ssh协议承载其远程传输过程;

        3,列表模式,仅列源中的内容,-nv式,可以利用ssh协议承载其远程传输过程;

        3,列表模式,仅列源中的内容,-nv


        4, 服务模式,此时rsync,此时rsync工作为守护进程,能接收客户端的数据同步请求         

            推: 一台主机负责把数据传给其它主机(服务器开销大,适合后端服务器比较少)

            拉:所有主机定时去找一主机拉数据(可能会导致数据同步缓慢)


            端口:tcp/873

            模式: C/S      

           

    官网: http://rsync.samba.org


备份方式:


       技术分享

    


设计数据同步模式:


技术分享



实验环境:


    OS: RHEL6

    服务端:xuegod63.cn   IP:192.168.1.63

    客户端:xuegod64.cn   IP:192.168.1.64



安装rsync


    方法1:
    # yum install rsync -y
    方法2:
    # rpm -ivh /path/to/rsync-3.0.6-5.el6_0.1.x86_64.rpm


    

    安装xinetd服务来管理rsync服务

        # yum install xinetd -y
        或者
        # rpm -ivh /path/to/xinetd-version.rpm


    

    xinetd管现rsycn服务,工作原理:


    技术分享 

        


开启rsync服务


    # vim /etc/xinetd.d/rsync          #  把disable=yes 改成 disable=no
    # /etc/init.d/xinetd start         # 启动
    # netstat -natp | grep 873         # 查看监听端口873    
            tcp        0      0 :::873                      :::*                        LISTEN      59038/xinetd

     

rsync命令基本用法: 


  

    格式:rsync [选项]... 源文件 目标文件
        
    常用选项:
        
        -n: 同步测试,不执行真正的同步过程
        
        -q: 静默模式
        
        -c: checksum,开启校验功能
        
        -a,--archive: (存档) 归档模式,表示以递归的方式传输文件,并且保持文件属性,等同于加了参数-rlptgoD
        
        -r,–recursive: 对子目录以递归模式处理
              注意: rsync命令中,如果源路径是目录,且给复制路径时末尾有/,则会复制目录中的内容,而晨目录本身;如果末尾没有/,则会同步目录本身及目录中的所有文件;目标路径末尾是否有/无关紧要;
        
        -l,--links: 表示拷贝链接文件
        
        -p , --perms: 表示保持文件原有权限
        
        -t , --times: 表示保持文件原有时间
        
        -g , --group: 表示保持文件原有属用户组
        
        -o , --owner: 表示保持文件原有属主
        
        -D , --devices: 表示块设备文件信息
        
        -v: 显示同步过程的详细信息
        
        -z , --compress: 表示压缩传输
        
        -e ssh : 使用ssh作为传输承载 
        
        -H: 表示硬连接文件
        
        -A: 保留ACL属性信息
        
        -P: 显示传输进度
        
        -u, --update: 仅仅进行更新,也就是跳过所有已经存在于目标位置,并且文件时间晚于要备份的文件。(不覆盖更新的文件)
        
        --port=PORT: 指定其他的rsync服务端口  873 
        
        --delete: 删除那些目标位置有而原始位置没有的文件
        
        --password-file=FILE: 从FILE中得到密码
        
        --bwlimit=KBPS: 限制I/O带宽,Kbytes /second
        
        --filter: “- 文件名”需要过滤的文件
        
        --exclude= :需要过滤的文件
        
        --stats: 显示如何执行压缩和传输

    

    例如:把xuegod63.cn上的/etc/pam.d目录同步到xuegod64.cn上的/tmp下         

    # rsync -rpogtDl --stats -e ssh -P /etc/pam.d root@192.168.1.64:/tmp


实战1: 备份/var/www/html 目录


    1,备份xuegod63的/var/www/html 目录到xuegod64的/web-back

    2,创建用户rget1用于下载,读;创建用户rput1 用于上传,写

    

    创建用户

    [root@xuegod63 Desktop]# useradd  rget1
    [root@xuegod63 Desktop]# useradd rput1
    [root@xuegod63 Desktop]# echo ‘123456‘  | passwd --stdin rget1
    [root@xuegod63 Desktop]# echo ‘123456‘  | passwd --stdin rput1

        

    设置权限rput1        

    [root@xuegod63 Desktop]# setfacl -R -muser:rput1:rwx /var/www/html/
        #指定rput1用户可以对目录/var/www/html/拥有读写权限
            
    [root@xuegod63 Desktop]# setfacl -R -mdefault:user:rput1:rwx /var/www/html/
        #设置默认情况下rput1用户可以对/var/www/html/下,所有文件拥有可读写权限

   

    设置rget1权限:

    [root@xuegod63 ~]# setfacl -R -m user:rget1:rwx/var/www/html/
    [root@xuegod63 ~]# setfacl -R -m default:rget1:rwx/var/www/html/

    

    开始备份:

    xuegod63: 创建用于测试的数据

    [root@xuegod63 ~]# cp -r /boot/grub/ /var/www/html/
    [root@xuegod63 html]# chmod744 /var/www/html/grub/grub.conf  #修改一下权限


    xegod64:同步数据    

    [root@xuegod64 ~]# mkdir /web-back/
    [root@xuegod64 ~]# rsync -azP --delete  rget1@192.168.1.63:/var/www/html/ /web-back/


    xuegod64:

    [root@xuegod64 ~]# rsync -azP --delete rget1@192.168.1.63:/var/www/html/ /web-bac
    rget1@192.168.1.63‘s password:(123456)


实战2: 使用ssh密钥实现无交互备份。做成脚本,将xuegod63上的数据,定期备份到xuegod64上。


  

  1,在xuegod64上成生密钥       

    [root@xuegod64 ~]#ssh-keygen  #输入命令后敲三次回车,成生密钥对

   

 2,再把公钥复制到xuegod63上面

    [root@xuegod64 ~]# ssh-copy-idrget1@192.168.1.63
    rget1@192.168.1.63‘s password: 
    Now try logging into the machine, with "ssh‘rget1@192.168.1.63‘", and check in:
     
     .ssh/authorized_keys
     
    to make sure we haven‘t added extra keys that youweren‘t expecting.

    

    3,测试,不输密码直接登录和备份:

    [root@xuegod64 ~]# ssh rget1@192.168.1.63    
    [rget1@xuegod63 ~]$ exit
    logout
    Connection to 192.168.1.63 closed.
    [root@xuegod64 ~]# rm -rf /web-back/*    
    [root@xuegod64 ~]# rsync -azP --deleterget1@192.168.1.63:/var/www/html/ /web-back

   

     4,编写备份脚本:    

    [root@xuegod64 ~]# vim/root/rsync-ssh-get-wwwroot.sh
    #!/bin/bash    
    rsync -az --deleterget1@192.168.1.63:/var/www/html/ /web-back/
        #注在这里,就把P参数去掉了,因为是后期执行备份,看不进度。

    

    5,测试脚本:

    [root@xuegod64 ~]# chmod +x/root/rsync-ssh-get-wwwroot.sh
    [root@xuegod64 ~]# rm -rf /web-back/*
    [root@xuegod64 ~]# /root/rsync-ssh-get-wwwroot.sh
    [root@xuegod64 ~]# ls /web-back/grub/
    device.map    grub.conf        minix_stage1_5     stage2
    e2fs_stage1_5 iso9660_stage1_5 reiserfs_stage1_5  ufs2_stage


    6,定期增量备份:

    [root@xuegod64 ~]# crontab -e
    01 3 * * * /root/rsync-ssh-get-wwwroot.sh &

     

    7,备份完后,再在xuegod64上打包

    [root@xuegod64 ~]# tar cvzf aaa.tar.gz /web-back/

    

实战3: 配置rsync 服务器及需要备份的目录,不使用系统用户进行备份。


   

    1,需要自己创建自己的配置文件:/etc/rsyncd.conf

     

           配置文件整体分两部分:         

                全局参数 :对于rsync服务器生效。如果模块参数和全局参数冲突,

                            针对冲突模块的参数生效         

                模块参数:定义rsync 输出的目录的参数。


    2,创建备份帐户,最后把rsync 以daemon方式运行。


    (1)创建配置文件:

    [root@xuegod63 Desktop]# vim /etc/rsyncd.conf  #这个文件不存在,需要自己创建
    
    uid=nobody
    gid=nobody
    address = 192.168.1.63
    port=873
    hosts allow= 192.168.1.64
    #hosts deny=0.0.0.0/32
    use chroot=yes
    max connections=5
    pid file=/var/run/rsyncd.pid
    lock file=/var/run/rsync.lock
    log file=/var/log/rsyncd.log
    motd file=/etc/rsyncd.motd
     
    [wwwroot]      
    path=/var/www/html
    comment=rsync wwwroot of www.xuegod.cn
    read only=yes
    list=yes
    auth users=backuper
    secrets file=/etc/rsync.passwd

    

    

    (2)此配置文件参数说明:

    全局参数
    
    uid=nobody                                     # 运行进程的身份
    
    gid=nobody                                     # 运行进程的组
    
    address = 192.168.1.63                         # 监听IP地址
    
    port=873                                       # 端口
    
    hosts allow= 192.168.1.64 192.168.0.25         # 允许同步的客户端IP地址
    
        单个IP地址,例如:192.167.0.1,多个IP或网段需要用空格隔开,
        整个网段,例如:192.168.0.0/24,也可以是192.168.0.0/255.255.255.0
        “*”则表示所有,默认是允许所有主机连接。        
        #hosts deny=0.0.0.0/32
        
    use chroot=yes                                #锁定家目录。
        rsync被黑了,黑客无法在rsync运行的家目录之外创建文件,该选项设置为yes。
    
    max connections=5                             # 最大链接数
    
    pid file=/var/run/rsyncd.pid                  # pid文件。存放进程ID。自动生成
    
    lock file=/var/run/rsync.lock                 # 指定支持max connections参数的锁文件
    
    log file=/var/log/rsyncd.log                  # 日志
    
    motd file=/etc/rsyncd.motd                    # 客户端登录后的弹出的信息,需要创建


    模块参数:
    
    [wwwroot]                                   # 共享模块名
    
    path=/var/www/html                          # 供备份的路径
    
    comment=rsync wwwroot of www.xuegod.cn      # 描述,
    
    read only=yes                               # 以只读的方式 提供备份
    
    list=yes                                    # 允许查看模块信息
    
    auth users=backuper                         # 指定备份的用户,和系统用户无关
    
    secrets file=/etc/rsync.passwd              # 指点存放用户和密码文件。
        格式: 用户名:密码

    

    (3)创建提示信息文件,写入以下内容

    [root@xuegod63 ~]# grep motd /etc/rsyncd.conf
    motd file=/etc/rsyncd.motd
    [root@xuegod63 ~]# echo "welcome to backupserver"  > /etc/rsyncd.motd


    (4)创建密码文件,写入以下内容

    [root@xuegod63 ~]# grep passwd /etc/rsyncd.conf
    secrets file=/etc/rsync.passwd
    [root@xuegod63 ~]# vim /etc/rsync.passwd
    [root@xuegod63 ~]# cat !$
    cat /etc/rsync.passwd
    backuper:pwd123


    (5)修改密码文件权限

    [root@xuegod63 ~]# chmod 600/etc/rsync.passwd
    #设置rsyncd_users.db文件的权限为700或600,权限设置不对的话身份验证会失败
    
    会弹以下出错信息,当然,输错密码后,也会弹这个信息:
    [root@xuegod64 ~]# rsync -avzbackuper@192.168.1.63::wwwroot /web-back/
    welcome to backup server
    Password:
    @ERROR: auth failed on module wwwroot
    rsync error: error starting client-server protocol(code 5) at main.c(1503) [receiver=3.0.6]

    

    (6)启动服务:

    [root@xuegod63 etc]# vim /etc/xinetd.d/rsync
    # default: off
    # description: The rsync server is a good additionto an ftp server, as it     #     allowscrc checksumming etc.
    service rsync
    {
           disable         = no                      # 把yes 改为no
           flags           = IPv6
           socket_type     = stream
           wait            = no
           user            = root
           server          = /usr/bin/rsync
           server_args     = --daemon
           log_on_failure  += USERID
    }
    
    [root@xuegod63 etc]# /etc/init.d/xinetd restart  # 启动服务


    

    (7)测试备份:

    语法:

    rsync  选项  用户名@备份源服务器IP::共享模块名   目标目录     

    [root@xuegod64 ~]# rm -rf /web-back/grub/
    [root@xuegod64 ~]# rsync -azPbackuper@192.168.1.63::wwwroot /web-back/
    welcome to backup server     
    Password: pwd123

   

    实现无交互脚本,备份数据。

    修改环境变量: RSYNC_PAASSWORD

     

   (8) 实现无交互脚本,备份数据:

    修改变量: RSYNC_PAASSWORD

    [root@xuegod64 ~]# exportRSYNC_PASSWORD=pwd123
    [root@xuegod64 ~]# rsync -avzbackuper@192.168.1.63::wwwroot /web-back/


    应用场景:


      多台服务器同步

技术分享


    脚本:

    [root@xuegod64 ~]# vim backup.sh
    [root@xuegod64 ~]# cat !$
    cat backup.sh
    #!/bin/bash
    export RSYNC_PASSWORD=pwd123
    rsync -avz backuper@192.168.1.63::wwwroot/web-back/
    [root@xuegod64 ~]# chmod +x backup.sh
    [root@xuegod64 ~]# rm -rf /web-back/*
    [root@xuegod64 ~]# ./backup.sh


    创建计划任务:

    [root@xuegod64 ~]# crontab -e
    01 3 * * * /root/backup.sh&

     

    添加防火墙规则:     

    [root@xuegod63 ~]# iptables -AINPUT -p tcp --dport 873 -j ACCEPT
    [root@xuegod63 ~]#/etc/init.d/iptables save
    iptables: Saving firewallrules to /etc/sysconfig/iptables:[ OK  ]

    


rsync + inotify实现实时同步


   

    Linux内核从2.6.13版本开始提供了inotify通知接口,用来监控文件系统的各种变化情况,如文件存取、删除、移动等。利用这一机制,可以非常方便地实现文件异动告警、增量备份,并针对目录或文件的变化及时作出响应。


    使用rsync工具与inotify机制相结合,可以实现触发式备份(实时同步),只要原始位置的文档发生变化,则立即启动增量备份操作,否则处于静态等侍状态,这样一来,就避免了按固定周期备份进存在的延迟性、周期过密等问题。


    下载地址:http://sourceforge.net/projects/inotify-tools/

    软件包名: inotify-tools-3.13.tar


常见的开源软件下载网址:

    SourceForge.net,又称SF.net,是开源软件开发者进行开发管理的集中式场所。

    SourceForge 是全球最大开源软件开发平台和仓库,网站建立的宗旨,就是为开源软件提供一个存储、协作和发布的平台。SourceForge 上拥有大量非常优秀的开源软件,事实上,这些软件完全可以代替一些商业软件。



实战4: 把xuegod63.cn服务器上的/var/www/html目录时实同步到xuegod64.cn主机上的/web-back目录中



环境:        

    inotify-tools服务端:xuegod63.cn   IP:192.168.1.63

    客户端:xuegod64.cn   IP:192.168.1.64


    查看是否支持inotify,从kernel 2.6.13开始正式并入内核。

    [root@xuegod63 ~]# uname -r
    2.6.32-220.el6.x86_64
    [root@xuegod63 ~]# ll /proc/sys/fs/inotify/
    root@xuegod63 ~]# ll /proc/sys/fs/inotify/
    total 0
    -rw-r--r-- 1 root root 0 Apr 10 09:09max_queued_events
    -rw-r--r-- 1 root root 0 Apr 10 09:09max_user_instances
    -rw-r--r-- 1 root root 0 Apr 10 09:09 max_user_watches

    注意: 在linux内核中,默认的inotify机制提供了三个调控参数:

    max_queued_events  #表示监控事件队列

    max_user_instances #表示最多监控实例数

    max_user_watches  #表示每个实例最多监控文件数


    查看具体参数值:

    [root@xuegod63 ~]# cat /proc/sys/fs/inotify/max_queued_events
    16384
    [root@xuegod63 ~]# cat /proc/sys/fs/inotify/max_user_instances
    128
    [root@xuegod63 ~]# cat /proc/sys/fs/inotify/max_user_watches
    8192

    注:当要监控的目录、文件数量较多或者变化较频繁时,要加大这三个参数的值。


    例如:可直接修改/etc/sysctl.conf配置文件,将管理队列设为32768,实例数设为1024,监控数设为9000000(建议大于监控目标的总文件数)

    [root@xuegod63 ~]# vim /etc/sysctl.conf    # 以文件最后,添加以下内容
    fs.inotify.max_queued_events= 32768
    fs.inotify.max_user_instances= 1024
    fs.inotify.max_user_watches= 90000000
    [root@xuegod63 ~]#sysctl -p                # 使修改后的sysctl.conf文件生效


    查看是否修改成功:

    [root@xuegod63 ~]#cat /proc/sys/fs/inotify/max_user_watches
    90000000

    


    安装inotify-tools-3.13.tar:

    安装inotify-tools后,将拥有inotifywait、inotifywatch辅助工具程序,从而来监控、汇总文件系统改动情况。

    [root@xuegod63 ~]# tar-zxvf inotify-tools-3.13.tar.gz
    [root@xuegod63 ~]# cdinotify-tools-3.13
    [root@xuegod63inotify-tools-3.13]# ./configure
    [root@xuegod63inotify-tools-3.13]# make -j 4       # 使用4个CPU一起编译。
    [root@xuegod63inotify-tools-3.13]# make  install

    

    测试:

    使用inotifywait命令监控网站目录/var/www/html发生的变化。然后在另一个终端向/var/www/html目录下添加文件、移动文件,查看屏幕输出结果。

    

        # inotifywait -h 

     常用参数:

    -e  用来指定要监控哪些事件。
        这些事件包括: create创建,move移动,delete删除,modify修改文件内容,attrib属性更改。
    
    -m 表示持续监控
    
    -r  表示递归整个目录
    
    -q 表示简化输出信息。

    

[root@xuegod63 ~]#inotifywait -mrq -e create,move,delete,modify /var/www/html/

     

    在另一个终端登录,在/var/www/html目录进行相关的操作,然后,回到原来的终端查看监控变化情况。

    [root@xuegod63 ~]# echoaaa > /var/www/html/a.html
    [root@xuegod63 ~]#mkdir /var/www/html/test
    [root@xuegod63 ~]# cp/etc/passwd /var/www/html/test/
    [root@xuegod63 ~]# rm-rf /var/www/html/test/passwd

 

 

    查看变化:

    [root@xuegod63 ~]#inotifywait -mrq -e create,move,delete,modify /var/www/html/
    /var/www/html/ CREATEa.html
    /var/www/html/ MODIFYa.html
    /var/www/html/CREATE,ISDIR test
    /var/www/html/test/CREATE passwd
    /var/www/html/test/MODIFY passwd
    /var/www/html/test/DELETE passwd

 

    使用inotifywait输出的监控结果中,每行记录中依次包括目录、事件、文件。据此可以识别变动情况。

    编写触发式同步脚本:

     

    第一步,同步时不需要输入密码:

    xuegod63发生变化后,直接将发生变化的数据同步到xuegod64,同步时不需要输入密码

    [root@xuegod63 ~]#ssh-keygen
    [root@xuegod63 ~]#ssh-copy-id root@192.168.1.64
    [root@xuegod63 ~]# ssh192.168.1.64
    Last login: Wed Nov 1217:51:35 2014

 

 

    第二步:编写触发式同步脚本

    参考以下脚本:

    [root@xuegod63~]# cat a.sh
    #!/bin/bash
    echo  aaa bbb ccc  | while read a b c
    do
        echo $a
        echo $b
        echo $c
    done

 

    思路: 只要检测到变动或事件时,执行rsync上行同步操作即可。

    [root@xuegod63 ~]#inotifywait -mrq -e create,move,delete,modify /var/www/html/
    /var/www/html/   CREATE  a.html
     
    [root@xuegod63~]# cat a.sh
    #!/bin/bash
    inotifywait-mrq -e create,move,delete,modify /var/www/html/  | while read a b c
    do
        rsync -azP --delete /var/www/html/root@192.168.1.64:/web-back              
    done

 

    优化此脚本:

    [root@xuegod63~]# cat a.sh
    #!/bin/sh
    SRC=/var/www/html
    DST=root@192.168.1.64:/web-back
     
    inotifywait-mrq -e modify,delete,create,attrib ${SRC} | while read D E F 
    do
        /usr/bin/rsync -ahqzt --delete$SRC $DST
    done
     
    [root@xuegod63~]# cp /root/a.sh /opt/inotify_rsync.sh
    [root@xuegod63~]# echo ‘/opt/inotify_rsync.sh &‘ >> /etc/rc.local

 

 

    再次优化:

    注意,当更新较频繁时,应避免并发执行rsync备份(当rsync进程已经存在,则忽略本次同步,或根据rsync进程数量来决定是否同步)

     

    [root@xuegod63 ~]# vim/opt/inotify_rsync.sh
    #!/bin/sh
    
    SRC=/var/www/html
    DST=root@192.168.1.64:/web-back
     
    inotifywait -mrq -emodify,delete,create,attrib ${SRC} | while read D E F 
    do
        a=`pgrep rsync | wc -l`
        if [ $a -le 3 ]; then
            /usr/bin/rsync -ahqzt --delete$SRC $DST
        fi 
    done

    注:进程数保留3个就可以了。


本文出自 “学神IT-Linux讲师-MK” 博客,请务必保留此出处http://xuegod.blog.51cto.com/9708186/1633669

使用rsync实现服务器数据备份

标签:rsync + inotify rsync + ssh

原文地址:http://xuegod.blog.51cto.com/9708186/1633669

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!