linux服务篇-RSYNC数据备份

2023-11-15

Rsync(remote sync)是UNIX及类UNIX平台下一款神奇的数据镜像备份软件,它不像FTP或其他文件传输服务那样需要进行全备份,Rsync可以根据数据的变化进行差异备份,从而减少数据流量,提高工作效率。你可以使用它进行本地数据或远程数据的复制,Rsync可以使用SSH安全隧道进行加密数据传输。Rsync服务器端定义源数据,Rsync客户端仅在源数据发生改变后才会从服务器上实际复制数据至本地,如果源数据在服务器端被删除,则客户端数据也会被删除,以确保主机之间的数据是同步的。

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

RSYNC=Remote Sync 远程同步

官方网站:rsync

Author: Andrew Tridgell, Wayne Davison, and others

              Andrew Tridgell是Samba项目的领导者和主要开发人员,同时还在参与开发rsync、Linux Kernel。

rsync --version                            #查看rsync版本,可以看到相关作者相信

rsync  version 3.0.6  protocol version 30

Copyright (C) 1996-2009 by Andrew Tridgell, Wayne Davison, and others.

Web site: http://rsync.samba.org/

……

与SCP的比较:      scp=无法备份大量数据,类似windows的复制

                            rsync=变复制 ,边统计,边比较

Rysnc特性和优点

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

可以很容易做到保持原来文件的权限、时间、软硬链接等等。

无须特殊权限即可安装。

快速:第一次同步时 rsync 会复制全部内容,但在下一次只传输修改过的文件。

压缩传输:rsync 在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽。

安全:可以使用scp、ssh等方式来传输文件,当然也可以通过直接的socket连接。

支持匿名传输,以方便进行网站镜象。

选择性保持:符号连接,硬链接,文件属性,权限,时间等

常见备份分类

完整备份,差异备份,增量备份

       完整备份:每次备份都是从备份源将所有的文件或目录备份到目的地

差量备份:备份上次完全备份以后有变化的数据(他针对的上次的完全备份,他备份过程中不清除存档属性)

增量备份:备份上次备份以后有变化的数据.(他才不管是那种类型的备份,有变化的数据就备份,他会清除存档属性)

运行模式和端口

       采用C/S模式(客户端/服务器模式)[ 就是一个点到点的传输,直接使用rsync命令 ]

       端口873

发起端和备份源

四个名词的解释:

       发起端:负责发起rsync同步操作的客户机叫做发起端,通知服务器我要备份你的数据

       备份源:负责相应来自客户机rsync同步操作的服务器脚在备份源,需要备份的服务器

       服务端:运行rsyncd服务,需要备份的服务器

       客户端:存放备份数据

RSYNC工作模式:

Rsync有四种工作模式,具体如下:

1、列表模式

      和ls -l相似,负责列出源的内容。不仅可以看本地还可以看远端。

2、shell模式,也称为本地模式

      和cp相似,本地拷贝文件

3、远程shell模式,可以通过通过rcp,ssh等通道传输

      和rcp相似,不过可以实现增量备份,并且能够通过安全的ssh方式进行数据传输。

4、服务器模式

      在这种模式下,rsync 守护进程在一台机器上永久运行,接收文件传输请求。可以把文件发送给守护进程,也可以向它请求文件。服务器模式非常适合创建中心备份服务器或项目存储库。

rsync的四种模式

1、列表模式(list mode)

     Rsync的列表模式,即等同于在实现 ls -l 的功能。我们可以通过分别执行rsync和ls命令来观察区别。

[root@rsync-server /]# rsync /rsync

drwxr-xr-x        4096 2014/06/04 00:45:06 rsync

[root@rsync-server /]# rsync /rsync/

drwxr-xr-x        4096 2014/06/04 00:45:06 .

-rw-r--r--           0 2014/06/04 00:45:01 a

-rw-r--r--           0 2014/06/04 00:45:03 b

-rw-r--r--           0 2014/06/04 00:45:05 c

-rw-r--r--           0 2014/06/04 00:45:06 d

[root@rsync-server /]# ls -dl /rsync

drwxr-xr-x. 2 root root 4096 Jun  4 00:45 /rsync

[root@rsync-server /]# ls -l /rsync

total 0

-rw-r--r--. 1 root root 0 Jun  4 00:45 a

-rw-r--r--. 1 root root 0 Jun  4 00:45 b

-rw-r--r--. 1 root root 0 Jun  4 00:45 c

-rw-r--r--. 1 root root 0 Jun  4 00:45 d

通过上面的输出,可以看出来,rsync后跟文件或目录和ls -l后跟文件和目录的效果大体相同(不一样的细节,这里不多描述)。需要注意的是,如果你身处某个目录,你ll能查看到所在目录下文件列表的详细信息。但是你执行rsync会报错,因此rsync必须后跟文件或目录才能查看相关的详细信息。

     另外,rsync的列表模式是支持对远端的目录进行查看的,而ls -l是不具备这个功能的。

2、Shell模式(shell mode)

     在 RSYNC 的 shell 模式(本地模式)中,我会列举rsync命令的用法和常规选项信息。

     首先来看下 RSYNC 的命令语法:

rsync [OPTION]... SRC [SRC]... DEST

执行rsync --help可得到上面输出,当然输出不仅仅只有上面这一条,我仅仅将shell模式的语句摘了出来。下面对该条语句进行拆解。

 rsync  [OPTION]...  SRC  [SRC]...  DEST

1)rsync为同步的命令

2)[OPTION]... 为同步时的参数选项

3)SRC为源,即需要拷贝的分区,文件或目录等

4)[DEST]为目地分区,文件或目录等

   需要注意的是:rsync命令在使用中,如果源参数的末尾有斜线,就会复制指定目录内的内容,而不复制目录本身;如果没有斜线,则会复制目录本身。目标参数的末尾有没有斜线都不影响。

    接下来,请看下面两个例子:

[root@rsync-server /]# rsync -a /rsync /backup  #会把目录rsync直接同步至/backup目录中去

[root@rsync-server /]# rsync -a /rsync/ /backup #会把目录中的data/中的内容同步至/backups目录中

现在,我们在shell模式下,进行rsync的同步。

实例1:测试本地rsync同步

[root@rsync-server ~]# mkdir /rsync     #创建rsync测试目录

[root@rsync-server ~]# touch /rsync/test    #在rsync测试目录下建立test.txt文件[root@rsync-server ~]# chmod -R 700 /rsync     #授权一下以查看同步后是不是保持了权限属性

[root@rsync-server rsync]# ll -a /rsync/

total 8

drwx------.  2 root root 4096 Jun  4 01:01 .

dr-xr-xr-x. 26 root root 4096 Jun  4 01:01 ..

-rwx------.  1 root root    0 Jun  4 01:01 test

[root@rsync-server ~]# rsync -avz /rsync/ /tmp

sending incremental file list

./test

sent 78 bytes  received 34 bytes  224.00 bytes/sec

total size is 0  speedup is 0.00

[root@rsync-server ~]# ls -l /tmp/test

-rwx------. 1 root root 0 Jun  4 01:01 /tmp/test

上面的例子,演示了将本地/rsync目录下的文件,同步到/tmp目录下。其中使用的参数,-avz上面讲过。如果不明白,可以去上面看每个参数的详细介绍。

3、远程shell模式(remote shell mode)

远程shell模式的话,和shell模式是异曲同工。只不过,因为是要通过远程,因此我们需要指定远程主机的IP,如果采用ssh我们还需要指定ssh的端口等等。

远程shell模式,常规分为如下两种情况,其语法分别为:

拉取pull :rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST

推送push:rsync [OPTION]... [USER@]HOST:SRC [DEST]

下面为大家拆解一下命令:

1)Rsync为同步的命令

2)[OPTION]... 为同步时的参数选项

3)[USER@]HOST... 为Rsync同步的远程的连接用户和主机地址

4)SRC为源,即需要拷贝的分区、文件或目录等,和HOST之间用一个冒号连接

5)[DEST]为目地分区、文件或目录等

大家可以发现,拉取和推送,不一样的地方就是源和目标换了位置。其中拉取,表示从远端主机把数据同步到执行命令的本地主机相应目录。(需要注意,拉取的话,远端主机上一定要安装rsync,不然会拉取失败)。推送,表示从本地主机执行命令把本地的数据同步到远端主机指定目录下

 拉取实例:

    老大要求拉取172.16.100.1这台服务器上的etc目录到我们的备份服务器172.16.100.2上的/backup目录下。

操作:

通过ssh连接到172.16.100.1这台服务器上,然后执行如下命令:

[root@rsync-server ~]# rsync -vzrtopg --progress -e ‘ssh -p 22’ root@172.16.100.1:/etc /backup

语法说明:

1)-vzrtopg 相当于上文的-avz,表示同步时文件和目录属性不变。

2)--progress 显示同步的过程,可以用-p替换

3)-e ‘ssh -p 22’,表示通过ssh的通道传输数据。如果ssh是默认的22号端口,此处的-p 22可省略。

4)root@192.168.1.111:/etc 远程的主机用户,地址,路径

5)/backup本地(172.16.100.2)的路径

推送实例:

公司内部有一台svn服务器(172.16.100.2),公司站点的更新代码通过后台的测试服务器测试之后,经过svn同步到svn服务器。老大要求你将svn服务器上的代码,推送到前台的服务器(172.16.100.1)上。

操作:通过ssh连接到svn服务器(172.16.100.2)上,然后执行如下命令

[root@rsync-server ~]# rsync -avz --progress -e ‘ssh -p 22’ /webrepo root@172.16.100.1:/data/web/html

特别说明:

1)上面两个例子中的数据同步都是加密传输的,因为是通过ssh通道进行数据传输的。

2)在传输前需要进行连接用户(一般为系统用户)密码验证,需要手工输入。这里我们可以通过配置ssh互信来实现免验证方式同步。

3)rsync软件必须安装在本地及远程服务器上

4、服务模式(daemon mode)

RSYNC的服务模式,部署时分为rsync的服务端和rsync的客户端。需要注意的是,rsync 的服务端和客户端都是一个软件包,如果你启用了 rsync 的服务模式,则该主机就变成 rsync 服务器。因此我们需要将 rsync 分别安装于服务端和客户端,服务端和客户端使用同一个 rsync 软件包来实现远程镜像和定期同步更新。

rsync 服务端可同时备份多个客户端的数据,多个服务端备份一个客户端的数据。 rsync 默认端口为 873,服务器在该端口接收客户的匿名或者认证方式的备份请求。

rsync 服务端在使用之前需要进行必要的配置,其配置文件为 /etc/rsyncd.conf,该文件默认没有,需要自己手动创建。Rsync服务端通过/etc/rsyncd.conf进行认证、访问、日志记录等控制,该配置文件包括全局参数、模块参数等设置。

rsyncd.conf 文件中 [module] 之前的所有参数为全局参数,也可以在全局参数部分定义模块参数。在这种情况下该参数的值就是所有模块的默认值。全局参数设置程序使用的端口号,指定消息文件、日志文件 pid 文件以及发送日志消息的级别。模块参数主要定义服务端哪个目录需要被同步。用户可根据不同的需要指定多个模块,每个模块对应需要备份的一个目录树,即若有 N 个需要备份的目录树,则需要 N 个模块与之对应。模块中可以定义许多参数。

本章节主要讲解服务模式。

数据同步方式

推push:一台主机负责吧数据传送给其他主机,服务器开销很大,比较适合后端服务器少的情况

拉pull: 所有主机定时去找一主机拉数据,可能就会导致数据缓慢

推:目的主机配置为rsync服务器,源主机周期性的使用rsync命令把要同步的目录推过去

              拉:源主机配置为rsync服务器,目的主机周期性的使用rsync命令把要同步的目录拉过来

两种方案,rsync都有对应的命令来实现

Xinetd管理Rsync工作原理

使用rsync来同步是先通过xinetd监听873号端口,如果rsync进来的是873号端口,那么xinetd就会通知它所管辖的rsync服务来做回应,接下来就是rsync俩服务于之间的通讯

rsync服务安装(kernal 2.6以前版本)

       实验拓扑:

taijitao63(Server 192.168.1.63)=====================taijitao64(Client 192.168.1.64)

Rsync服务依赖Xinetd,是使用超级服务来管理的

[root@taijitao63 ~]# rpm -ivh /media/Packages/xinetd-2.3.14-39.el6_4.x86_64.rpm

       [root@taijitao63 ~]# rpm -ivh /media/Packages/rsync-3.0.6-9.el6_4.1.x86_64.rpm  

       [root@taijitao63 ~]# vim /etc/xinetd.d/rsync

# default: off

# description: The rsync server is a good addition to an ftp server, as it \

#       allows crc 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@taijitao63 ~]# /etc/init.d/xinetd restart

       [root@taijitao63 ~]# netstat -antup | grep 873

tcp        0      0 :::873                      :::*              LISTEN      2349/xinetd

我们需要注意的是,源码安装的rsync默认是没有加入xinetd的,因此你会发现,在/etc/xinetd.d目录下找不到rsync文件。

rsync服务安装(kernal3.10以后版本)

       服务器端配置:

  使用CentOS 7系统安装部署Rsync非常方便,安装光盘以及YUM源中都提供了rsync软件包,使用YUM方式安装即可。下面的案例演示了如何共享/common目录,为此,我们需要创建/common目录,并复制一些测试文件存放在该目录下。本例需要手动创建配置文件/etc/rsync.conf,该文件具体的语法格式在后面有详细的描述。

[root@taijitao63 ~]# yum install -y rsync

[root@taijitao63 ~]# mkdir /common; cp /etc/init.d/* /common/

[root@taijitao63 ~]# vim /etc/rsync.conf

#/etc/rsyncd.conf

motd file = /etc/rsyncd.motd   #设置服务器信息提示文件名称,在该文件中编写提示信息

transfer logging = yes  #开启Rsync数据传输日志功能

log file =/var/log/rsyncd.log #设置日志文件名称,可以通过log format参数设置日志格式

pid file =/var/run/rsyncd.pid #设置Rsync进程号保存文件名称

lock file =/var/run/rsync.lock #设置锁文件名称

strict modes = yes  #指定是否检查口令文件的权限

port = 873             #设置服务器监听的端口号,默认为873

address = 192.168.0.254       #设置服务器所监听网卡接口的IP地址,这里服务器IP地址为192.168.0.254

uid = nobody #设置进行数据传输时所使用的账户名称或ID号,默认使用nobody

gid = nobody #设置进行数据传输时所使用的组名称或GID号,默认使用nobody

use chroot = no            #设置user chroot为yes后,rsync会首先进行chroot设置,将根映射到path参数路径下,对客户端而言,系统的根就是path参数所指定的路径。但这样做需要root权限,并且在同步符号连接资料时仅会同步名称,而内容将不会同步。

read only = yes             #是否允许客户端上传数据,这里设置为只读。

max connections = 10   #设置并发连接数,0代表无限制。超出并发数后,如果依然有客户端连接请求,则将会收到稍后重试的提示消息

#模块,Rsync通过模块定义同步的目录,模块以[name]的形式定义,这与Samba定义共享目录是一样的效果。在Rsync中也可以定义多个模块

[common]   #自定义模块

comment = Web content             #comment定义注释说明字串

path = /common           #同步目录的真实路径通过path指定

ignore errors  #忽略一些IO错误

#exclude = test/    #exclude可以指定例外的目录,即将common目录下的某个目录设置为不同步数据

auth users = tom,jerry   #设置允许连接服务器的账户,账户可以是系统中不存在的用户

secrets file = /etc/rsyncd.secrets  #设置密码验证文件名称,注意该文件的权限要求为只读,建议权限为600,仅在设置auth users参数后有效

hosts allow=192.168.0.0/255.255.255.0 #设置允许哪些主机可以同步数据,可以是单个IP,也可以是网段,多个IP与网段之间使用空格分隔

hosts deny=*         #设置拒绝所有(除hosts allow定义的主机外)

list= false        #客户端请求显示模块列表时,本模块名称是否显示,默认为true

read only = false  # 设定是否允许客户上载文件。若为 true 任何上载请求均会失败,若为 false 且客户端拥有服务器目录读写权限则可以上载。默认值为 true 。

write only 设定是否允许客户下载文件。若为 true 任何下载请求均会失败,默认值为 false 。

Dont commpress # 指定不进行压缩处理即可传输的文件,默认值是 *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz

exclude = common/   # 用来指定多个由空格隔开的多个文件或目录 ( 相对路径 ),并将其添加到 exclude 列表中。这等同于在客户端命令中使用 --exclude 参数。一个模块只能指定一个 exclude 选项。但是需要注意的一点是该选项有一定的安全性问题,客户端很有可能绕过 exclude 列表,如果希望确保特定的文件不能被访问,那就最好结合 uid/gid 选项一起使用。

pre-xfer exec, post-xfer exec  # 设置可在文件传输前/后执行的命令。若在文件传输前执行的命令失败,则取消本次传输操作。

接下来,通过echo的方式创建密码文件/etc/rsyncd.secrets,在该文件中输入两个账户:tom账户的密码是pass,jerry账户的密码是111。需要注意的是,密码文件不可以对所有的人开放可读权限,为了安全,建议设置权限为600。创建服务器提示信息文件并向该文件中导入欢迎词。由于Rsync默认不是开机启动服务,为了实现开机启动Rsync服务,我们可以通过echo将rsync --daemon追加至开机启动文件/etc/rc.local。最后通过设置防火墙开启873端口的入站数据请求。

[root@centos7 ~]# useradd tom

[root@centos7 ~]# useradd jerry

[root@centos7 ~]# echo pass |passwd --stdin tom

[root@centos7 ~]# echo “111” |passwd --stdin jerry

[root@centos7 ~]# echo "tom:pass" > /etc/rsyncd.secrets

[root@centos7 ~]# echo "jerry:111" >> /etc/rsyncd.secrets

[root@centos7 ~]# chmod 600 /etc/rsyncd.secrets

[root@centos7 ~]# echo “welcome to access” >/etc/rsyncd.motd

[root@centos7 ~]# rsync --daemon --config=/etc/rsyncd.conf  #注意如果你的rsyncd.conf文件在/etc/目录下,就不需要再用--config去指定了。--daemon是以守护进程的方式启动  #启动rsync服务

[root@centos7 ~]# echo “/usr/bin/rsync --daemon” >> /etc/rc.local

[root@centos7 ~]# firewall-cmd --permanent --add-port=873/tcp  #添加防火墙规则,允许873端口的数据访问

客户端同步数据

 现在让我们开始同步数据吧,在客户端主机中同样是使用rsync命令进行初始化数据传输,使用同样的程序,但客户端主机不需要--daemon选项。

[root@centos7 ~]# yum -y install rsync

[root@centos7 ~]# rsync -vzrtopg --progress tom@192.168.0.254::common /test

rsync命令

       rsync命令和scp命令很相似

-v, --verbose 详细模式输出 
       -q, --quiet 精简输出模式 
       -c, --checksum 打开校验开关,强制对文件传输进行校验 
       -R, --relative 使用相对路径信息 
       -b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。 
       --backup-dir 将备份文件(如~filename)存放在在目录下。 
       -suffix=SUFFIX 定义备份文件前缀 
       -L, --copy-links 想对待常规文件一样处理软链结 
       --copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结 
       --safe-links 忽略指向SRC路径目录树以外的链结 
       -S, --sparse 对稀疏文件进行特殊处理以节省DST的空间 
       -n, --dry-run现实哪些文件将被传输 
       -W, --whole-file 拷贝文件,不进行增量检测 
       -x, --one-file-system 不要跨越文件系统边界 
       -B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节 
       -e, --rsh=COMMAND 指定使用rsh、ssh方式进行数据同步 
       --rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息 
       -C, --cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件 
       --existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件 
       --delete-excluded 同样删除接收端那些被该选项指定排除的文件 
       --delete-after 传输结束以后再删除 
       --ignore-errors 及时出现IO错误也进行删除 
       --max-delete=NUM 最多删除NUM个文件 
       --partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输 
       --force 强制删除目录,即使不为空 
       --numeric-ids 不将数字的用户和组ID匹配为用户名和组名 
       --timeout=TIME IP超时时间,单位为秒 
       -I, --ignore-times 不跳过那些有同样的时间和长度的文件 
       --size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间 
       --modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0 
       -T --temp-dir=DIR 在DIR中创建临时文件 
       --compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份 
       -P 等同于 --partial 
       --progress 显示备份过程 
       --exclude=PATTERN 指定排除不需要传输的文件模式 
       --include=PATTERN 指定不排除而需要传输的文件模式 
       --exclude-from=FILE 排除FILE中指定模式的文件 
       --include-from=FILE 不排除FILE指定模式匹配的文件 
       --address 绑定到特定的地址 
       --config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件 
       --blocking-io 对远程shell使用阻塞IO 
       -stats 给出某些文件的传输状态 
       --progress 在传输时现实传输过程 
       --log-format=formAT 指定日志文件格式 
       --bwlimit=KBPS 限制I/O带宽,KBytes per second 
       -h, --help 显示帮助信息

-a, --archive archive mode 权限保存模式,相当于 -rlptgoD 参数,存档,递归,保持属性等

-r, --recursive 复制所有下面的资料,递归处理

-p, --perms 保留档案权限 ,文件原有属性

-t, --times 保留时间点,文件原有时间

-g, --group 保留原有属组

-o, --owner 保留档案所有者(root only)

-D, --devices 保留device资讯(root only)

-l, --links 复制所有的连接 ,拷贝连接文件

-z, --compress 压缩模式, 当资料在传送到目的端进行档案压缩.  –azP

-H, --hard-links 保留硬链接文件

-A, --acls 保留ACL属性文件,需要配合--perms

-P,-P参数和 --partial --progress 相同.只是为了把参数简单化,表示传进度

--version, 输出rsync版本

-v , --verbose 复杂的输出信息

-u, --update 仅仅进行更新,也就是跳过已经存在的目标位置,并且文件时间要晚于要备份的文件,不覆盖新的文件

--port=PORT, 定义rsyncd(daemon)要运行的port(预设为tcp 873)

--delete, 删除那些目标位置有的文件而备份源没有的文件

--password-file=FILE ,从 FILE 中得到密码

--filter “-filename”,需要过滤的文件

--exclude=filname,需要过滤的文件

第一种:基于系统用户的备份

第二种 :配置rsyncd服务,用户仅限备份使用

 rsync的几种用法

1.拷贝本地文件,将/home/coremail目录下的文件拷贝到/cmbak目录下

# rsync -avSH /home/coremail/ /cmbak/

2.拷贝本地机器的内容到远程机器

# rsync -av /home/coremail/ 192.168.11.12:/home/coremail/

3.拷贝远程机器的内容到本地机器

# rsync -av 192.168.11.11:/home/coremail/ /home/coremail/

4.拷贝远程rsync服务器(daemon形式运行rsync)的文件到本地机。

# rsync -av root@172.16.78.192::www /databack

5.拷贝本地机器文件到远程rsync服务器(daemon形式运行rsync)中。当DST路径信息包含”::”分隔符时启动该模式。

# rsync -av /databack root@172.16.78.192::www

6.显示远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。

# rsync -v rsync://192.168.11.11/data

7、指定密码存放文件,无需输入密码,直接执行rsync传输

# rsync -rvzP  --password-file=/etc/rsync.password  rsync@$192.168.10.175::imgdata/  /data

使用rsync备份数据

对taijitao63网站根目录的/var/www/html目录备份到taijitao64的/web-back

服务端准备

       [root@taijitao63 ~]# useradd rget1

       [root@taijitao63 ~]# useradd rput1

       [root@taijitao63 ~]# echo 123456|passwd --stdin rget1

       [root@taijitao63~]# echo 123456 |passwd --stdin rput1

       [root@taijitao63 ~]# setfacl -R -m user:rput1:rwx /var/www/html

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

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

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

[root@taijitao63 ~]# getfacl /var/www/html

# file: var/www/html

# owner: root

# group: root

user::rwx

user:rput1:rwx

user:rget1:rwx

group::r-x

mask::rwx

other::r-x

default:user::rwx

default:user:rput1:rwx

default:user:rget1:rwx

default:group::r-x

default:mask::rwx

default:other::r-x

客户端同步数据

       [root@taijitao64 ~]# rpm -ivh /media/Packages/rsync-3.0.6-12.el6.x86_64.rpm

       [root@taijitao64 ~]# mkdir /web-back                                           //数据存放目录

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

                                                               //什么用户从哪个设备的哪个目录备份到本地的哪个目录

              ……

rsync: send_files failed to open "/var/www/html/initramfs-2.6.32-431.el6.x86_64.img": Permission denied (13)

……

rsync: send_files failed to open "/var/www/html/initrd-2.6.32-431.el6.x86_64kdump.img": Permission denied (13)

……

rsync: send_files failed to open "/var/www/html/grub/grub.conf": Permission denied (13)

#几行报错,排错

同步数据出错排查

       [root@taijitao63 ~]# getfacl /var/www/html/initramfs-2.6.32-431.el6.x86_64.img

getfacl: Removing leading '/' from absolute path names

# file: var/www/html/initramfs-2.6.32-431.el6.x86_64.img

# owner: root

# group: root

user::rw-

user:rget1:rwx          #effective:---  虽然在前面看到是rwx,但是后面备注上说出有效权限是---

user:rput1:rwx          #effective:---

group::r-x                 #effective:---

mask::---

other::---

       [root@taijitao63 ~]# ll /var/www/html/initramfs-2.6.32-431.el6.x86_64.img

-rwx------+ 1 root root 17497376 Sep 18 14:36 /var/www/html/initramfs-2.6.32-431.el6.x86_64.img

#除开属主之外,其他人没有任何权限

       [root@taijitao63 ~]# chmod 744 /var/www/html/initramfs-2.6.32-431.el6.x86_64.img      //加上权限

[root@taijitao63 ~]# getfacl /var/www/html/initramfs-2.6.32-431.el6.x86_64.img

getfacl: Removing leading '/' from absolute path names

# file: var/www/html/initramfs-2.6.32-431.el6.x86_64.img

# owner: root

# group: root

user::rwx

user:rget1:rwx          #effective:r--                有效权限可读了

user:rput1:rwx          #effective:r--

group::r-x                 #effective:r--

mask::r--

other::r--

同理方法修改

/var/www/html/initrd-2.6.32-431.el6.x86_64kdump.img

/var/www/html/grub/grub.conf

再次客户端测试

       [root@taijitao64 ~]# rm -rf /web-back/*

[root@taijitao64 ~]# rsync -azP --delete rget1@192.168.1.63:/var/www/html/ /web-back/      //没报错

实现无交互数据备份

       [root@taijitao64 ~]# ssh-keygen                       //生成密钥

       [root@taijitao64 ~]# ssh-copy-id rget1@192.168.1.63              //公钥复制给服务器

       [root@taijitao64 ~]# rm -rf /web-back/

[root@taijitao64 ~]# rsync -avzP --delete rget1@192.168.1.63:/var/www/html/ /web-back/   //免密码、

计划任务自动备份

       [root@taijitao64 ~]# vim /root/rsync-ssh-get-wwwroot.sh               //    首先编写脚本

#!/bin/bash

rsync -az --delete rget1@192.168.1.63:/var/www/html/ /web-back/

tar czvf web-back-`date +%Y-%m-%d`.tar.gz /web-back/*       

#这里吧参数P去掉,后期执行备份我们不需要看进度,同步回来我们需要打包它,按日期命名

       [root@taijitao64 ~]# rm -rf /web-back/*

[root@taijitao64 ~]# sh /root/rsync-ssh-get-wwwroot.sh                        //  测试脚本

[root@taijitao64 ~]# ls /web-back/                          //   有以下内容证明是没有什么问题

config-2.6.32-431.el6.x86_64  initramfs-2.6.32-431.el6.x86_64.img    symvers-2.6.32-431.el6.x86_64.gz

efi                           initrd-2.6.32-431.el6.x86_64kdump.img  System.map-2.6.32-431.el6.x86_64

grub                          lost+found                             vmlinuz-2.6.32-431.el6.x86_64

[root@taijitao64 ~]# ls web-back-2015-09-18.tar.gz

web-back-2015-09-18.tar.gz

[root@taijitao64 ~]# chmod +x /root/rsync-ssh-get-wwwroot.sh

       [root@taijitao64 ~]# echo "01 3 * * * sh /root/rsync-ssh-get-wwwroot.sh &" >> /var/spool/cron/root

非系统用户备份数据

使用系统配置文件/etc/rsyncd.conf来备份数据,创建备份账户,最后把rsync以deamon方式运行

/etc/rsyncd.conf配置文件

配置文件分为两部分:全局参数,模块参数

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

模块参数:定义需要通过rsync输出的目录定义的参数

常见的全局参数:

port      #→指定后台程序使用的端口号,默认为873。

uid               #→该选项指定当该模块传输文件时守护进程应该具有的uid,配合gid选项使用可以确定哪些可以访问怎么样的文件权限,默认值是" nobody"。

gid              #→该选项指定当该模块传输文件时守护进程应该具有的gid。默认值为" nobody"。

max connections         #→指定该模块的最大并发连接数量以保护服务器,超过限制的连接请求将被告知随后再试。默认值是0,也就是没有限制。

lock file               #→指定支持max connections参数的锁文件,默认值是/var/run/rsyncd.lock。

motd file      #→" motd file"参数用来指定一个消息文件,当客户连接服务器时该文件的内容显示给客户,默认是没有motd文件的。

log file                #→" log file"指定rsync的日志文件,而不将日志发送给syslog。

pid file                  #→指定rsync的pid文件,通常指定为“/var/run/rsyncd.pid”,存放进程ID的文件位置。

hosts allow =    #→单个IP地址或网络地址   //允许访问的客户机地址

常见的模块参数:主要是定义服务器哪个要被同步输出,其格式必须为“ [ 共享模块名 ]” 形式,这个名字就是在 rsync 客户端看到的名字,其实很像 Samba 服务器提供的共享名。而服务器真正同步的数据是通过 path 来指定的。

Comment             #→给模块指定一个描述,该描述连同模块名在客户连接得到模块列表时显示给客户。默认没有描述定义。

Path                    #→指定该模块的供备份的目录树路径,该参数是必须指定的。

read only      #→yes为只允许下载,no为可以下载和上传文件到服务器

exclude          #→用来指定多个由空格隔开的多个文件或目录(相对路径),将其添加到exclude列表中。这等同于在客户端命令中使用―exclude或----filter来指定某些文件或目录不下载或上传(既不可访问)

exclude from   #→指定一个包含exclude模式的定义的文件名,服务器从该文件中读取exclude列表定义,每个文件或目录需要占用一行

include                #→用来指定不排除符合要求的文件或目录。这等同于在客户端命令中使用--include来指定模式,结合include和exclude可以定义复杂的exclude/include规则。

include from   #→指定一个包含include模式的定义的文件名,服务器从该文件中读取include列表定义。

auth users     #→该选项指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。如果" auth users"被设置,那么客户端发出对该模块的连接请求以后会被rsync请求challenged进行验证身份这里使用的challenge/response认证协议。用户的名和密码以明文方式存放在" secrets file"选项指定的文件中。默认情况下无需密码就可以连接模块(也就是匿名方式)。

secrets file     #→该选项指定一个包含定义用户名:密码对的文件。只有在" auth users"被定义时,该文件才有作用。文件每行包含一个username:passwd对。一般来说密码最好不要超过8个字符。没有默认的secures file名,注意:该文件的权限一定要是600,否则客户端将不能连接服务器。

hosts allow   #→指定哪些IP的客户允许连接该模块。定义可以是以下形式:

    单个IP地址,例如:192.167.0.1,多个IP或网段需要用空格隔开,

    整个网段,例如:192.168.0.0/24,也可以是192.168.0.0/255.255.255.0

*则表示所有,默认是允许所有主机连接。

hosts deny   #→指定不允许连接rsync服务器的机器,可以使用hosts allow的定义方式来进行定义。默认是没有hosts deny定义。

list                #→该选项设定当客户请求可以使用的模块列表时,该模块是否应该被列出。如果设置该选项为false,

可以创建隐藏的模块。默认值是true。

timeout   #→通过该选项可以覆盖客户指定的IP超时时间。通过该选项可以确保rsync服务器不会永远等待一个崩溃的客户端。超时单位为秒钟,0表示没有超时定义,这也是默认值。对于匿名rsync服务器来说,一个理想的数字是600。

用配置文件定义目录输出

       [root@taijitao63 ~]# vim /etc/rsyncd.conf                 //文件不存在,需要自己创建

uid = nobody                        #运行进程的身份

gid = nobody                        #运行进程的组

address = 192.168.1.63                           #监听IP

port = 873                            #监听端口

hosts allow = 192.168.1.64                         #允许同步客户端的IP地址,可以是网段,或者用*表示所有 192.168.1.0/24或192.168.1.0/255.255.255.0

use chroot = yes                          #是否囚牢,锁定家目录,rsync被黑之后,黑客无法再rsync运行的家目录之外创建文件,选项设置为yes

max connections = 5                               #最大连接数

pid file = /var/run/rsyncd.pid          #进程PID,自动生成

lock file = /var/run/rsync.lock         #指max connectios参数的锁文件

log file = /var/log/rsyncd.log          #日志文件位置

motd file = /etc/rsyncd.motd          #客户端登陆之后弹出的消息,需要创建

[wwwroot]                           #共享模块名称

path = /var/www/html                           #路径

comment = used for web-data root    #描述

read only = yes                            #只读方式(只可以下载)

list = yes                                         #是否允许查看模块信息

auth users = rsyncuser                           #备份的用户,和系统用户无关

secrets file = /etc/rsync.passwd        #存放用户的密码文件,格式是  用户名:密码

创建提示文件和用户密码

[root@taijitao63 ~]# echo "Welcome to Backup Server" > /etc/rsyncd.motd

       [root@taijitao63 ~]# vim /etc/rsyncd.conf

       [root@taijitao63 ~]# vim /etc/rsync.passwd

rsyncuser:password123

[root@taijitao63 ~]# chmod 600 /etc/rsync.passwd  //目录权限必须是700或者600,否则的话身份验证会失效,设置rsync user的时候

启动服务测试

       [root@taijitao63 ~]# vim /etc/xinetd.d/rsync

        disable = no        #将原来的yes改为no(部分版本可能是no,则不用改)

[root@taijitao63 ~]# /etc/init.d/xinetd restart                                               //启动服务

或者启动方式用守护进程方式启动服务

       [root@taijitao63 ~]# rsync --daemon --config=/etc/rsyncd.conf

       [root@taijitao63 ~]# netstat -antup | grep :873

tcp        0      0 :::873                      :::*                        LISTEN      45089/xinetd       

       [root@taijitao63 ~]# chkconfig xinetd on

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

       [root@taijitao64 ~]# rsync -azp rsyncuser@192.168.1.63::wwwroot /web-back/

Welcome to Backup Server

Password:       #输入密码password123

或者:使用下面的命令,输出详细信息

[root@taijitao64 ~]# rsync -av --progress --delete rsyncuser@192.168.1.63::wwwroot /web-back/

Welcome to Backup Server

Password:           #输入密码password123

receiving incremental file list

./

System.map-2.6.32-431.el6.x86_64

     2518236 100%   80.05MB/s    0:00:00 (xfer#1, to-check=26/28)

……

sent 502 bytes  received 29590149 bytes  6575700.22 bytes/sec

total size is 29584842  speedup is 1.00

启动服务测试

 [root@taijitao64 ~]# export RSYNC_PASSWORD=password123                    //输出此变量

或者新建一个文件保存好密码,然后在rsync命令中使用--password-file指定此文件即可

脚本实现定时自动备份

       [root@taijitao64 ~]# vim autobackup.sh

#!/bin/bash

export RSYNC_PASSWORD=password123

rsync -avz rsyncuser@192.168.1.63::wwwroot /web-back

       [root@taijitao64 ~]# chmod +x autobackup.sh

       [root@taijitao64 ~]# chmod +x autobackup.sh

[root@taijitao64 ~]# rm -rf /web-back/*                          //测试脚本

[root@taijitao64 ~]# sh autobackup.sh

       [root@taijitao64 ~]# echo "01 3 * * * sh /root/autoback.sh &" >> /var/spool/cron/root

生产环境关于iptables的设置

       [root@taijitao63 ~]# iptables -A INPUT -p tcp --dport 873 -j ACCEPT

[root@centos7 ~]# firewall-cmd --permanent --add-port=873/tcp  #添加防火墙规则,允许873端口的数据访问

Rsync+Inotify实时同步

作为一个镜像备份工具,可以说 rsync 做的很出色。

 可是,随着应用系统规模的不断扩大,我们对数据的安全性和可靠性方面的需求也越来越高!Rsync 在高端业务系统中的不足也逐渐暴露了出来。

首先,rsync 在同步数据时,需要扫描所有文件后才进行比对,然后再进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的一个操作,并且往往发生变化的是其中很小的一部分,那么这将是非常低效的方式。

其次,rsync 不能实时的去监测和同步数据。虽然我们使用crontab的方式,加上 rsync 自身以守护进程启动的方式实现触发同步,但是两次触发动作一定会有时间差。受限于crontab最短也是1分钟,因此这就导致了服务端和客户端数据可能出现不一致,更无法在应用故障时做到数据的完全恢复。

为了满足这方面的需求,我们就结合了 linux文件系统事件监控机制这样一个系统特性(即inotify),通过使用工具 inotify-tools,整合出了 rsync+inotify 这样的一个技术架构,来实现数据实时同步的功能!

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

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

下载地址:inotify-tools download | SourceForge.net                  notify-tools-3.13

# wget https://sourceforge.net/projects/inotify-tools/files/inotify-tools/3.13/inotify-tools-3.13.tar.gz

我们把taijitao63上/var/www/html目录实时同步到taijitao64的/web-back目录中

[root@taijitao63 ~]# ls /proc/sys/fs/inotify/              //查看调控参数

max_queued_events       #表示监控时间队列           默认16384 可以使用cat命令查看

max_user_instances          #表示最多监控实例数        默认128

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

#在Linux内核中,默认的Inotify机制提供了三种调控参数,当要监控的目录,文件数比较多的时候或者变化比较频繁的时候,要加大三个数值

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

       [root@taijitao63 ~]# vim /etc/sysctl.conf

……          #末尾添加下面三行

fs.inotify.max_queued_events = 32768

fs.inotify.max_user_instances = 1024

fs.inotify.max_user_watches = 90000000

       [root@taijitao63 ~]# sysctl -p

随便查看一个是否成功:

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

90000000

安装inotify-tools

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

[root@taijitao63 ~]# wget http://nchc.dl.sourceforge.net/project/inotify-tools/inotify-tools/3.13/inotify-tools-3.13.tar.gz

       [root@taijitao63 ~]# tar xvf inotify-tools-3.13.tar.gz -C /usr/local/src/

       [root@taijitao63 ~]# cd /usr/local/src/inotify-tools-3.13/

[root@taijitao63 inotify-tools-3.13]# ./configure --prefix=/usr/local/inotify-tools ; make ; make install

       inotifywait 仅执行阻塞,等待 inotify 事件,你可以使用它来监控任何一组文件和目录,或监控整个目录树(目录、子目录、子目录的子目录等等),并且可以结合 shell 脚本,更好的使用 inotifywait。

       inotifywatch 用来收集关于被监视的文件系统的统计数据,包括每个 inotify 事件发生多少次。

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

       [root@taijitao63 ~]# cd ; ln -s /usr/local/inotify-tools/bin/* /usr/bin/              //方便直接调用命令

inotifywait命令详解

语法:inotifywait [-hcmrq] [-e ] [-t ] [-- format  ] [--timefmt ] [ ... ]

参数:

-h,–help     # 输出帮助信息

@      # 排除不需要监视的文件,可以是相对路径,也可以是绝对路径

–fromfile    # 从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头

-m,–monitor  # 接收到一个事情而不退出,无限期地执行。默认行为是接收到一个事情后立即退出

-d,–daemon   # 跟–monitor一样,除了是在后台运行,需要指定 –outfile把事情输出到一个文件。也意味着使用了–syslog

-o,–outfile  # 输出事情到一个文件而不是标准输出。

-s,–syslog   # 输出错误信息到系统日志

-r,–recursive  # 监视一个目录下的所有子目录。

-q,–quiet    # 指定一次,不会输出详细信息,指定二次,除了致命错误,不会输出任何信息。

–exclude     # 正则匹配需要排除的文件,大小写敏感。

–excludei    # 正则匹配需要排除的文件,忽略大小写。

-t,–timeout # 设置超时时间,如果为0,则无限期地执行下去。

-e,–event    # 指定监视的事件。 这些事件包括: create 创建,move 移动,delete 删除,modify 修改文件内容,attrib 属性更改。

-c,–csv      # 输出csv格式。

–timefmt     # 指定时间格式,用于–format选项中的%T格式。

– format      # 指定输出格式。

    %w 表示发生事件的目录

    %f 表示发生事件的文件

    %e 表示发生的事件

    %Xe 事件以“X”分隔

    %T 使用由–timefmt定义的时间格式

下面是一些可监听事件,针对-e选项使用:

access

文件读取

modify

文件更改。

attrib

文件属性更改,如权限,时间戳等。

close_write

以可写模式打开的文件被关闭,不代表此文件一定已经写入数据。

close_nowrite

以只读模式打开的文件被关闭。

close

文件被关闭,不管它是如何打开的。

open

文件打开。

moved_to

一个文件或目录移动到监听的目录,即使是在同一目录内移动,此事件也触发。

moved_from

一个文件或目录移出监听的目录,即使是在同一目录内移动,此事件也触发。

move

包括moved_to和 moved_from

move_self

文件或目录被移除,之后不再监听此文件或目录。

create

文件或目录创建

delete

文件或目录删除

delete_self

文件或目录移除,之后不再监听此文件或目录

unmount

文件系统取消挂载,之后不再监听此文件系统。

这里呢,我准备了一些范例来帮助大家理解 inotifywait 命令的使用。

1、实时监控/etc目录的所有事件(包括文件的访问,写入,修改,删除等)

# inotifywait -rm /etc

Setting up watches.  Beware: since -r was given, this may take a  while !

Watches established.

/etc/  OPEN ld.so.cache

/etc/  CLOSE_NOWRITE,CLOSE ld.so.cache

/etc/  CREATE  test

/etc/  OPEN  test

/etc/  ATTRIB  test

/etc/  CLOSE_WRITE,CLOSE  test

此时,我在另外一个新打开的终端,touch /etc/test,这边就会产生相应的事件信息了。

2、实时监控/home目录的文件或目录创建,修改和删除相关事件

# inotifywait -mrq -e create,modify,delete /home

/home/  CREATE,ISDIR test2

/home/test2/  CREATE .bash_profile

/home/test2/  MODIFY .bash_profile

/home/test2/  CREATE .bash_logout

/home/test2/  MODIFY .bash_logout

/home/test2/  CREATE .bashrc

/home/test2/  MODIFY .bashrc

此时,我在新打开的终端上,使用useradd创建一个用户,这边就会产生相应的事件信息了!

3、实时监控/etc/passwd的文件修改,删除和权限相关事件,并且要求指定输出格式为27/06/14 16:12 /etc/passwd ATTRIB。

# inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format  '%T %w%f %e' --event modify,delete,attrib  /etc/passwd

27 /06/14  16:39  /etc/passwd  ATTRIB

27 /06/14  16:39  /etc/passwd  IGNORED

此时,我在新打开的终端上,使用 useradd 创建一个新用户,这边就会产生相应的事件信息了!

4、写一个脚本实现对 /data/web 目录进行监控,监控文件删除,修改,创建和权限相关事件,并且要求将监控信息写入/var/log/web_watch.log。要求日志条目要清晰明了,能突显文件路径、事件名和时间。

# cat web_watch.sh

#!/bin/bash

inotifywait -mrq --timefmt  '%y/%m/%d %H:%M'  -- format   '%T %w%f %e'  --event delete,modify,create,attrib   /data/web  |  while  read   date  time  file  event

   do

       case  $event  in

           MODIFY|CREATE|MOVE|MODIFY,ISDIR|CREATE,ISDIR|MODIFY,ISDIR)

                   echo  $event '-' $ file '-' $ date '-' $ time  >>  /var/log/web_watch .log

               ;;

   

           MOVED_FROM|MOVED_FROM,ISDIR|DELETE|DELETE,ISDIR)

                   echo  $event '-' $ file '-' $ date '-' $ time  /var/log/web_watch .log

               ;;

       esac

   done

# cat /var/log/web_watch.log 

CREATE- /data/web/a-14/06/27-16 :21

CREATE- /data/web/aa-14/06/27-16 :21

CREATE- /data/web/aaaa-14/06/27-16 :24

CREATE- /data/web/aaaaa-14/06/27-16 :24

此时,我在新打开的终端上,使用 touch 在/data/web目录下创建a,aa,aaa,aaaa这四个文件。然后查看/var/log/web_watch.log 文件,即可发现已经产生相应的事件信息,并且按照指定格式进行存放!

inotifywatch命令详解

语法:inotifywatch [-hvzrqf] [-e ] [-t ] [-a ] [-d ] [ ... ]

参数:

-h,–help     # 输出帮助信息

- v ,–verbose  # 输出详细信息

@              # 排除不需要监视的文件,可以是相对路径,也可以是绝对路径。

–fromfile     # 从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。

-z,–zero     # 输出表格的行和列,即使元素为空

–exclude      # 正则匹配需要排除的文件,大小写敏感。

–excludei     # 正则匹配需要排除的文件,忽略大小写。

-r,–recursive   # 监视一个目录下的所有子目录。

-t,–timeout     # 设置超时时间

-e,–event       # 只监听指定的事件。

-a,–ascending   # 以指定事件升序排列。

-d,–descending  # 以指定事件降序排列

OK,继续拿一个范例来帮助大家理解!

1、统计/home目录所在文件系统发生的事件次数

# inotifywatch -v -e create -e modify -e delete -t 30 -r /home

Establishing watches...

Setting up  watch (es) on  /home

OK,  /home  is now being watched.

Total of 3 watches.

Finished establishing watches, now collecting statistics.

Will listen  for  events  for  60 seconds.

total  modify  create  delete  filename

8           3            4          1        /home/

监控的时候,我在新打开的终端上,创建了4个文件,修改了3个文件内容,删除了一个文件。等监控的30秒时间到了之后,他就会显示出上面的事件次数报告!

测试inotifywait

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

另外开一终端,做一些改动

       [root@taijitao63 ~]# echo aaa > /var/www/html/a.html

[root@taijitao63 ~]# mkdir /var/www/html/test

[root@taijitao63 ~]# cp /etc/passwd /var/www/html/test/

[root@taijitao63 ~]# rm -rf /var/www/html/test/passwd

查看监控终端

/var/www/html/ CREATE a.html

/var/www/html/ MODIFY a.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 输出的监控结果中,每行记录中依次包括目录、事件、文件。据此可以识别变动情况。

使用触发试同步脚本

首先要做好免密码链接

       [root@taijitao63 ~]# ssh-keygen

       [root@taijitao63 ~]# ssh-copy-id root@192.168.1.64

编写脚本

       [root@taijitao63 ~]# vim inotify.sh

#!/bin/bash

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

#思路:只要检测到变动时间,执行rsync上行同步操作,推数据

#while read D E F是是哪个变量,前面输出的内容是三段,每一段对应的就是后面的D E F

 [root@taijitao63 ~]# chmod +x inotify.sh

 [root@taijitao63 ~]# echo "sh /root/inotify.sh &>> /var/log/inotify.log &" >> /etc/rc.local

Rsync+sersync实时同步(测试未通过)

Sersync 项目利用 Inotify 和 Rsync 技术实现对服务器数据实时同步的解决方案,其中 Inotify 用于监控 Sersync 所在服务器上文件系统的事件变化,而 Rsync 是目前广泛使用的本地以及异地数据同步工具,其优点是只对变化的目录数据操作,甚至是一个文件不同的部分进行同步,所以其优势大大超过使用挂接文件系统或 scp 等方式进行镜像同步。

目前使用比较多的同步工具为 Inotify-tools 和 Openduckbill。Inotify-tools 在前面的博文介绍过,这里就不做阐述。简单说下 Openduckbill,Openduckbill 也是 google 的一个开源项目,它也是依赖于inotif-tools,并且它 和 Inotify都是基于脚本语言编写的,其设计思路同样是采用文件系统事件监控机制 Inotify 与 Rsync 命令 来做设计架构的。这里在多说一点,有些朋友可能会在两台甚至多台服务器之间,互相搭建 Inotify-tools + Rsync 之类的同步部署来做互相同步,这个是很不推荐的,主要一方面就是在同步的文件时间戳上容易出问题,导致同步失败,甚至版本不同步。因此,如果你是要做互相同步,推荐使用 Csync 。

sersync主要用于服务 器同步,web镜像等功能。基于boost1.41.0,inotify api,rsync command.开发。目前使用的比较多的同步解决方案是inotify-tools+rsync ,另外一个是google开源项目Openduckbill(依赖于inotify- tools),这两个都是基于脚本语言编写的。

sersync的优点

相比较上面 Inotify-tools 和 Openduckbill两个项目,本项目优点是:

1、Sersync 使用 c++ 编写,对 linux 系统文件产生的临时文件和重复的文件操作会进行过滤,在本文后面会提到该点。使用sersyc和rsync结合做同步的时候,会大大减少运行时所消耗的本地以及网络资源,因此在速度方面有显著提升。

2、相比 Inotify-tools 和 Openduckbill,Sersync 配置起来更为简单方便。在谷歌 Sersync 项目下载的安装包的 bin 目录下,放置了已经编译好的二进制文件,搭配 bin 目录下的xml文件可以直接部署使用。

3、Sersync 采用多线程(默认10)进行同步(即可以并发同步多个不同文件),尤其是针对较大文件同步的时候,它能够保证多个服务器实时保持同步状态。

4、Sersync 自带了出错处理机制。它可以通过失败队列自动对之前出错的文件进行重新同步操作。如果届时依旧失败,它会每 10 个小时对同步失败的文件再进行重新同步操作,直到文件同步为止。

5、Sersync 自带有 crontab 功能,因此不需要借助系统的 crontab ,只需在 xml 配置文件中开启该功能,即可按预先的配置,每隔一段时间自动做一次整体同步操作。

6、Sersync 还自带了 socket 与 refreshCDN 的协议扩展,可以满足有特殊需求的公司二次开发。(之前的版本有http扩展,目前已去除)

Sersync架构图

下面是,Sersync 谷歌项目组上面的设计结构图!

针对上图的设计架构,这里做几点说明,来帮助大家阅读和理解该图:

1、线程组线程是等待线程队列的守护线程,当事件队列中有事件产生的时候,线程组守护线程就会逐个唤醒同步线程。当队列中 Inotify 事件较多的时候,同步线程就会被全部唤醒一起工作。这样设计的目的是为了能够同时处理多个 Inotify 事件,从而提升服务器的并发同步能力。同步线程的最佳数量=核数 x 2 + 2。

那么之所以称之为线程组线程,是因为每个线程在工作的时候,会根据服务器上新写入文件的数量去建立子线程,子线程可以保证所有的文件与各个服务器同时同步。当要同步的文件较大的时候,这样的设计可以保证每个远程服务器都可以同时获得需要同步的文件。

2、服务线程的作用有三个:

   a、处理同步失败的文件,将这些文件再次同步,对于再次同步失败的文件会生成 rsync_fail_log.sh 脚本,记录失败的事件。

   b、每隔10个小时执行 rsync_fail_log.sh 脚本一次,同时清空脚本。

   c、crontab功能,可以每隔一定时间,将所有路径整体同步一次。

3、过滤队列的建立是为了过滤短时间内产生的重复的inotify信息,例如在删除文件夹的时候,inotify就会同时产生删除文件夹里的文件与删除文件夹的事件,通过过滤队列,当删除文件夹事件产生的时候,会将之前加入队列的删除文件的事件全部过滤掉,这样只产生一条删除文件夹的事件,从而减轻了同步的负担。同时对于修改文件的操作的时候,会产生临时文件的重复操作。

为什么要用rsync+sersync架构?

1、sersync是基于inotify开发的,类似于inotify-tools的工具

2、sersync可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或者某一个目录的名字,然后使用rsync同步的时候,只同步发生变化的文件或者目录

rsync+inotify-toolsrsync+sersync架构的区别?

1、rsync+inotify-tools

 a、inotify只能记录下被监听的目录发生了变化(增,删,改)并没有把具体是哪个文件或者哪个目录发生了变化记录下来;

 b、rsync在同步的时候,并不知道具体是哪个文件或目录发生了变化,每次都是对整个目录进行同步,当数据量很大时,整个目录同步非常耗时(rsync要对整个目录遍历查找对比文件),因此效率很低

    

2、rsync+sersync

 a、sersync可以记录被监听目录中发生变化的(增,删,改)具体某个文件或目录的名字;

 b、rsync在同步时,只同步发生变化的文件或目录(每次发生变化的数据相对整个同步目录数据来说很小,rsync在遍历查找对比文件时,速度很快),因此效率很高。

总结: 

            当同步的目录数据量不大时,建议使用rsync+inotify 

            当同步的目录数据量很大时(几百G甚至1T以上)文件很多时,建议使用rsync+sersync

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux服务篇-RSYNC数据备份 的相关文章

  • 怎样才能使 Windows 成为一个开箱即用的 POSIX 兼容操作系统?

    这个问题的动机是我的一个牵强的梦想 即 nix 平台上可用的许多优秀软件可以轻松移植到 Windows 微软最近对开源和开放性采取了不同的方法 所以我真的很想知道如果微软有这样的倾向 这样的事情会有多可行 我很好奇的一些更具体的事情是 是否
  • 无法执行'x86_64-conda_cos6-linux-gnu-gcc':没有这样的文件或目录(pysam安装)

    我正在尝试安装 pysam 执行后 python path to pysam master setup py build 这个错误的产生是 unable to execute x86 64 conda cos6 linux gnu gcc
  • 每个进程每个线程的时间量

    我有一个关于 Windows 和 Linux 中进程和线程的时间量子的问题 我知道操作系统通常为每个线程提供固定的时间量 我知道时间量根据前台或后台线程而变化 也可能根据进程的优先级而变化 每个进程有固定的时间量吗 例如 如果操作系统为每个
  • linux x86 汇编语言 sys_read 调用的第一个参数应为 0 (stdin)

    我正在编写一个简单的汇编程序来从标准输入读取 如 scanf 这是我的代码 section bss num resb 5 section txt global start start mov eax 3 sys read mov ebx 0
  • 如何让“grep”从文件中读取模式?

    假设有一个很大的文本文件 我只想打印与某些模式不匹配的行 显然 我可以使用egrep v patter1 pattern2 pattern3 现在 如果所有这些模式都在一个文本文件中怎么办 最好的制作方法是什么egrep从文件中读取模式 g
  • 从 TypeScript 运行任何 Linux 终端命令?

    有没有办法直接从 TypeScript 类中执行 Linux 终端命令 这个想法是做类似的事情 let myTerminal new LinuxTerminal let terminalResult myTerminal run sudo
  • 适用于 KDE 和 Gnome 的 Gui [重复]

    这个问题在这里已经有答案了 我想为一个现在是 CLI 的应用程序编写一个 gui 它需要在 KDE 和 Gnome DE 中 看起来不错 充分利用用户的外观设置 如果我选择 Qt 或 GTK 我能够做到这一点吗 它们与两个 DE 集成良好吗
  • 如何在特定 systemd 服务重新启动时触发自定义脚本运行

    我想知道如何安排自定义脚本在重新启动服务时运行 我的用例是 每当重新启动 Tomcat 服务时 我都必须运行多个命令 我想知道是否有一种方法可以编写脚本并安排它在重新启动 Tomcat 服务时运行 我已将 tomcat 脚本设置为 syst
  • 设置 Apache POI 的路径

    我想创建 Excel 文件并使用 java 程序在该文件中写入数据 That is here http www techbrainwave com p 554我在 java 文件所在的位置提取了 Apache POI 并将该路径包含在路径变
  • 在主目录中安装库

    在 Linux Ubuntu 中 我尝试运行一个工具 但它显示错误 库丢失 我无权在系统中安装任何内容 或者根本无法从我的用户帐户执行 sudo 是否可以在我的主目录 没有 sudo 中安装缺少的库 在我的例子中为 libstdc so 6
  • GCC 和 ld 找不到导出的符号...但它们在那里

    我有一个 C 库和一个 C 应用程序 尝试使用从该库导出的函数和类 该库构建良好 应用程序可以编译 但无法链接 我得到的错误遵循以下形式 app source file cpp text 0x2fdb 对 lib namespace Get
  • PHP 致命错误:未找到“MongoClient”类

    我有一个使用 Apache 的网站 代码如下 当我尝试访问它时 我在 error log 中收到错误 PHP Fatal Error Class MongoClient not found 以下是可能错误的设置 但我认为没有错误 php i
  • 嵌入式Linux poll()不断返回

    我有一个特别的问题 当我知道没有什么可读时 民意调查不断返回 因此设置如下 我有 2 个文件描述符 它们构成fd设置民意调查监视 一种用于引脚从高到低的变化 GPIO 另一个用于代理输入 代理输入出现问题 处理的顺序是 启动main函数 然
  • Locale.getDefault() 始终返回 en

    unix 机器上的服务器始终使用 en 作为默认区域设置 以下是区域设置输出 LANG en US LC CTYPE C LC NUMERIC C LC TIME C LC COLLATE C LC MONETARY C LC MESSAG
  • 拆分字符串以仅获取前 5 个字符

    我想去那个地点 var log src ap kernelmodule 10 001 100 但看起来我的代码必须处理 ap kernelmodule 10 002 100 ap kernelmodule 10 003 101 等 我想使用
  • bluetoothctl 到 hcitool 等效命令

    在 Linux 中 我曾经使用 hidd connect mmac 来连接 BT 设备 但自 Bluez5 以来 这种情况已经消失了 我可以使用 bluetoothctl 手动建立连接 但我需要从我的应用程序使用这些命令 并且使用 blue
  • 从 PL/SQL 调用 shell 脚本,但 shell 以 grid 用户而非 oracle 身份执行

    我正在尝试使用 Runtime getRuntime exec 从 Oracle 数据库内部执行 shell 脚本 在 Red Hat 5 5 上运行的 Oracle 11 2 0 4 EE CREATE OR REPLACE proced
  • 创建 jar 文件 - 保留文件权限

    我想知道如何创建一个保留其内容的文件权限的 jar 文件 我将源代码和可执行文件打包在一个 jar 文件中 该文件将在使用前提取 人们应该能够通过运行批处理 shell 脚本文件立即运行示例和演示 然后他们应该能够修改源代码并重新编译所有内
  • 无法加载 JavaHL 库。- linux/eclipse

    在尝试安装 Subversion 插件时 当 Eclipse 启动时出现此错误 Failed to load JavaHL Library These are the errors that were encountered no libs
  • 强制卸载 NFS 安装目录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案

随机推荐

  • 漏洞复现- - -CVE-2016-5195 Dirty Cow脏牛提权漏洞

    目录 一 漏洞分析 二 形成原因 三 漏洞检测复现 1 编译poc 文件 2 复现漏洞 四 漏洞修复 方法一 方法二 一 漏洞分析 脏牛 Dirty COW 编号 CVE 2016 5195 是2016年10月18日被曝出的存在于Linux
  • VScode中js文件代码没有高亮问题

    问题 VScode中js文件js代码没有高亮 显示白色 解决方法 文件 gt 首选项 gt 设置 找到setting json 然后注释掉这段代码 重新打开文件 JS代码就有高亮了 白色看着实在别扭
  • python元组 列表 字符串最后一个下标_python字符串列表元组序列操作

    Table of Contents generated with DocToc python系列 字符串 列表 元组的操作 序列的访问及运算符 序列是为满足程序中复杂的数据表示 python支持组合数据类型 可以将一批数据作为一个整体进行数
  • 数据湖:设计更好的架构、存储、安全和数据治理

    问题导读 1 对数据湖有哪些预期 2 数据湖架构如何设计 3 如何做好数据治理工作 4 如何保障数据湖的安全 前言对任何业务来说 数据驱动的结果 预告和对趋势的预测都是必不可少的 今天 在我们所做的每件事中 都能看到某种分析的逻辑在背后 从
  • C语言输出3个整数最大值的案例教程

    思路分析 先比出2个整数的最大值 然后用最大值和第三个整数比较从而求出3个整数的最大值 我们今天用几种办法输出3个整数最大值 方法一 使用if else语句以及输入输出语句来编写 方法二 使用三元运算符以及输入输出语句来编写 方法三 使用自
  • JAVA 泛型的相关知识点

    泛型分为 1 泛型类 2 泛型接口 3 泛型方法 1 泛型类 定义 class Test
  • Python编程技巧和需要注意的地方——Pro

    目录 前言 1 多个大数字相加 2 同时访问多个相互关联的列表 3 访问列表的同时输出对应下标 4 熟练使用 和 5 关于类的get和set方法 6 熟练使用help和dir方法 7 什么时候使用set或dict而不是list 8 默认参数
  • 互联网大厂2021中秋礼盒pk,看完我又酸了……

    作者丨魏宇卓 来源丨运营研究社 ID U quan 马上又要到中秋节啦 每年中秋节 我最喜欢的就是吃着在便利店买的寒酸月饼 围观互联网大厂们在中秋礼盒上互相 battle 今年 大厂的月饼礼盒哪家强呢 我特地挑选了 10 家互联网大厂的中秋
  • 如何一次性批量打印PDF、Word、Excel、PPT和图片 - 文件批量打印工具

    一次性自动批量打印PDF WORD DOC DOCX Excel工作表XLS XLSX CSV PowerPoint PPTX PPT和JPG PNG TIF BMP图像 在日常工作生活中 我们时常需要通过打印机打印文件或照片 打印机都是逐
  • 【Unity Shader】概述以及Diffuse shader和unity5新功能Standard shader

    一 Diffuse shader介绍 Diffuse 即漫反射 可以想象成太阳光照射到某一个粗糙平面时 该平面向四面八方都会反射光线 这些光线中的某些光线会进入我们的眼睛 从而使我们看到这个平面 一个基本的漫反射光照模型 需要包括以下几个部
  • 0 基础 Java 自学之路(2023年最新版)

    目录 一 语言的选择 二 Java学习路线 三 学习资料哪里找 1 Java经典书籍推荐 2 Java经典视频推荐 3 经典博客推荐 四 如何规划时间 五 是否要报培训班 写了10多年的代码 之前做过某东的高级架构师 在技术这条路上跌跌撞撞
  • python-leetCode-给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的两个整数

    给定一个整数数组 nums 和一个目标值 target 请你在该数组中找出和为目标值的 两个 整数 你可以假设每种输入只会对应一个答案 但是 你不能重复利用这个数组中同样的元素 示例 给定 nums 2 7 11 15 target 9 因
  • R语言编写函数

    基本思路参考此文章 http blog csdn net myl1992 article details 44936009 在这片博文中涉及到list相关知识 很受用 http blog csdn net u012543538 articl
  • Hudi 基础入门篇

    Hudi 诞生 Apache Hudi由Uber开发并开源 该项目在2016年开始开发 并于2017年开源 2019年1月进入 Apache 孵化器 且2020年6月称为Apache 顶级项目 目前最新版本 0 9 0版本 Hudi 一开始
  • JSONArray属性值的修改

    之前直接通过生成字符串后进行字符串替换实现的 实际上这里可能会替换调value的值中相同的字符 虽然概率很低 但是鉴于对个人的严格要求 还是严谨地修改了实现方法 主要基于如下的方法 public static JSONObject tran
  • VC++ 文件操作封装类

    头文件声明 SysUtils h pragma once include
  • 什么是模式识别,模式识别概念的基本介绍

    模式识别又常称作模式分类 从处理问题的性质和解决问题的方法等角度 模式识别分为有监督的分类 Supervised Classification 和无监督的分类 Unsupervised Classification 两种 模式还可分成抽象的
  • Python入门之类和对象

    对象 属性 方法 对象是类的实例 换句话说 类主要定义对象的结构 然后我们以类为模板创建对象 类不但包含方法定义 而且还包含所有实例共享的数据 封装 信息隐蔽技术 我们可以使用关键字 class 定义 Python 类 关键字后面紧跟类的名
  • TextureTailor自制Plist碎图工具

    最近在开发小游戏 美术资源是个令人头疼的问题 故搜寻了一些网上的资源文件 但是总被plist格式和png图片格式所困扰 在参考了一些大佬的代码后自制了一个符合我个人需求的小工具 先放源码地址 TextureTailor 再来预览一下效果 界
  • linux服务篇-RSYNC数据备份

    Rsync remote sync 是UNIX及类UNIX平台下一款神奇的数据镜像备份软件 它不像FTP或其他文件传输服务那样需要进行全备份 Rsync可以根据数据的变化进行差异备份 从而减少数据流量 提高工作效率 你可以使用它进行本地数据