rsync远程同步

739 阅读8分钟

rsync远程同步

一.rsync介绍

① rsync是一款开源的、快速的、多功能的、可实现全量及增量的本地或远程数据同步备份的优秀工具。并且可以不进行改变原有数据的属性信息,实现数据的备份迁移特性。

② rsync软件支持跨平台,适用于unix/ linux/windows等多种操作系统平台

③ rsync是一个快速和非常方便的文件复制工具。它能本地复制,远程复制,或者远程守护进程方式复制,它提供了大量的参数来控制其行为的各个方面,并且允许非常灵活的方式来实现文件的传输复制

④ 以其delta-transfer算法闻名。

⑤ rsync监听端口:873

⑥ rsync运行模式:C/S1.2 rsync同步方式

1.2 rsync同步方式

  1. 全量备份:原有的数据全部传送,把原来的文件和新的文件一起统一传送,全量复制,效率低
  2. 增量备份:在传输数据之前通过一些算法通过你有的数据和我有的数据进行对比,把不一样的数据通过网络传输增量复制,效率高

1.3 rsync特性

可以镜像保存整个目录和文件系统 可以很容易做到保持原文件的权限、时间、软硬连接等 无须特殊权限即可安装 快速

第一次同步时rsync会复制全部内容,但在下一次只传输修改过的文件 rsync在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的宽带

安全

可以使用scp、ssh等方式来传输文件 也可通过直接socket连接 支持匿名传输,以方便进行网站镜像

1.4rsync与cp、scp对比

  • cp对比命令是一种典型的将文件完整的拷贝到一个位置。而rsync是,第一次拷贝,在目标位置没有的时候,rsync是全量拷贝过去,但是第二次拷贝的时候,只会对差异项进行同步拷贝。所有如果对同一个文件进行二次备份的话,rsync速度会相较于cp而言更快。
  • cp只支持本地,而rsync支持远程
  • scp是基于cp原理,也是属于完整性拷贝文件。假设rsync和scp拷贝的文件都是第一,目标地址都没有要同步的文件,此时,这两者的差异在于,第一个,这个要传输的文件大不大,第二个要看在传输的过程中,用的带宽大不大。如果文件不大的情况下,scp是把数据从磁盘中的块存储提取出来,封装一下,网络传过去,此时scp更快,如果是更大的文件,比如说40G,带宽只支持100M的带宽,scp想要传输,需要拆分数据,一段一段传输。而rsync会根据一个逻辑意义上的空间,把数据划分出来,把数据先压缩再传输,所以这种方式而言,带宽校,文件大,这个时候先压缩再传输会比较快。此时适合用rsync远程同步。

1.5 rsync命令

常用选项:
-r:递归模式,包含目录及子目录中的所有文件。
-l:对于符号链接文件仍然复制为符号链接文件。
-v:显示同步过程的详细(verbose)信息。
-z:在传输文件时进行压缩(compress)。
-a:归档模式,保留文件的权限、属性等信息,等同于组合选项“-rlptgoD”。
-p:保留文件的权限标记。
-t:保留文件的时间标记。
-g:保留文件的属组标记(仅超级用户使用)。
-o:保留文件的属主标记(仅超级用户使用)。
-H:保留硬连接文件。
-A:保留 ACL 属性信息。
-D:保留设备文件及其他特殊文件。
--delete:删除目标位置有而原始位置没有的文件。
--checksum:根据校验和(而不是文件大小、修改时间)来决定是否跳过文件。

1.6 Rsync 同步源

在远程同步任务中,负责发起 rsync 同步操作的客户机称为客户端,而负责响应来自客户端的 rsync 同步操作的服务器称为备份源,也称之为同步源

  • 在下行同步(下载)中,同步源负责提供文档的原始位置,发起端应对该位置有读取权限
  • 在上行同步(上传)中,同步源负责提供文档的目标位置,发起端应对该位置具有写入权限

image-20220613014157921

 

二.rsync远程同步实例(下行同步)

2.1配置rsync源服务器

--------------------配置rsync源服务器---------------------------
rpm -q rsync							#一般系统已默认安装rsync

------------------------------#建立/etc/rsyncd.conf 配置文件-------------------------------------------------------
vim /etc/rsyncd.conf				#添加以下配置项
uid = root
gid = root
use chroot = yes										#禁锢在源目录
address = 192.168.80.10									#监听地址
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.80.0/24							#允许访问的客户机地址
dont compress = *.gz *.bz2 *.tgz *.zip *.rar *.z		#同步时不再压缩的文件类型

[wwwroot]												#共享模块名称
path = /var/www/html									#源目录的实际路径
comment = Document Root of www.kgc.com
read only = yes											#是否为只读
auth users = backuper									#授权账户,多个账号以空格分隔
secrets file = /etc/rsyncd_users.db						#存放账户信息的数据文件

#如采用匿名的方式,只要将其中的“auth users”和“secrets file”配置项去掉即可。

-----------------------------------------#为备份账户创建数据文件----------------------------------------------------
vim /etc/rsyncd_users.db
backuper:abc123					#无须建立同名系统用户

chmod 600 /etc/rsyncd_users.db

-------------------------#保证所有用户对源目录/var/www/html 都有读取权限---------------------------------------------
chmod +r /var/www/html/
ls -ld /var/www/html/

------------------------------------#启动 rsync 服务程序----------------------------------------------------------
rsync --daemon				#启动 rsync 服务,以独立监听服务的方式(守护进程)运行 

netstat -anpt | grep rsync

--------------------------------------------#关闭 rsync 服务-------------------------------------------------------
kill $(cat /var/run/rsyncd.pid)
rm -rf /var/run/rsyncd.pid
##关闭服务后,一定要看一下pid文件有没有被删除,不然下次启动服务时启动不了
2.1.1 建立/etc/rsyncd.conf 配置文件

image-20220612131009193

2.1.3 为备份账户创建数据文件

image-20220612110744880

image-20220612110843187

2.1.4 保证所有用户对源目录/var/www/html 都有读取权限

image-20220611163909528

2.1.5 启动 rsync 服务程序
rsync --daemon				#启动 rsync 服务,以独立监听服务的方式(守护进程)运行 

image-20220612133055347

2.2 发起端服务器设置

------------------------发起端---------------------------------------
基本格式:rsync [选项] 原始位置 目标位置

常用选项:
-r:递归模式,包含目录及子目录中的所有文件。
-l:对于符号链接文件仍然复制为符号链接文件。
-v:显示同步过程的详细(verbose)信息。
-z:在传输文件时进行压缩(compress)。
-a:归档模式,保留文件的权限、属性等信息,等同于组合选项“-rlptgoD”。
-p:保留文件的权限标记。
-t:保留文件的时间标记。
-g:保留文件的属组标记(仅超级用户使用)。
-o:保留文件的属主标记(仅超级用户使用)。
-H:保留硬连接文件。
-A:保留 ACL 属性信息。
-D:保留设备文件及其他特殊文件。
--delete:删除目标位置有而原始位置没有的文件。
--checksum:根据校验和(而不是文件大小、修改时间)来决定是否跳过文件。

------------------------------#将指定的资源下载到本地/opt 目录下进行备份。-------------------------------------------
格式一:
rsync -avz backuper@192.168.80.10::wwwroot /opt/					#密码abc123

格式二:
rsync -avz rsync://backuper@192.168.80.10/wwwroot /opt/

--------------------------------#免交互格式配置:----------------------------------------------------------------
echo "abc123" > /etc/server.pass
chmod 600 /etc/server.pass

crontab -e
30 22 * * * /usr/bin/rsync -az --delete --password-file=/etc/server.pass backuper@192.168.80.10::wwwroot /opt/
#为了在同步过程中不用输入密码,需要创建一个密码文件,保存 backuper 用户的密码,如 /etc/server.pass。在执行 rsync 同步时使用选项 “--password-file=/etc/server.pass” 指定即可。

systemctl restart crond
systemctl enable crond
2.2.1 在rsync源服务器准备文件

image-20220612135555287

2.2.2 使用方法1将指定的资源下载到本地/opt目录下进行备份

关闭发起端主机防火墙和selinux

systemctl stop firewalld
setenforce 0

从rsync源服务器上下载内容

方法1
rsync -avz backuper@192.168.10.90::wwwroot /opt/

image-20220612202805962

验证是否下载成功

image-20220612202906965

2.2.3 使用方法2url方式将指定的资源下载到本地/opt目录下进行备份
方法2
rsync -avz rsync://backuper@192.168.80.10/wwwroot /opt/

image-20220612203152805

三.rsync远程同步拓展

3.1 --delete + 免交互 +crontab-e

--delete的作用是删除目标位置有而原始位置没有的文件。

echo "abc123" > /etc/server.pass  ##首先需要准备面交互文件
chmod 600 /etc/server.pass    ##设置权限,只有所有这有写和读的权限

crontab -e
30 22 * * * /usr/bin/rsync -az --delete --password-file=/etc/server.pass backuper@192.168.80.10::wwwroot /opt/
#为了在同步过程中不用输入密码,需要创建一个密码文件,保存 backuper 用户的密码,如 /etc/server.pass。在执行 rsync 同步时使用选项 “--password-file=/etc/server.pass” 指定即可。
3.1.1免交互功能准备

rsync发起段主机:192.168.10.100

在rsync命令中加入--password-file=密码文件的绝对路径即可

echo "abc123" > /etc/server.pass  ##首先需要准备面交互文件
chmod 600 /etc/server.pass    ##设置权限,只有所有这有写和读的权限,如果给其他用户权限,将无法使用rsync免交互功能同步文件

image-20220612211556299

3.1.2 --delete准备

输入rsync同步命令,加入--delete选项即可

3.1.3 同时实现--delete + 免交互

上面两部已经准备好了免交互和--delete的条件,开始同步

image-20220612212420961

--delete的功能

image-20220612212746646

3.1.4 使用crond功能实现定时同步
systemctl status crond           ##查看crond服务是否打开

crontab -e
* */2 * * * /usr/bin/rsync -avz --delete --password-file=/etc/server.pass backuper@192.168.10.90::wwwroot /opt/
#每隔两个小时同步一次文件,使用--delete和免交互登录,同步文件到opt目录,rsync使用绝对路径输入

crontab-l                    
#查看计划性任务是否新建完成

rsync使用绝对路径输入 /usr/bin/rsync

image-20220612213542178

每隔两个小时同步一次

image-20220612213455990

crontab-l 查看计划性任务是否新建完成

image-20220612213758105

四.rsync实时同步(上行同步)

上面rsync配和crontab实现定时同步,下面说一下实时同步的实现,需要配合Linux内核的inotity机制实现

image-20220612214639251

4.1 实时同步和定时同步优缺点

定期同步的不足

  • 执行备份的时间固定,延迟明显、实时性差
  • 当同步源长期不变化时,密集的定期任务是不必要的

实时同步的优点

  • 一旦同步源出现变化,立即启动备份
  • 只要同步源无变化,则不执行备份

4.2 关于inotify机制

在Linux内核中,默认的inotify机制提供了三个调控参数:max_queue_events(监控事件队列,默认值为16384)、max_user_instances(最多监控实例数,默认值为128)、max_user_watches(每个实例最多监控文件数,默认值为8192)。当要监控的目录、文件数量较多或者变化较频繁时,建议加大这三个参数的值。

4.3 配置

 

4.3.1 Master 关闭只读模式并为共享目录赋权
vim /etc/rsyncd.conf
......
read only = no											#关闭只读,上行同步需要可以写

kill $(cat /var/run/rsyncd.pid) 						  #重启rysnc服务
rm -rf /var/run/rsyncd.pid								 #删除pid文件
rsync --daemon	  										#启动rysnc
netstat -anpt | grep rsync								 #查看rsync是否启动完成

chmod 777 /var/www/html/ 								#授予分享文件夹777最高权限
  1. 编辑rsync配置文件

image-20220613000836303

  1. 重启rsync

image-20220612221807502

  1. 授予分享文件夹777最高权限

image-20220612221923873

4.3.2优化 Slave 内核参数

slvae:192.168.10.100

在Linux内核中,默认的inotify机制提供了三个调控参数:max_queue_events(监控事件队列,默认值为16384)、max_user_instances(最多监控实例数,默认值为128)、max_user_watches(每个实例最多监控文件数,默认值为8192)。当要监控的目录、文件数量较多或者变化较频繁时,建议加大这三个参数的值。

cat /proc/sys/fs/inotify/max_queued_events
cat /proc/sys/fs/inotify/max_user_instances
cat /proc/sys/fs/inotify/max_user_watches

vim /etc/sysctl.conf
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576

sysctl -p

默认的inotify三个参数的值

image-20220612222039320

调整inotify三个参数的值

image-20220612223205254

system-p刷新配置

image-20220612223354854

4.3.3 slave端安装 inotify-tools

slave:192.168.10.100

用 inotify 机制还需要安装 inotify-tools,以便提供 inotifywait、inotifywatch 辅助工具程序,用来监控、汇总改动情况。 inotifywait:可监控modify(修改)、create(创建)、move(移动)、delete(删除)、attrib(属性更改)等各种事件,一有变动立即输出结果。 inotifywatch:可用来收集文件系统变动情况,并在运行结束后输出汇总的变化情况。

--------------------------------------拖入notify-tools安装包,编译安装----------------------------------------------
tar zxvf inotify-tools-3.14.tar.gz -C /opt/

cd /opt/inotify-tools-3.14
./configure
make && make install

-----------------------------------------使用notifywait命令监控-----------------------------------------------------
#可以先执行“inotifywait”命令,然后另外再开启一个新终端向 /var/www/html 目录下添加文件、移动文件,在原来的终端中跟踪屏幕输出结果。
inotifywait -mrq -e modify,create,move,delete /opt
#选项“-e”:用来指定要监控哪些事件
#选项“-m”:表示持续监控
#选项“-r”:表示递归整个目录
#选项“-q”:简化输出信息

编译安装notify-tools

image-20220612225231212

使用inotifywait命令开启监控slave本机

image-20220612235442982

4.3.4 在slave端编写触发式同步脚本

注意,脚本名不可包含 rsync 字符串,否则脚本可能不生效

vim /opt/inotify.sh

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


----------------------------------------------脚本详解------------------------------------------------------------
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e modify,create,attrib,move,delete /opt/"
#INOTIFY_CMD变量:持续监控 /opt目录中的创建,删除,移动,修改,改变时间的操作
RSYNC_CMD="rsync -azH --delete --password-file=/etc/server.pass /opt backuper@192.168.10.90::upload/"
#RSYNC_CMD变量:使 xxx 用户,/etc/server.pass 密钥文件,将 /opt 目录下的文件进行压缩,归档,保留硬链接文件同步至 192.168.10.90(master服务器) 的共享模块定义的目录 /opt 下,删除差异性内容,保持一致性
$INOTIFY_CMD | while read DIRECTORY EVENT FILE                 #持续监控...
do
    if [ $(pgrep rsync | wc -l) -le 0 ] ; then                 #如果服务并未启动,则执行同步
        $RSYNC_CMD
    fi
done



chmod +x /opt/inotify.sh
chmod 777 /var/www/html/
chmod +x /etc/rc.d/rc.local
echo '/opt/inotify.sh' >> /etc/rc.d/rc.local				#加入开机自动执行

触发式同步脚本

image-20220613003649034

给脚本赋权并加入开机自启

image-20220613003601905

执行脚本

image-20220613004135851

开启一个新的终端链接slave服务器测试脚本功能

image-20220613011729093

查看master主机是否同步完成

image-20220613011329931

五.使用rsync来实现快速删除大量文件

//使用rsync来实现快速删除大量文件。
假如要在linux下删除大量文件,比如100万、1000万,像/usr/local/nginx/proxy_temp的nginx缓存等,那么rm -rf * 可能就不好使了,因为要等待很长一段时间。在这种情况下我们可以使用rsync来巧妙处理。rsync实际用的是替换原理。

先建立一个空的文件夹:
mkdir /home/blank

用rsync删除目标目录:
rsync --delete-before -a -H -v --progress --stats /home/blank/ /usr/local/nginx/proxy_temp
这样目标目录很快就被清空了
选项说明:
--delete-before 接收者在传输进行删除操作
-a 归档模式,表示以递归方式传输文件,并保持所有文件属性
-H 保持硬连接的文件
-v 详细输出模式
--progress 在传输时显示传输过程
--stats 给出某些文件的传输状态