你必须要知晓文件备份同步小技巧之rsync!

Posted 28线不知名云架构师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你必须要知晓文件备份同步小技巧之rsync!相关的知识,希望对你有一定的参考价值。

一、rsync概述

1.1、rsync简介

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

Rsync支持大多数的类Unix系统,无论是Linux、Solaris还是BSD上都经过了良好的测试

此外,它在windows平台下也有相应的版本,如cwRsync和Sync2NAS等工具

1.2、rsync原理

Rsync本来是用于替代rcp的一个工具,目前由rsync.samba.org维护,所以rsync.conf文件的格式类似于samba的主配 置文件;Rsync可以通过rsh或ssh使用,也能以daemon模式去运行

在以daemon方式运行时Rsync server会打开一个873 端口,等待客户端去连接。连接时,Rsync server会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,以后则就只需进行增量备份

1.3、特点

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

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

3、无须特殊权限即可安装;

4、优化的流程,文件传输效率高;

5、可以使用rsh、ssh等方式来传输文件,当然也可以通过直接的socket连接;

6、支持匿名传输

1.4、配置思路

1.4.1、基本思路

  • 建立rsyncd.conf配置文件、独立的账号文件
  • 启用rsync的 --daemon模式

1.4.2、配置文件rsyncd.conf

  • 认证配置auth users、secrets file,不加则为匿名

1.4.3、独立的账号文件

  • 用户名:密码
  • 每行一个用户记录
  • 独立的账号数据,不依赖系统账号

1.4.4、启用rsync服务

  • 通过 --daemon独自提供服务,rsync --daemon
  • 执行kill $(cat /var/run/rsyncd.pid)关闭服务

1.4.5、配置源的两种表示方法

格式一
用户名@主机地址: :共享模块名.
rsync -avz backuper@192.168.35.40::wwwroot /root
格式二
rsyne://用户名@主机地址/共享模块名
rsync -avz rsync:/ /backuper@192.168.35.40::/wwwroot /root

1.5、备份工具rsync

1.5.1、同步方式

  • 全量备份
  • 原有的数据全部传送
  • 把原来的文件和新的文件一起统一传送
  • 全量复制,效率低

1.5.2、增量备份

在传输数据之前通过一些算法通过你有的数据和我有的数据进行对比,把不一样的数据通过网络传输
增量复制,效率高

1.5.3、rsync命令

基本格式:
rsync [选项] 原始位置 目标位置
常用选项说明
-r递归模式,包含目录及子目录中的所有文件
-l对于符号链接文件仍然复制为符号链接文件

-v

显示同步过程的详细信息
-z在传输文件时进行压缩
-a归档模式,递归并保留对象属性,等同于-rlptgoD
-p保留文件的权限标记
-t保留文件的时间标记
-g保留文件的属组标记(仅超级用户使用)
-o保留文件的属主标记(仅超级用户使用)
-H保留硬链接文件
-A保留ACL属性信息
-D保留设备文件及其他特殊文件
- -delete删除目标位置有而原始位置没有的文件
- -checksum根据对象的校验和来决定是否跳过文件

二、搭建rsync

2.1、rsync本地复制

2.1.1、搭建环境

主机IP地址
rsync192.168.152.130
client192.168.152.129

2.1.2、搭建过程

下载rsync并启动:
[root@rsync ~]#rpm -q rsync
[root@rsync ~]#yum -y install rsync		##安装rsync
[root@rsync ~]# mkdir /aaa
[root@rsync ~]# mkdir /bbb
[root@rsync ~]# mkdir /ccc
[root@rsync ~]# cd /
[root@rsync /]# ls
aaa  bin   dev   lib    mnt   root  srv  usr
abc  boot  etc   lib64  opt   run   sys  var
bbb  ccc   home  media  proc  sbin  tmp
[root@rsync ~]# cd /aaa
[root@rsync aaa]# touch 1.txt
[root@rsync aaa]# ls
1.txt
[root@rsync aaa]# rsync -avz /aaa/ /bbb
#将目录aaa的文件复制到目录bbb下
sending incremental file list
./
1.txt

sent 103 bytes  received 38 bytes  282.00 bytes/sec
total size is 0  speedup is 0.00
[root@rsync aaa]# rsync -avz /aaa /ccc
#将目录aaac的文件连同目录aaa复制到目录ccc下
sending incremental file list
aaa/
aaa/1.txt

sent 115 bytes  received 39 bytes  308.00 bytes/sec
total size is 0  speedup is 0.00

#rsync跟cp 的区别,就是cp命令无论后面接不接/都会复制目录本身
[root@rsync aaa]# cp -a /aaa /opt
[root@rsync aaa]# ls /opt
aaa  httpd-2.4.6-95.el7.centos.x86_64.rpm  rh
[root@rsync aaa]# rm -rf /opt/aaa/
[root@rsync aaa]# cp -a /aaa/ /opt
[root@rsync aaa]# ls /opt/
aaa  httpd-2.4.6-95.el7.centos.x86_64.rpm  rh
[root@rsync aaa]# 

2.2、rsync远程复制

5.2.1、配置环境

主机IP地址
rsync192.168.152.130
client192.168.152.129

2.2.2、搭建过程

下载rsync并启动:
[root@rsync ~]#rpm -q rsync
[root@rsync ~]#yum -y install rsync		##安装rsync

 配置rsync服务器:
 [root@rsync ~]# vim /etc/rsyncd.conf 

uid = nobody					#root
gid = nobody					#root
use chroot = yes				#禁锢在源目录                                                
address = 192.168.152.130	#监听地址
port 873                     	#监听端口 tcp/udp 873,可通过 cat /etc/services | grep rsync 查看                                           
log file = /var/log/rsyncd.log	#日志文件位置                  
pid file = /var/run/rsyncd.pid	#存放进程ID的文件位置                  
hosts allow = 192.168.152.0/24	#允许访问的客户机地址
[wwwroot]   					##第一个共享模块                                                           
path = /var/www/html     		#源目录的实际路径                               
comment = Document Root of www.ljm.com	
read only = yes             	#是否为只读                                     
dont comperss = *.gz *.bz2 *.tgz *.zip *.rar *.z  	#同步时不再压缩的文件类型      
auth users = backuper           #授权账户,多个账号以空格分隔                                 
secrets file = /etc/user.db #存放账户信息的数据文件 

为备份账户创建数据文件:
[root@rsync ~]# vim /etc/user.db
[root@rsync ~]# cat /etc/user.db
backuper:abc
[root@rsync ~]# chmod 600 /etc/user.db
#保证所有用户对源目录/var/www/html 都有读的权限
#必须赋予600的权限,否则会报错

创建共享目录:
[root@rsync ~]# mkdir -p /var/www/html
[root@rsync ~]# chmod +r /var/www/html/
[root@rsync ~]# ls -ld /var/www/html/
drwxr-xr-x. 2 root root 24 11月 17 2020 /var/www/html/
[root@rsync ~]# rsync --daemon   #启动rsync 服务程序
[root@rsync ~]# netstat -antp | grep rsync 
tcp        0      0 192.168.152.130:873     0.0.0.0:*               LISTEN      18562/rsync         
[root@rsync ~]# 

2.2.3、客户端测试远程同步

在rsync端源目录/var/www/html/下创建1.txt文件:
[root@rsync ~]# mkdir -p /var/www/html
[root@rsync ~]# chmod +r /var/www/html/
[root@rsync ~]# cd /var/www/html/
[root@rsync html]# ls
index.html
[root@rsync html]# vim 1.txt
[root@rsync html]# cat 1.txt 
hello world
[root@rsync html]# ls
1.txt  index.html
[root@rsync html]# 
1.交互型:验证client端是否实现远程共享

客户端client端下根目录下创建目录abc:
[root@client /]# rsync -avz backuper@192.168.152.130::wwwroot /abc/
Password: 
#注意这边的密码不是虚拟机的密码,是刚才创建的user.db的密码是abc123
receiving incremental file list
./
1.txt
index.html

sent 65 bytes  received 204 bytes  3.93 bytes/sec
total size is 38  speedup is 0.14

[root@client /]# cd /abc/
[root@client abc]# ls
1.txt  index.html
[root@client abc]# cat 1.txt #可以看到已同步
hello world
hello world


2.无交互型:
[root@client /]# vim /etc/server.pass
[root@client /]# cat /etc/server.pass
abc123
[root@client /]# chmod 600 /etc/server.pass
[root@client /]# cd /abc
[root@client abc]# rsync -avz --password-file=/etc/server.pass backuper@192.168.152.130::wwwroot /abc
receiving incremental file list
./
1.txt

sent 46 bytes  received 150 bytes  18.67 bytes/sec
total size is 38  speedup is 0.19

[root@client abc]# ls
1.txt  index.html


这里有个大胆的尝试,删除rsync端的共享目录下的内容,看client端可以同步到啥内容:
[root@rsync ~]# rm -rf /var/www/html/*
[root@rsync ~]# ls /var/www/html/
[root@rsync ~]# 

client再次进行同步操作:目前的状态是rsync端没有任何东西,但是client端存在1.txt文件
[root@client abc]# rsync -avz --password-file=/etc/server.pass backuper@192.168.152.130::wwwroot /abc
receiving incremental file list
./

sent 27 bytes  received 47 bytes  6.43 bytes/sec
total size is 0  speedup is 0.00
#可以看到什么也没有同步,这里就发生了一个逻辑上的不同,既然去同步别人,就应该也是删去1.txt文件的,但是他没有删去
#我们想要实现的是同步应该是本地也删除1.txt,加上--delete即可实现
#--delete 删除目标位置有,而源地址没有的,简而言之就是client有,而rsync没有的

[root@client abc]# rsync -avz --delete --password-file=/etc/server.pass backuper@192.168.152.130::wwwroot /abc
receiving incremental file list
deleting index.html
deleting 1.txt

sent 20 bytes  received 40 bytes  5.22 bytes/sec
total size is 0  speedup is 0.00
[root@client abc]# ls

2.3、rsync的不足

  1. 定期同步的不足
    执行备份的时间固定,延迟明显、实时性差
    当同步源长期不变化时,密集的定期任务是不必要的
    需要人为触发,shell脚本或者crontab
  2. 实时同步的优点
    一旦同步源出现变化,立即启动备份
    只要同步源无变化,则不执行备份

三、rsync结合inotify实时同步

3.1、inotify简介

监控文件系统的变化状态并报告;辅助软件是inotify-tools

参数含义
inotifywait用于持续监控,实时输出结果
inotifywatch用于短期监控,任务完成后再输出结果
max_queue_events监控事件队列大小
max_user_instances最多监控实例数
max_user_watches每个实例最多监控文件数

3.2、持续监控并实时输出监控结果的命令-inotifywait

格式: inotifywait [参数]

常见参数		说明
-m			持续进行监控
-r			递归监控所有子对象
-q			简化输出信息
-e			指定要监控哪些事件类型

3.3、部署实验rsync+inotify

3.3.1、部署环境

主机IP地址
rsync192.168.152.130
client192.168.152.129

3.3.2、搭建并测试过程

rsync端

[root@rsync ~]# vim /etc/rsyncd.conf  #修改rsync配置文件

uid = root
gid = root
use chroot = yes
address = 192.168.152.130
port 873
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
hosts allow = 192.168.152.0/24
[wwwroot]
path = /var/www/html
comment = Document Root of www.ljm.com
read only = no 
dont comperss = *.gz *.bz2 *.tgz *.zip *.rar *.z
auth users = backuper
secrets file = /etc/user.db

[root@rsync ~]# kill  `cat /var/run/rsyncd.pid`
[root@rsync ~]# netstat -natp | grep rsync
[root@rsync ~]# rsync --daemon
[root@rsync ~]# netstat -natp | grep rsync
tcp        0      0 192.168.152.130:873     0.0.0.0:*               LISTEN      19615/rsync         
[root@rsync ~]# 

[root@rsync ~]# cat /proc/sys/fs/inotify/max_queued_events 
16384
[root@rsync ~]# cat /proc/sys/fs/inotify/max_user_instances 
128
[root@rsync ~]# cat /proc/sys/fs/inotify/max_user_watches 
8192
[root@rsync ~]# 
[root@rsync ~]# 
[root@rsync ~]# vim /etc/sysctl.conf  #修改inotify内核参数

fs.inotify.max_queued_events = 32768		##监控时间队列,默认为16384
fs.inotify.max_user_instances = 1024		##最多监控实例数,默认为128
fs.inotify.max_user_watches = 1048576		##每个实例最多监控文件数,默认为8192
#当要监控的目录、文件数据量较多或者变化频繁时,建议加大参数值

[root@rsync ~]# sysctl -p  #刷新生效
fs.inotify.max_queued_events = 32768
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576	

client端

首先进行安装inotify-tools
[root@client abc]# cd
[root@client ~]# cd /opt
[root@client opt]# ls
inotify-tools-3.14.tar.gz  rh
[root@client opt]# yum -y install gcc gcc-c++ make
[root@client opt]# tar zvxf inotify-tools-3.14.tar.gz
[root@client opt]# cd inotify-tools-3.14/
[root@client inotify-tools-3.14]# 
[root@client inotify-tools-3.14]# ./configure
[root@client inotify-tools-3.14]# make && make install

#执行“inotifywait”命令,跟踪屏幕输出结果
#选项“-e”用来指定要监控哪些事件,选项“-m”表示持续监控,选项“-r”表示递归整个目录,选项“-q”简化输出信息
[root@client ~]# inotifywait -mrq -e modify,create,move,delete /abc

此时另开一个端口,输入以下命令进行验证:

[root@client ~]# cd /abc
[root@client abc]# ls
[root@client abc]# vim 1.txt
[root@client abc]# mv 1.txt a.txt
[root@client abc]# ls
a.txt
[root@client abc]# 

可以看到之前的命令下发生如下变化:显示创建的过程,再是移动覆盖名字的过程

 为了方便,client端可以编写脚本实现自动两端同步:
目的是只要检测到变动时就执行 rsync 上行同步操作即可。需要注意的是, 当更新较频繁时,应避免并发执行 rsync 备份——若 rsync 进程已经存在,则忽略本次同步, 或者根据 rsync 进程数量(取决于实际任务)来决定是否同步

[root@client ~]# cd /opt
[root@client opt]# vim inotify.sh

#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e create,delete,move,modify,attrib /abc/"
RSYNC_CMD="rsync -apzH --delete --password-file=/etc/server.pass /abc/ backuper@192.168.152.130::wwwroot/"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
    if [ $(pgrep rsync | wc -l) -le 0 ] ; then
        $RSYNC_CMD
	fi
done

脚本详解:
INOTIFY_CMD:持续监听并时时报告指定目录下的报告
RSYNC_CMD:把本地推送到对方192.168.152.130同步源的共享目录里面
inotify_cmd:监听abc的动态变化,但是无法同步,这时就需要rsync -apzH(H:符号连接)将abc目录下的数据同步,那么同步给谁,backuper@192.168.152.130::wwwroot/:表示同步给rsycn源服务器;
数据同步指的是:本地abc的内容同步给wwwroot的模块内/var/www/html内

[root@client opt]# chmod +x inotify.sh
[root@client opt]# chmod +x /etc/rc.d/rc.local
[root@client opt]# echo "/opt/inotify.sh" >> /etc/rc.d/rc.local
#/etc/rc.d/init.d/目录下的脚本就类似与windows中的注册表,在系统启动的时候某些指定脚本将被执行

再次验证是否成功,查看rsync下面的配置文件是否修改,删除共享目录下面的文件并重启一下服务:

[root@rsync ~]# ls -ld /var/www/html
drwxr-xr-x. 2 root root 6 8月  12 01:36 /var/www/html
[root@rsync ~]# cd /var/www/html
[root@rsync html]# ls

[root@rsync ~]#  netstat -anpt | grep 873
tcp        0      0 192.168.152.130:873     0.0.0.0:*               LISTEN      19615/rsync         
[root@rsync ~]# pkill -9 rsync
[root@rsync ~]# rsync --daemon
failed to create pid file /var/run/rsyncd.pid: File exists
[root@rsync ~]# rsync --daemon
[root@rsync ~]# failed to create pid file /var/run/rsyncd.pid: File exists

[root@rsync ~]# 
[root@rsync ~]# rm -rf /var/run/rsyncd.pid
[root@rsync ~]# rsync --daemon
[root@rsync ~]#  netstat -anpt | grep 873
tcp        0      0 192.168.152.130:873     0.0.0.0:*               LISTEN      19963/rsync         
[root@rsync ~]# 

切换回client端,运行脚本文件

[root@client opt]# cd /abc
[root@client abc]# ls
a.txt
[root@client abc]# rm -rf a.txt 
#先删除目录下所有文件
[root@client abc]# cd /opt
[root@client opt]# ls
inotify.sh  inotify-tools-3.14  inotify-tools-3.14.tar.gz  rh
[root@client opt]# sh -x inotify.sh

到这一步的时候,另开一个client端口,进入abc目录下,创建新的文件,判断rsync端是否同步到内容即可:
[root@client ~]# cd /abc/
[root@client abc]# ls
[root@client abc]# mkdir 1.txt
[root@client abc]# 

rsync服务器:
[root@rsync ~]# cd /var/www/html/
[root@rsync html]# ls
1.txt

以上是关于你必须要知晓文件备份同步小技巧之rsync!的主要内容,如果未能解决你的问题,请参考以下文章

Linux之RSYNC文件同步服务

Linux服务之Rsync

本地远程数据同步之rsync

开源服务专题之-------rsync数据备份

Linux小技巧之断点续传文件rsync

rsync+inotify搭建实时同步系统