rsync+inotify实现数据的实时备份

一、rsync介绍

rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。

  • rsync功能:

    1)作为命令,实现本地-远程文件同步
    2)作为服务,实现本地-远程文件同步

  • rsync特点:
    1)可以镜像保存整个目录树和文件系统
    2)可以保留原有的权限(permission,mode),owner,group,时间(修改时间,modify time),软硬链接,文件acl,文件属性(attributes)信息等
    3)传输效率高,使用同步算法,只比较变化的
    4)支持匿名传输,方便网站镜像;也可以做验证,加强安全

  • rsync同类服务:
    1)sync 同步:刷新文件系统缓存,强制将修改过的数据块写入磁盘,并且更新超级块。
    2)async 异步:将数据先放到缓冲区,再周期性(一般是30s)的去同步到磁盘。
    3)rsync 远程同步:remote synchronous

  • rsync传输方式 :
    rsync 的传输方式至少可以通过三种方式来运作:
    1)在本机上直接运行,用法就与 cp 几乎一模一样,例如:
    rsync -av /etc /tmp (将 /etc/ 的数据备份到 /tmp/etc 内)
    2)通过 rsh 或 ssh 的信道在 server / client 之间进行数据传输,例如:rsync -av -e ssh [email protected]:/etc /tmp (将 rsh.server 的 /etc 备份到本地主机的 /tmp 内)
    3)直接通过 rsync 提供的服务 (daemon) 来传输,此时 rsync 主机需要启动 873 port:要求如下
    1.你必须要在 server 端启动 rsync,看 /etc/xinetd.d/rsync 即可
    2.你必须编辑 /etc/rsyncd.conf 配置文件
    3.你必须设定好 client 端联机的密码数据
    4.在 client 端可以利用:
    rsync -av user@hostname::/dir/path /local/path

二、 rsync语法

语法:
rsync [-avrlptgoD] [-e ssh] [user@host:/dir] [/local/path]
选项与参数:
-v :查看模式,可以列出更多的信息,包括镜像的文件名等;
-q :与 -v 相反,安静模式,略过正常信息,仅显示错误讯息;
-r :递归复制!可以针对“目录”来处理。
-u :仅更新 (update),若目标文件较新,则保留新文件不会覆,即不同步;
-l :复制链接文件的属性,而非链接的目标源文件内容,也就是保留软连接。
-L :加上该选项后,同步软链接时会把源文件给同步
-p :复制时,连同属性 (permission) 也一并复制。
-g :保存源文件的拥有属组;
-o :保存源文件的属主;
-D :保存源文件的设备属性 (device)
-t :保存源文件的时间参数;
-I :忽略更新时间 (mtime) 的属性,文件比对上会比较快速;
-z :在数据传输时,加上压缩的参数!
-e :使用的信道协议,例如使用 ssh 通道,则 -e ssh
-a :相当于 -rlptgoD ,所以这个 -a 是最常用的参数了
–delete :删除DEST中SRC没有的文件
–exclude :过滤指定文件,如–exclude “logs”会把文件名包含logs的文件或者目录过滤掉,不同步。
例如: 将本机 /etc 的数据备份到 /tmp 目录下:

  rsync -av /etc /tmp

三、rsync同步方式进一步说明

  • rsync通过ssh方式同步
    推文件:把本地文件同步到远端服务器
    例如把本地/tmp目录下内容复制到远端服务器192.168.100.10下的student用户家目录下。

    rsync -av /tmp  [email protected]:~ 
    [email protected]'s password:  <==输入对方主机的 student 密码
    receiving file list ... done
    

    拉文件:把远端的内容复制到本机
    例如:利用 student 的身份登录远程主机192.168.100.10 将其目录复制到本机 /tmp

    rsync -av  [email protected]:~  /tmp 
    [email protected]'s password:  <==输入对方主机的 student 密码
    receiving file list ... done
    

    使用-e “ssh -p 22” 指定端口:

    rsync -av -e ssh [email protected]:~  /tmp 
    rsync -av -e "ssh -p 22" [email protected]:~  /tmp 
    
  • rsync 通过服务(daemon)的方式同步
    server端配置:
    在server端主要有三个个文件rsync.conf、rsyncd.passwd和rsyncd.motd
    1)编辑配置文件/etc/rsyncd.conf
    2)启动服务rsync --daemon
    3)格式:rsync -av test1/ [email protected]::test/
    rsyncd.conf样例:

    #port=873
    motd file =/etc/rsyncd.motd #欢迎文件
    log file=/var/log/rsync.log
    pid file=/var/run/rsyncd.pid
    lock file=/var/run/rsyncd.lock
    #address=192.168.31.25
    use chroot=no
    max connections=100
    read only=false
    list=true
    uid=rsync
    gid=rsync
    auth users=rsync  #rsync用户与linux用户无关。
    secrets file=/etc/rsyncd.passwd
    hosts allow=192.168.31.0/24(多个ip以空格隔开,也可以写ip段:192.168.31.0/24)
    [backup]
    comment=backup by #注释信息
    path=/backup #最好与模块backup名一样加粗样式
    

    rsyncd.conf配置文件详解 :
    port:指定在哪个端口启动rsyncd服务,默认是873端口。
    log file:指定日志文件。
    pid file:指定pid文件,这个文件的作用涉及服务的启动、停止等进程管理操作。
    lock file:指定存放锁的目录
    address:指定启动rsyncd服务的IP。假如你的机器有多个IP,就可以指定由其中一个启动rsyncd服务,如果不指定该参数,默认是在全部IP上启动。
    []:指定模块名,里面内容自定义。
    path:指定数据存放的路径。
    use chroot true|false:表示在传输文件前首先chroot到path参数所指定的目录下。这样做的原因是实现额外的安全防护,但缺点是需要以roots权限,并且不能备份指向外部的符号连接所指向的目录文件。默认情况下chroot值为true,如果你的数据当中有软连接文件,阿铭建议你设置成false。
    max connections:指定最大的连接数,默认是0,即没有限制。
    read only ture|false:如果为true,则不能上传到该模块指定的路径下。
    list:表示当用户查询该服务器上的可用模块时,该模块是否被列出,设定为true则列出,false则隐藏。
    uid/gid:指定传输文件时以哪个用户/组的身份传输。
    auth users:指定传输时要使用的用户名。
    secrets file:指定密码文件,该参数连同上面的参数如果不指定,则不使用密码验证。注意该密码文件的权限一定要是600。格式:用户名:密码
    hosts allow:表示被允许连接该模块的主机,可以是IP或者网段,如果是多个,中间用空格隔开。
    当设置了auth users和secrets file后,客户端连服务端也需要用用户名密码了,若想在命令行中带上密码,可以设定一个密码文件

    rsync -avL [email protected]::backup /tmp/test/ --password-file=/etc/pass
    #92.168.31.130::backup这个backup是模块
    

    其中/etc/pass内容就是一个密码,权限要改为600
    注意:配置文件里面不能有注释否则同步时出现以下错误:
    rsync -avz /tmp/ [email protected]::data – password-file=/etc/rsyncd.passwd
    @ERROR: chdir failed
    rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]
    编辑rsyncd.motd

    vim /etc/rsyncd.motd
    welcome to use rsync-services!  #欢迎信息
    

    编辑密码文件rsyncd.passwd
    格式为:
    用户名:密码(auth users设置值一样)

    echo  "rsync:123" >/etc/rsyncd.passwd
    #用户与auth users设置值一样
    
    授权:权限设置为600其他用户不能读取、
    chmod 600 /etc/rsyncd.passwd
    

    创建服务端共享目录backup

       mkdir /backup
    

    创建指定传输文件时所用的用户rsync

       useradd rsync -s /sbin/nologin -M 
       #创建虚拟用户rsync
    

    授权虚拟用户rsync对/backup目录操作权限

         chown -R rsync.rsync /backup/
         #改变属主
    

    启动rsync 服务

          rsync --daemon  #启动rsync服务端服务
        netstat --lntup|grep rsync  #查看启动情况
        echo "rsync --daemon" >/etc/rc.local  #加入开机启动
    

    客户端配置
    创建密码文件

      echo "123" > /etc/pass #客户端只要写入密码即可,因为用户就是连接的用户
      chmod 600 /etc/pass  #改变权限
    

    客户端rsync语法如下:

    Access via rsync daemon:
      Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
            rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
            #拉命令
      Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
            rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
            #推命令
    

    例如:将/tmp/目录下的内容推到远端服务器共享目录/backup下

       rsync -avzL /tmp/  [email protected]::backup --password-file=/etc/pass#第一种方法
       rsync -avzL /tmp/  rsync://[email protected]/backup  --password-file=/etc/pass #第二种方法
    

    例如:将rc.local和cron内容定时备份
    写一个bak.sh脚本然后放到定时任务里。

     vim /server/scripts/bak.sh
      #!/bin/sh
     path=/backup
      dir="`ifconfig eth0|awk -F '[ :]+' 'NR==2 {print $4}'`_$(date +%F)"
       mkdir $path/$dir -p &&\
      /bin/cp /var/spool/cron/root $path/$dir/cron_root_$(date  +%F)
      /bin/cp /etc/rc.local $path/$dir/rc.local_root_$(date  +%F)
       rsync -az $path/ [email protected]::backup/ --password- file=/etc/pass
    
     crontab -e
     0 01 * * * /bin/sh/server/scripts/bak.sh >/dev/null 2>&1   #每天一点同步
    

四、rsync的优点与不足

rsync与传统的cp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等。
随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足,首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因,rsync+inotify组合出现了!

五、inotify概述

Inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件。
rsync可以实现触发式的文件同步,但是通过crontab守护进程方式进行触发,同步的数据和实际数据会有差异,而inotify可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync同步,这样刚好解决了同步数据的实时性问题。

六、安装rsync软件

要在在客户端安装rsync软件(需要备份的服务器上安装)。
查看服务器内核是否支持inotify

 ll /proc/sys/fs/inotify

安装inotify-tools

 yum install make  gcc gcc-c++  #安装编译工具

inotify-tools下载地址:http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz

上传inotify-tools-3.14.tar.gz到/usr/local/src目录下

cd /usr/local/src

tar zxvf inotify-tools-3.14.tar.gz  #解压
cd inotify-tools-3.14 #进入解压目录

./configure --prefix=/usr/local/inotify  #配置

make  #编译

make install  #安装

设置系统环境变量,添加软连接

 echo "PATH=/usr/local/inotify/bin:$PATH" >>/etc/profile.d/inotify.sh

source /etc/profile.d/inotify.sh  #使设置立即生效

echo "/usr/local/inotify/lib" >/etc/ld.so.conf.d/inotify.conf

ln -s /usr/local/inotify/include  /usr/include/inotify

修改inotify默认参数(inotify默认内核参数值太小)
在/proc/sys/fs/inotify目录下有三个文件。
max_user_watches:设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
max_user_instances:设置每个用户可以运行inotifywait或inotifywtch命令进程数
max_queued_events:设置inotify实例事件(event)队列可容纳的事件数量。

echo “50000000” >/proc/sys/fs/inotify/max_user_watches
echo “50000000” >/proc/sys/fs/inotify/max_queued_events
echo "65535" >/proc/sys/fs/inotify/max_user_instances

例如:测试客户端/data目录变化

/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e modify,delete,create,attrib,close_write /data  #代表监控的事件是属性,删除,创建修改
#实际上只要delete,create,close_write这几个就可以

创建脚本,实时触发rsync进行同步

 mkdir -p /server/scripts
 vim inotify.sh 
 #!/bin/bash
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e modify,delete,create,attrib,close_write /data | while read file
do
cd /data &&
 /usr/bin/rsync -az --progress ./ [email protected]::web_log --password-file=/etc/rsync.pass
 /usr/bin/rsync -az --delete --progress ./  [email protected]::web_log --password-file=/etc/rsync.pass
echo "${file} was rsynced" >> /var/log/rsync.log 2>&1
done

添加脚本执行权限

chmod +x /server/scripts/inotify.sh

设置脚本开机自动执行

vi /etc/rc.local
/bin/sh /server/scripts/inotify.sh &

你可能感兴趣的:(备份)