目录
1. ssh协议数据同步:将服务器A数据同步备份到rsync服务器
2. rsync协议数据同步:将服务器A数据同步备份到rsync服务器
一、概述
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 [email protected]:/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 [email protected]:/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://[email protected]/web /filedst
拓展:
--delete #删除本地比服务器多出来的文件(源地址没有,目标地址有的删掉)
rsync -avz --delete rsync://[email protected]/web /filedst
- 上行同步(上传恢复)
格式:rsync -avz /本地目录/* rsync://用户名@服务器地址/共享模块名
示例:rsync -avz /filedst/* rsync://[email protected]/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://[email protected]/web /filedst/
#以zhangsan用户向10.88.62.171服务器的web共享模块进行数据同步
ll /filedst
#查看同步结果
rsync -avz --delete rsync://[email protected]/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://[email protected]/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 &
#将两个同步脚本放到后台运行
# 分别在两个主机上创建文件查看是否可以实现双向实时同步(可能会有延迟)
# 创建一个隐藏的参考文件,保证删除最后一个非隐藏文件时也能够正常同步
# 在目录下创建删除文件,看能否同步,包括删除目录下所有