第一部分:配置Rsync
一、介绍Rsync工具
rsync是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。它使用所谓的“Rsync演算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。所以通常可以作为备份工具来使用。
Rsync的特性如下:
1)支持拷贝特殊文件如链接,设备等
2)可以有排除指定文件或目录同步的功能,相当于打包命令tar
3)可以保持原来文件或目录的权限,时间,软硬链接等所有属性均不改变。
4)可实现增量同步,即只同步发生变化的数据,因此数据传输效率更高
5)可以使用rcp,rsh,ssh等方式来配合传输文件,也可以通过直接的socker链接
6)支持匿名的或认证的进程模式传输,方便进行数据备份及镜像。
二、测试环境
Server:CentOS74-01 192.168.1.160
Client: CentOS74-02 192.168.1.161
[[email protected] ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[[email protected] ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
三、配置rsync服务端
(1)参数介绍
comment = public archive #模块描述
path = /var/www/pub #需要同步的路径
use chroot = yes #默认是yes|true,如果为true,那么在rsync在传输文件以前首先chroot到path参数指定的目录下。这样做的原因是实现额外的安全防护,但是缺点是需要root权限,并且不能备份指向外部的符号连接指向的目录文件。
max connections=10 #最大连接数
lock file = /var/lock/rsyncd #指定支持max connections参数的锁文件。
the default for read only is yes...
read only = yes #只读选项
list = yes #客户请求时可用模块时是否列出该模块
uid = nobody #设定该模块传输文件时守护进程应该具有的uid
gid = nogroup #设定该模块传输文件时守护进程应具有的gid,此项与uid配合可以确定文件的访问权限
exclude = #用来指定多个由空格隔开的多个模式列表,并将其添加到exclude列表中。这等同于在客户端命令中使用--exclude来指定模式,不过配置文件中指定的exlude模式不会传递给客户端,而仅仅应用于服务器。一个模块只能指定一个exlude选项,但是可以在模式前面使用"-"和"+"来指定是exclude还是include #这个我的理解是排除目录中不需同步的文件
exclude from = #可以指定一个包含exclude模式定义的文件名
include = #与exclude相似
include from = #可以指定一个包含include模式定义的文件名
auth users = #该选项指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。如果"auth users"被设置,那么客户端发出对该模块的连接请求以后会被rsync请求challenged进行验证身份这里使用的 challenge/response认证协议。用户的名和密码以明文方式存放在"secrets file"选项指定的文件中。默认情况下无需密码就可以连接模块(也就是匿名方式)
secrets file = /etc/rsyncd.secrets #该文件每行包含一个username:password对,以明文方式存储,只有在auth users被定义时,此选项才生效。同时我们需要将此文件权限设置为0600
strict modes = yes #该选项指定是否监测密码文件的权限,如果该选项值为true那么密码文件只能被rsync服务器运行身份的用户访问,其他任何用户不可以访问该文件。默认值为true
hosts allow = #允许的主机
hosts deny = #拒绝访问的主机
ignore errors = no #设定rsync服务器在运行delete操作时是否忽略I/O错误
ignore nonreadable = yes #设定rysnc服务器忽略那些没有访问文件权限的用户
transfer logging = no #使rsync服务器使用ftp格式的文件来记录下载和上载操作在自己单独的日志中
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 *.tbz #告诉rysnc那些文件在传输前不用压缩,默认已设定压缩包不再进行压缩
(2)rsync服务端配置
创建用户rsync:
[[email protected] ~]# useradd rsync [[email protected] ~]# passwd rsync Changing password for user rsync. New password: BAD PASSWORD: The password is shorter than 8 characters Retype new password: passwd: all authentication tokens updated successfully. [[email protected] ~]# [[email protected] ~]# cat /etc/passwd | grep rsync rsync:x:1000:1000::/home/rsync:/bin/bash
修改配置文件/etc/rsyncd.conf:
[[email protected] ~]# cat /etc/rsyncd.conf uid = rsync gid = rsync use chroot = no log file = /var/log/rsyncd.log pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock hosts allow = 192.168.1.161 [apache] path = /data/apache/ read only = yes auth users = tom (跟系统用户没有关系) secrets file = /etc/rsyncd.secrets [tomcat] path = /data/tomcat/ read only = yes
设置rsyncd服务开机启动:
[[email protected] ~]# systemctl enable rsyncd.service Created symlink from /etc/systemd/system/multi-user.target.wants/rsyncd.service to /usr/lib/systemd/system/rsyncd.service.
启动rsyncd服务:
[[email protected] ~]# systemctl start rsyncd.service
查看 rsyncd 的端口:
[[email protected] ~]# netstat -nltp | grep 873 tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 1690/rsync
创建密码文件并赋权限:
[[email protected] ~]# vim /etc/rsyncd.secrets tom:tom [[email protected] ~]# chmod 600 /etc/rsyncd.secrets [[email protected] ~]# chown root.root /etc/rsyncd.* (因为rsyncd服务是由root启动的,所以配置文件和密码文件的权限要设置为root.root) [[email protected] ~]# ll /etc/rsyncd.* -rw-r--r-- 1 root root 818 Jul 7 14:55 /etc/rsyncd.conf -rw------- 1 root root 8 Jul 7 14:38 /etc/rsyncd.secrets
创建测试用的文件:
[[email protected] ~]# ll /data/apache/ total 8 -rw-r--r-- 1 root root 7 Jul 7 14:40 apache_1.log -rw-r--r-- 1 root root 8 Jul 7 14:41 apache_2.log [[email protected] ~]# ll /data/tomcat/ total 8 -rw-r--r-- 1 root root 7 Jul 7 14:41 tomcat_1.log -rw-r--r-- 1 root root 13 Jul 7 14:41 tomcat_2.log
(3)rsync客户端配置:
[[email protected] ~]# cat /etc/rsyncd.secrets tom [[email protected] ~]# chown root.root /etc/rsyncd.secrets [[email protected] ~]# chmod 600 /etc/rsyncd.secrets [[email protected] ~]#
(4)测试
遇到错误一:
[[email protected] ~]# rsync -avz --password-file=/etc/rsyncd.secrets [email protected]::web /data/web/ rsync: failed to connect to 192.168.1.160 (192.168.1.160): No route to host (113) rsync error: error in socket IO (code 10) at clientserver.c(122) [Receiver=3.0.9]
查看服务器 CentOS74-01 上的防火墙,发现是running的状态:
[[email protected] ~]# firewall-cmd --state running
关闭防火墙:
[[email protected] ~]# systemctl stop firewalld.service [[email protected] ~]# firewall-cmd --state not running
关闭防火墙开机启动:
[[email protected] ~]# systemctl disable firewalld.service Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
遇到错误二:
[[email protected] ~]# rsync -avz --password-file=/etc/rsyncd.secrets [email protected]::apache /data/apache/ receiving incremental file list rsync: mkdir "/data/apache" failed: No such file or directory (2) rsync error: error in file IO (code 11) at main.c(587) [Receiver=3.0.9] [[email protected] ~]#
需要现在客户端上面创建文件夹/data/apache/:
[[email protected] ~]# mkdir -pv /data/apache/ mkdir: created directory ‘/data’ mkdir: created directory ‘/data/apache/’ [[email protected] ~]# rsync -avz --password-file=/etc/rsyncd.secrets [email protected]::apache /data/apache/ receiving incremental file list ./ apache_1.log apache_2.log sent 96 bytes received 229 bytes 30.95 bytes/sec total size is 15 speedup is 0.05 [[email protected] ~]#
在服务器 CentOS74-01 上面新创建apache_3.log,并把权限设置为640:
[[email protected] apache]# chmod 640 apache_3.log [[email protected] apache]# ll total 12 -rw-r--r-- 1 root root 7 Jul 7 14:40 apache_1.log -rw-r--r-- 1 root root 8 Jul 7 14:41 apache_2.log -rw-r----- 1 root root 6 Jul 7 15:25 apache_3.log [[email protected] apache]#
然后再在客户端 CentOS74-02 上运行以下命令:
[[email protected] ~]# rsync -avz --password-file=/etc/rsyncd.secrets [email protected]::apache /data/apache/ receiving incremental file list ./ rsync: send_files failed to open "apache_3.log" (in apache): Permission denied (13) sent 77 bytes received 260 bytes 674.00 bytes/sec total size is 21 speedup is 0.06 rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1518) [generator=3.0.9] [[email protected] ~]#
原因:因为在服务器 CentOS74-01 上面,/etc/rsyncd.conf 里面的uid = rsync gid = rsync,而 rsync 对apache_3.log并没有读权限,所以报 Permission denied (13)。
(5)使用无密码方式拷贝
由于/etc/rsyncd.conf中的[tomcat]模块并没有配置需要认证选项,所以可以使用无密码方式同步文件:
目前/data/tomcat的属主属组是root.root:
[[email protected] ~]# ll /data total 0 drwxr-xr-x 2 root root 46 Jul 7 15:25 apache drwxr-xr-x 2 root root 6 Jul 7 16:04 tomcat
修改属主属组为tomcat.tomcat:
[[email protected] ~]# chown tomcat.tomcat /data/tomcat/ [[email protected] ~]# ll /data/ total 0 drwxr-xr-x 2 root root 46 Jul 7 15:25 apache drwxr-xr-x 2 tomcat tomcat 6 Jul 7 16:04 tomcat
su到tomcat用户,使用tomcat用户身份用rsync同步文件:
[[email protected] ~]# su tomcat [[email protected] root]$ cd /data/tomcat/ [[email protected] tomcat]$ rsync -avz 192.168.1.160::tomcat /data/tomcat/ receiving incremental file list ./ tomcat_1.log tomcat_2.log sent 69 bytes received 196 bytes 25.24 bytes/sec total size is 20 speedup is 0.08 [[email protected] tomcat]$ ll total 8 -rw-r--r-- 1 tomcat tomcat 7 Jul 7 14:41 tomcat_1.log -rw-r--r-- 1 tomcat tomcat 13 Jul 7 14:41 tomcat_2.log
删除tomcat日志文件,使用root用户同步文件:
[[email protected] tomcat]$ rm -fr tomcat_* [[email protected] tomcat]$ exit exit
在客户端上面使用root从服务器端拷贝文件到/data/tomcat/下面,会把该目录的属主属组修改为root.root:
[[email protected] ~]# rsync -avz 192.168.1.160::tomcat /data/tomcat/ receiving incremental file list ./ tomcat_1.log tomcat_2.log sent 69 bytes received 196 bytes 25.24 bytes/sec total size is 20 speedup is 0.08 [[email protected] ~]# ll /data/ total 0 drwxr-xr-x 2 root root 46 Jul 7 15:25 apache drwxr-xr-x 2 root root 46 Jul 7 14:41 tomcat [[email protected] ~]# ll /data/tomcat/ total 8 -rw-r--r-- 1 root root 7 Jul 7 14:41 tomcat_1.log -rw-r--r-- 1 root root 13 Jul 7 14:41 tomcat_2.log [[email protected] ~]#
四、rsync的不足
与传统的cp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件
服务器数据到远端服务器,对本地磁盘定期做数据镜像等。
随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足,首先,rsync同步数据时,需要扫描
所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常
低效的方式。其次,rsync不能实时的去监测、同步数据,虽然它可以通过crontab方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端
数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因,rsync+inotify组合出现了!
第二部分:配置Rsync + inotify
一、inotify简介
inotify实际上是Linux系统的一个内核特性(在Linux2.6.13中开始引入),它是一种高精度的异步文件系统事件监控机制,它监控文件系统操作,比如增删改、移动等细微事件,而且相当灵敏。
可以通过以下命令判断当前内核是否支持,出现以下三个文件代表已支持该特性。
[[email protected] ~]# ll /proc/sys/fs/inotify/ total 0 -rw-r--r-- 1 root root 0 Jul 7 17:02 max_queued_events -rw-r--r-- 1 root root 0 Jul 7 17:02 max_user_instances -rw-r--r-- 1 root root 0 Jul 7 17:02 max_user_watches
参数含义:
max_queued_events
设置inotify实例事件(event)队列可容纳的事件数量。
max_user_instances
设置每个用户可以运行的inotifywait或inotifywatch命令的进程数。
max_user_watches
设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)。
如果监控的文件数目巨大,需要根据情况,适当增加这些参数的大小,可以达到优化性能的目的:
[[email protected] ~]# echo 50000000 > /proc/sys/fs/inotify/max_queued_events [[email protected] ~]# echo 50000000 > /proc/sys/fs/inotify/max_user_watches [[email protected] ~]# echo 65535 > /proc/sys/fs/inotify/max_user_instances
将上面的命令行加入/etc/rc.d/rc.local文件里,实现每次重启系统都自动生效。
二、安装inotify-tools工具包
前面说的inotify是内核特性,而inotify-tools则是一套使用C语言开发的第三方接口库函数,它提供了两个个已经编译好的二进制命令,可以对内核特性进行调用,更加方便得监控文件系统。
使用源码包安装:
[[email protected] src]# ls inotify-tools-3.13.tar.gz [email protected] src]# tar -zxf inotify-tools-3.13.tar.gz [[email protected] src]# ls inotify-tools-3.13 inotify-tools-3.13.tar.gz [[email protected] src]# cd inotify-tools-3.13 [[email protected] inotify-tools-3.13]# ls aclocal.m4 ChangeLog config.h.in configure COPYING INSTALL libinotifytools Makefile.am man NEWS src AUTHORS config.guess config.sub configure.ac depcomp install-sh ltmain.sh Makefile.in missing README [[email protected] inotify-tools-3.13]# ./configure --prefix=/usr/local/inotify [[email protected] inotify-tools-3.13]# make && make install
安装成功后在bin目录下会生成inotifywait和inotifywatch两个命令:
[[email protected] bin]# pwd /usr/local/inotify/bin [[email protected] bin]# ls inotifywait inotifywatch
命令作用
inotifywait 用来等待文件上的一个特定事件,可以监控整个目录树的变化。
inotifywatch 它是用来收集被监控的文件系统统计数据。
inotifywait有丰富的参数,提供各种各样的文件监控需求。
参数:
inotifywait参数 含义说明
-r,--recursive 递归查询目录
-q,--quiet 打印很少的信息,仅仅打印监控事件的信息
-m,--monitor 始终保持事件监听状态
--exclude 排除文件或目录时,不区分大小写。
--timefmt 指定时间输出的格式
--format 打印使用指定的输出类似格式字符串
-e,--event 通过此参数可以指定需要监控的事件,如下一个列表所示
可以监控的文件系统事件:
Events 含义
access 文件被访问
modify 文件内容被修改
attrib 文件属性被修改
close_write 可写文件被关闭
close_nowrite 不可写文件被关闭
open 文件被打开
moved_fron 文件被移走
move_to 文件被移入
create 创建新文件
delete 文件被删除
delete_self 自删除,一个可执行文件在执行时删除自身
move_self 自移动,一个可执行文件在执行时移动自身
umount 文件系统被卸载
close 文件被关闭(write或nowrite)
move 文件被移动(from或to)
三、rsync服务端配置
配置文件/etc/rsyncd.conf如下:
[[email protected] ~]# cat /etc/rsyncd.conf uid = rsync gid = rsync use chroot = no log file = /var/log/rsyncd.log pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock hosts allow = 192.168.1.160 [apache] path = /data/apache/ read only = yes auth users = bob secrets file = /etc/rsyncd.secrets
[[email protected] ~]# cat /etc/rsyncd.secrets bob:bob123 [[email protected] ~]# chmod 600 /etc/rsyncd.secrets [[email protected] ~]# chown root.root /etc/rsyncd.secrets [[email protected] ~]# ll /etc/rsyncd.* -rw-r--r-- 1 root root 721 Jul 7 18:49 /etc/rsyncd.conf -rw------- 1 root root 11 Jul 7 18:49 /etc/rsyncd.secrets [[email protected] ~]# firewall-cmd --state running [[email protected] ~]# systemctl stop firewalld.service [[email protected] ~]# systemctl disable firewalld.service Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. [[email protected] ~]# systemctl start rsyncd.service [[email protected] ~]# netstat -nltp | grep 873 tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 1987/rsync [[email protected] ~]#
四、rsync客户端配置
在rsync客户端上面进行如下配置:
[[email protected] bin]# cat /etc/rsyncd.secrets bob123 [[email protected] bin]# ll /etc/rsyncd.secrets -rw------- 1 root root 7 Jul 7 18:55 /etc/rsyncd.secrets
五、测试
报错一:
[[email protected] apache]# rsync -avz --password-file=/etc/rsyncd.secrets /data/apache/ [email protected]::apache sending incremental file list ERROR: module is read only rsync error: syntax or usage error (code 1) at main.c(879) [Receiver=3.0.9] rsync: read error: Connection reset by peer (104) rsync error: error in rsync protocol data stream (code 12) at io.c(764) [sender=3.0.9]
原因如下:
在rsync服务端的/etc/rsyncd.conf里面,read only = yes,修改为read only = no,再测试:
报错二:
[[email protected] apache]# rsync -avz --password-file=/etc/rsyncd.secrets /data/apache/ [email protected]::apache sending incremental file list apache_3.log rsync: mkstemp ".apache_3.log.LyMzT6" (in apache) failed: Permission denied (13) sent 122 bytes received 27 bytes 27.09 bytes/sec total size is 21 speedup is 0.14 rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1052) [sender=3.0.9]
原因如下:
rsync服务端的/data/apache目录属主属组是root.root,others组没有写的权限,运行如下命令:
[[email protected] apache]# chmod -R o+w /data
报错三:
[[email protected] apache]# rsync -avz --password-file=/etc/rsyncd.secrets /data/apache/ [email protected]::apache sending incremental file list ./ rsync: failed to set times on "." (in apache): Operation not permitted (1) sent 80 bytes received 11 bytes 8.67 bytes/sec total size is 21 speedup is 0.23 rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1052) [sender=3.0.9] -rw-r--r-- 1 rsync rsync 6 Jul 7 15:25 apache_3.log [[email protected] apache]# ll total 12 -rw-r--r-- 1 root root 7 Jul 7 14:40 apache_1.log -rw-r--r-- 1 root root 8 Jul 7 14:41 apache_2.log -rw-r--r-- 1 rsync rsync 6 Jul 7 15:25 apache_3.log
原因如下:
由于rsync服务端/etc/rsyncd.conf里面指定的uid和gid是用户rsync,而服务器上面的/data/apache/的属主和属组是root.root,所以报错,运行
下面的命令修改属主和属组为 rsync.rsync
[[email protected] ~]# chown -R rsync.rsync /data/apache/ [[email protected] ~]# ll /data/apache/ total 8 -rw-r--r-- 1 rsync rsync 7 Jul 7 14:40 apache_1.log -rw-r--r-- 1 rsync rsync 8 Jul 7 14:41 apache_2.log
再次运行下面的命令,没有报错了:
[[email protected] apache]# rsync -avz --password-file=/etc/rsyncd.secrets /data/apache/ [email protected]::apache sending incremental file list ./ apache_3.log sent 125 bytes received 30 bytes 310.00 bytes/sec total size is 21 speedup is 0.14 [[email protected] apache]#
六、编写实时同步脚本
具体脚本内容如下:
[[email protected] ~]# cat inotify_rsync.sh #!/bin/bash inotify=/usr/local/inotify/bin/inotifywait $inotify -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e delete,create,modify,close_write /data/apache | while read file do rsync -avz --password-file=/etc/rsyncd.secrets /data/apache/ [email protected]::apache done
可以使用 nohup将脚本挂到系统后台运行:
[[email protected] ~]# nohup sh /root/inotify_rsync.sh & [1] 7808 [[email protected]ntOS74-01 ~]# nohup: ignoring input and appending output to ‘nohup.out’ [[email protected] ~]# cat nohup.out [[email protected] ~]#
在rsync客户端创建测试文件:
[[email protected] apache]# touch apache_{4..10}.log [[email protected] apache]# ll total 12 -rw-r--r-- 1 root root 0 Jul 7 19:32 apache_10.log -rw-r--r-- 1 root root 7 Jul 7 14:40 apache_1.log -rw-r--r-- 1 root root 8 Jul 7 14:41 apache_2.log -rw-r--r-- 1 root root 6 Jul 7 15:25 apache_3.log -rw-r--r-- 1 root root 0 Jul 7 19:32 apache_4.log -rw-r--r-- 1 root root 0 Jul 7 19:32 apache_5.log -rw-r--r-- 1 root root 0 Jul 7 19:32 apache_6.log -rw-r--r-- 1 root root 0 Jul 7 19:32 apache_7.log -rw-r--r-- 1 root root 0 Jul 7 19:32 apache_8.log -rw-r--r-- 1 root root 0 Jul 7 19:32 apache_9.log [[email protected] apache]#
在rsync服务端查看结果:
[[email protected] apache]# ll total 12 -rw-r--r-- 1 rsync rsync 0 Jul 7 2018 apache_10.log -rw-r--r-- 1 rsync rsync 7 Jul 7 14:40 apache_1.log -rw-r--r-- 1 rsync rsync 8 Jul 7 14:41 apache_2.log -rw-r--r-- 1 rsync rsync 6 Jul 7 15:25 apache_3.log -rw-r--r-- 1 rsync rsync 0 Jul 7 2018 apache_4.log -rw-r--r-- 1 rsync rsync 0 Jul 7 2018 apache_5.log -rw-r--r-- 1 rsync rsync 0 Jul 7 2018 apache_6.log -rw-r--r-- 1 rsync rsync 0 Jul 7 2018 apache_7.log -rw-r--r-- 1 rsync rsync 0 Jul 7 2018 apache_8.log -rw-r--r-- 1 rsync rsync 0 Jul 7 2018 apache_9.log
原文地址:http://blog.51cto.com/2612012/2138653