RSYNC---文件实时同步

本文详细介绍了rsync的数据同步工具特性,包括更新目录树、权限保留、高效传输等,并通过SSH和rsync协议进行实验演示,涉及单向实时同步(inotify)和双向实时同步(unison)的配置。
摘要由CSDN通过智能技术生成

目录

一、概述

二、rsync特性

三、rsync工作原理

四、rsync实验演示

1. ssh协议数据同步:将服务器A数据同步备份到rsync服务器

命令:

实验:

2. rsync协议数据同步:将服务器A数据同步备份到rsync服务器

命令:

实验:

3.配置rsync+inotify单向实时同步

inotify简介

命令

实验:

4.配置unison+inotify实现双向实时同步


一、概述

       rsync是类unix系统下的数据镜像备份工具。一款支持快速完全备份和增量备份的工具,支持本地复制,远程同步等,类似于scp命令;rsync 命令在同步文件之前要先登录目标主机进行用户身份认证,认证过后才能进行数据同步,身份认证方式取决于所使用的协议类型,rsync一般使用两种协议进行数据同步:ssh协议和rsync协议。

二、rsync特性

        1. 能更新整个目录树和文件系统

        2. 有选择性的保留符号链接、硬链接、文件属性、权限、设备以及时间等

        3. 对于安装来说,无任何特殊权限要求

        4. 对于多个文件来说,文件传输效率高

        5. 能用ssh或自定义端口作为传输入口端口

三、rsync工作原理

       既然涉及到数据同步,必要的两个概念是:源地址(文件),目标地址(文件),以及以哪一方为基准,例如,想让目标主机上的文件和本地文件保持同步,则是以本地文件为同步基准,将本地文件作为源文件推送到目标主机上。

rsync在进行数据同步之前需要先进行用户身份验证,验证方式取决于使用的连接方式:

ssh登录验证模式:使用ssh协议作为基础进行用户身份认证,然后进行数据同步。

rsync登录验证模式:使用rsync协议进行用户身份认证(非系统用户),然后进行数据同步。

数据同步方式:推送(上传)、拉取(下载) 

四、rsync实验演示

环境准备:两台虚拟机,一台服务器A,一台rsync数据备份服务器。

1. ssh协议数据同步:将服务器A数据同步备份到rsync服务器

命令:

  • 下行同步(下载备份)
格式:rsync -avz 服务器地址:/服务器目录/* /本地目录

示例:rsync -avz root@10.88.62.171:/filesrc/rsync_test.txt /filedst

参数:
    -a    #--archive: 归档模式,相当于 -rlptgoD(递归、保持软硬链接、保持权限、保持时间戳、保持属组、保持拥有者、保持设备文件和特殊文件)
    -v    #--verbose: 详细模式输出
    -z    #--compress: 数据压缩传输
    -h    #--human-readable: 以更易读方式输出
    -P    #等同于 --partial(允许中断的传输继续)和 --progress 的结合

    -r    #--recursive: 递归地复制目录
    -u    #--update: 跳过所有新源文件或目录上的文件
    --delete    #删除那些在源目录树不存在的文件
    --progress: 显示传输过程中的进度信息
    -n    #--dry-run: 模拟运行
    -e    #--rsh=COMMAND: 指定使用的远程shell,常用来指定 ssh
    -l    #--links: 当复制符号链接时,保持链接是链接。默认情况下,符号链接会被解引用。
    -p    #--perms: 保持文件权限不变
    -t    #--times: 保持文件时间戳不变
    -S    #--sparse: 优化稀疏文件的传输
    --exclude=PATTERN    #排除匹配PATTERN的文件
    --include=PATTERN    #包含匹配PATTERN的文件
    --backup    #创建备份,即将目标目录中的更新或删除文件后缀为 ~
    --backup-dir    #指定备份更新或删除文件的目录
    --max-size=SIZE: 不传输大于指定SIZE的文件
    --min-size=SIZE: 不传输小于指定SIZE的文件   
    --bwlimit=RATE: 限制带宽,单位KBytes
    --stats    #输出传输统计信息
  • 上行同步(上传恢复)

格式:rsync -avz /本地目录/* 服务器A地址:/目录/

示例:rsync -avz /filedst/rsync_test.txt root@10.88.62.171:/filesrc/

参数:
    -a    #归档模式,递归并保留对象属性
    -v    #显示同步过程
    -z     #在传输文件时继续压缩
  • 注意:

使用root用户进行实验可以,但生产环境中尽量使用单独创建的普通用户,减少权限溢出

#创建用来做数据同步的用户,并给予用户对目录的相应权限,一般使用ACL设置权限
useradd zhangsan
passwd zhangsan
setfacl -m u:zhangsan:rwx /filesrc
  • 免密:

若要实现免密码数据同步,只需要做好ssh密钥对登录即可

#客户端建立密钥文件传给服务器端,实现免密登录传输。
ssh-keygen -t rsa -b 2048
ssh-copy-id 192.168.88.110

实验:

#环境准备:两台虚拟机,一台服务器A(10.88.62.171),一台rsync服务器(10.88.62.172)
#如果服务器没有rsync命令,执行yum -y install rsync安装命令

1.服务器A执行
mkdir /filesrc
    #创建数据源目录

cd /filesrc

echo "rsync test" >> rsync_test.txt

2.rsync服务器执行
mkdir /filedst
    #创建rsync备份目录

3.执行rsync数据同步
rsync -avz 10.88.62.171:/filesrc/rsync_test.txt /filedst/
    #rsync服务器下载备份

rsync -avz /filedst/rsync_test.txt 10.88.62.171:/filesrc/
    #rsync服务器上传恢复数据

2. rsync协议数据同步:将服务器A数据同步备份到rsync服务器

命令:

  • 下行同步(下载备份)
格式:rsync -avz rsync://用户名@服务器地址/共享模块名 /本地目录

示例:rsync -avz rsync://user1@10.88.62.171/web /filedst

拓展:
    --delete    #删除本地比服务器多出来的文件(源地址没有,目标地址有的删掉)

    rsync -avz --delete rsync://user1@10.88.62.171/web /filedst
  • 上行同步(上传恢复)
格式:rsync -avz  /本地目录/*  rsync://用户名@服务器地址/共享模块名
示例:rsync -avz /filedst/* rsync://user1@10.88.62.171/web
  • 免密

rsync协议的免密码可以借助一个环境变量实现

vim /etc/profile
    #在最后一行写入
export RSYNC_PASSWORD=123456

source /etc/profile
    #使环境变量生效

实验:

#环境准备:两台虚拟机,一台服务器A(10.88.62.171),一台rsync服务器(10.88.62.172)
#如果服务器没有rsync命令,执行yum -y install rsync安装命令
#在两台服务器上分别创建目录(/filesrc、/filedst)

1.在服务器A配置rsync服务
vim /etc/rsyncd.conf
    #创建主配置文件

address = 10.88.62.171					#rsync服务绑定IP
port 873								#默认服务端口873
log file = /var/log/rsyncd.log			#日志文件位置
pid file = /var/run/rsyncd.pid			#进程号文件位置
[web]								    #共享名:用来连接是写在url上的,切记
	comment = web directory backup		#共享描述话语
	path = /filesrc					    #实际共享目录
	dont compress = *.gz *.bz2			#哪些文件类型不进行压缩
	auth users = zhangsan				#登录用户名(非系统用户,需要自行创建)
	secrets file = /etc/rsyncd_users.db	#认证所需账户密码文件(需自行创建-同上)

2.创建认证所需账户密码文件
vim /etc/rsyncd_users.db
    #创建密码文件
zhangsan:123456

chmod 600 /etc/rsyncd_users.db
    #必须修改权限,否则会登录报错

3.启动服务
rsync –daemon或者systemctl start rsyncd
systemctl enable rsyncd

netstat -anpt | grep 873

4.设置映射用户对共享目录有权限
setfacl -m u:nobody:rwx /filesrc 

#注意:关闭服务可使用kill命令,但偶尔会造成服务被结束。
#但进程号配置文件不被删除的问题,若遇到此类问题可自己手动删除
#再启动则正常(建议自己写一个rsync的服务管理脚本)

5.配置环境变量,实现免密
#rsync服务器执行
vim /etc/profile
    #在最后一行写入
export RSYNC_PASSWORD=123456

source /etc/profile
    #使新增的环境变量生效

6.创建同步文件
#服务器A执行
cd /filesrc && touch {1..9}.txt

7.执行文件同步
#rsync服务器执行
rsync -avz rsync://zhangsan@10.88.62.171/web /filedst/
    #以zhangsan用户向10.88.62.171服务器的web共享模块进行数据同步

ll /filedst
    #查看同步结果

rsync -avz --delete rsync://zhangsan@192.168.88.110/web /filedst/
    #--delete,进行同步时,删除本地比服务器A多出的文件(源地址没有,目的地址有的删除)

3.配置rsync+inotify单向实时同步

inotify简介

    inotify 是一个 Linux 内核特性,它监控文件系统,并且及时向专门的应用程序发出相关的事件警告,比如删除、读、写和卸载操作等。要使用 inotify,必须具备一台带有 2.6.13 版本的内核操作系统。

命令

inotifywait:用于持续监控,实时输出结果(常用)

格式:inotifywait -mrq -e 监控动作1,监控动作2  /监控目录 &

示例:inotifywait -mrq -e create,delete /filesrc &

参数:
    -m:始终保持事件监听状态

    -r:递归查询目录

    -q:只打印监控事件的信息

监控动作:modify(内容),create,attrib(权限),move,delete

实验:

#环境准备:
#两台虚拟机,一台服务器A(10.88.62.171),一台rsync服务器(10.88.62.172)
#mkdir /filesrc(服务器A)         mkdir /filedst(rsync服务器)
#yum -y install rsyncd(客户端和服务器端都要安装)

1.配置服务器A的rsync的共享服务:
#服务器A执行
vim /etc/rsyncd.conf
    #配置rsync服务
address = 10.88.72.171    				#rsync服务绑定IP
port 873								#默认服务端口873
log file = /var/log/rsyncd.log			#日志文件位置
pid file = /var/run/rsyncd.pid			#进程号文件位置
[web]								    #共享名:用来连接是写在url上的,切记
	comment = web directory backup		#共享描述话语
	path = /filesrc					    #实际共享目录
	dont compress = *.gz *.bz2			#哪些文件类型不进行压缩
	auth users = zhangsan				#登录用户名(非系统用户,需要自行创建)
	secrets file = /etc/rsyncd_users.db	#认证所需账户密码文件(需自行创建-同上)

vim /etc/rsyncd_users.db
    #声明允许连接的用户和密码
zhangsan:123456

chmod 600 /etc/rsyncd_users.db

setfacl -m u:nobody:rwx /filesrc
	
systemctl restart rsyncd && systemctl enable rsyncd && netstat -anpt | grep 873

yum -y install epel-release && yum -y install inotify-tools
    #安装inotify服务,需先安装扩展源

inotifywait -mrq -e create,delete,modify,attrib,move /filesrc/
    #对/filesrc/目录进行监控,有任何监控的行为时通知我

再开一个终端:
touch /filesrc/a.txt
    #创建后,观察监控终端的输出信息,测试成功后关闭此终端

vim src.sh
    #利用 rsync+inotifywait 结合脚本实现单向实时同步
#!/bin/bash
a="inotifywait -mrq -e create,delete,modify,attrib,move /filesrc"
$a | while read directory event file		#while判断是否接收到监控记录
do
    ssh 10.88.62.172 'export RSYNC_PASSWORD=123456; rsync -avz --delete rsync://zhangsan@10.88.62.171/web /filedst'
done

ssh-keygen -t rsa -b 2048
    #生成新的密钥对文件

ssh-copy-id 10.88.62.172
    #将公钥传到rsync服务器,实现免密登录

nohup bash -x src.sh &
    #启动同步脚本,#放入后台运行,并且输出执行变量。

touch /filesrc/123.txt
    #创建文件,测试能否同步成功

rsync服务器端查看/filesrc目录下文件是否同步成功

4.配置unison+inotify实现双向实时同步

       rsync在单向同步上支持的非常好,且效率很高,但是在双向同步支持较差;unison则是双向同步的优秀工具,但其缺点是同步效率较低。

# 环境准备
# 两台虚拟机,服务器A(10.88.62.171),服务器B(10.88.62.172)
# 创建好 /filesrc 和 /filedst 两个目录
# 生成密钥对,以便免密验证

1.安装 inotify 和 unison 服务
yum -y install inotify unison

2.配置同步脚本
# 注:双向自动同步,监控目录和数据同步时,源目录不能使用*通配符传输,否则会变成死循环。

filesrc端:
vim filesrc.sh
#!/bin/bash
a="inotifywait -mrq -e create,delete,modify,attrib,move /filesrc/"
b="/usr/local/bin/unison -batch /filesrc ssh://10.88.62.172//filedst/" 
	#-batch:批处理
$a | while read directory event file
do
	$b
done


filedst端:
vim filedst.sh
#!/bin/bash
a="inotifywait -mrq -e create,delete,modify,attrib,move /filedst/"
b="/usr/local/bin/unison -batch /filedst/ ssh://10.88.62.171//filesrc/" 
	#-batch:批处理
$a | while read directory event file
do
	$b
done

3.免密登录
filesrc 和 filedst 要互相登录
ssh-keygen -t rsa -b 2048
ssh-copy-id 10.88.62.171 (172)

4.测试
nohup bash -x filesrc.sh &
nohup bash -x filedst.sh &
    #将两个同步脚本放到后台运行
# 分别在两个主机上创建文件查看是否可以实现双向实时同步(可能会有延迟)
# 创建一个隐藏的参考文件,保证删除最后一个非隐藏文件时也能够正常同步
# 在目录下创建删除文件,看能否同步,包括删除目录下所有
  • 29
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值