rsync服务
1、rasync概述
rsync 是类 unix 系统下的数据镜像备份工具。
一款支持快速完全备份和增量备份的工具,支持本地复制,远程同步等,类似于 scp 命令;
rsync 命令在同步文件之前要先登录目标主机进行用户身份认证,认证过后才能进行数据同步,身份认证方式取决于所使用的协议类型,
rsync 一般使用两种协议进行数据同步:
- ssh 协议
- rsync 协议。
rsync特性
- 能更新整个目录树和文件系统
- 有选择性的保留符号链接、硬链接、文件属性、权限、设备以及时间等
- 对于安装来说,无任何特殊权限要求
- 对于多个文件来说,文件传输效率高
- 能用 ssh 或自定义端口作为传输入口端口
rsync工作原理
既然涉及到数据同步,必要的两个概念是:源地址(文件),目标地址(文件),以及以哪一方为基准;
例如,想让目标主机上的文件和本地文件保持同步,则是以本地文件为同步基准,将本地文件作为源文件推送到目标主机上。
rsync 在进行数据同步之前需要先进行用户身份验证,验证方式取决于使用的连接方式:
- **ssh 登录验证模式:**使用 ssh 协议作为基础进行用户身份认证,然后进行数据同步。
- **rsync 登录验证模式:**使用 rsync 协议进行用户身份认证(非系统用户),然后进行数据同步。
- **数据同步方式:**推送(上传)、拉取(下载)
2、rsync实验
使用ssh协议数据同步
规划:
- 两台服务器,一台是src服务器
- 一台是desc服务器
操作:
- 格式:rsync -avz 服务器地址:/服务器目录/* /本地目录
- -a:归档模式,递归并保留对象属性
- -v:显示同步过程
- -z:在传输文件时进行压缩
- 格式:rsync -avz 服务器地址:/服务器目录/* /本地目录
#src服务器准备点原始数据
[root@node0 ~]# mkdir /src
[root@node0 ~]# cd /src/
[root@node0 src]# touch {1..5}.txt
[root@node0 src]# ls
1.txt 2.txt 3.txt 4.txt 5.txt
#然后使用desc服务器拉取数据
[root@Node1 ~]# mkdir /desc
[root@Node1 ~]# cd /desc
[root@Node1 desc]# rsync -avz root@192.168.75.130:/src/* /desc/
[root@Node1 desc]# ls
1.txt 2.txt 3.txt 4.txt 5.txt
#可以做一个免密要登陆来完成,两台服务器都要做
[root@node0 src]# ssh-keygen
[root@node0 src]# ssh-copy-id root@192.168.75.131
#在后再次尝试就可以不用输入密码了
[root@Node1 desc]# rsync -avz root@192.168.75.130:/src/* /desc/
使用rsync协议数据同步
- 同样是使用两台服务器,一台是src和一台是desc
- 在src上面搭建rsync服务
- 自己创建一个配置文件(/etc/rsyncd.conf)
address = 192.168.75.131 #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 #实际共享目录
read only = no #是否仅允许读取
dont compress = *.gz *.bz2 #哪些文件类型不进行压缩
auth users = user1 #登录用户名(非系统用户,需要自行创建)
secrets file = /etc/rsyncd_users.db #认证所需账户密码文件(需自行创建-同上)
- 创建认证所需账户密码文件
# vim /etc/rsyncd_users.db
user1:123456
# chmod 600 /etc/rsyncd_users.db 必须修改权限,否则登录报错
- 启动服务
# rsync --daemon
# netstat -antp | grep :873
- 设置映射用户对共享目录有权限(r)
# setfacl -m u:nobody:rwx /src
- 格式:rsync -avz rsync://用户名@服务器地址/共享模块名 /本地目录
- :–delete:删除本地比服务器多出来的文件(源地址没有,目标地址有的删掉)
- 格式:rsync -avz /本地目录/* rsync://用户名@服务器地址/共享模块名
- export RSYNC_PASSWORD=虚拟用户密码(客户端生成
实验过程
#src服务器配置rsync主配置文件
[root@node0 src]# vim /etc/rsyncd.conf
.............
address = 192.168.75.130
port 873
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
[web]
comment = web directory backup
path = /filesrc
read only = no
dont compress = *.gz *.bz2
auth users = user1
secrets file = /etc/rsyncd_users.db
#创建用户密码文件
[root@node0 src]# vim /etc/rsyncd_users.db
user1:123456
[root@node0 src]# chmod 600 /etc/rsyncd_users.db
#启动服务
[root@node0 src]# rsync --daemon
[root@node0 src]# netstat -atnupl | grep 873
tcp 0 0 192.168.75.130:873 0.0.0.0:* LISTEN 22982/rsync
#设置映射用户的权限
[root@node0 src]# setfacl -m u:nobody:rwx /src
#使用desc服务器验证
[root@Node1 desc]# rsync -avz rsync://user1@192.168.75.130/web /desc
3、rsync+inotify实时同步实验
定期同步的缺点:
- 执行备份的时间固定,延期明显,实时性差
- 当同步源长期不变化时,密集的定期任务是不必要的(浪费资源)
定期同步的优点:
- 一旦同步源出现变化,立即启动备份,实时性好
- 只要同步源无变化,则不执行备份,节省资源
inotify简介:
inotify 是一个 Linux 内核特性,它监控文件系统,并且及时向专门的应用程序发出相关的事件警告,比如删除、读、写和卸载操作等。要使用inotify,必须具备一台带有 2.6.13 版本的内核操作系统。
inotify的监控命令
- inotifywait:用于持续监控,实时输出结果(常用)
- inotifywatch:用于短期监控,任务完成后再出结果
src服务器部署inotify
#安装必要的依赖
[root@node0 src]# yum -y install gcc*
#准备好notify的源码包
[root@node0 ~]# ls inotify-tools-3.13.tar.gz
inotify-tools-3.13.tar.gz
#预编译编译安装
[root@node0 ~]# tar -xf inotify-tools-3.13.tar.gz
[root@node0 ~]# cd inotify-tools-3.13/
[root@node0 inotify-tools-3.13]#
[root@node0 inotify-tools-3.13]# ./configure && make && make install
inotifywait命令格式
- 格式:inotifywait -mrq -e 监控动作 1,监控动作 2 /监控目录 &
- 语法:
- -m:始终保持事件监听状态
- r:递归查询目录
- -q:只打印监控事件的信息
- 监控动作:modify(内容),create,attrib(权限),move,delete
#首先测试一下单个目录的变动
#双开两个窗口
[root@node0 ~]# inotifywait -mrq -e create,delete,modify /src/
#去到另外一个窗口
[root@node0 src]# rm -rf 1.txt
[root@node0 src]#
#然后就能实时监控
[root@node0 ~]# inotifywait -mrq -e create,delete,modify /src/
/src/ DELETE 1.txt
#到这里可以直接结合rsync来实行同步
#编写一个脚本
[root@node0 ~]# vim src.sh
#!/bin/bash
a="inotifywait -mrq -e create,delete /src"
b="rsync -avz /src/* root@192.168.75.131:/desc"
$a | while read directory event file
do
$b
done
#然后启动脚本
[root@node0 ~]# bash src.sh &
[1] 28847
#然后去到src目录创建目录-->再看desc服务器有没有同步过去
[root@node0 src]# touch {a..f}.doc
#看到这里实验成功了
[root@node0 ~]# sending incremental file list
2.txt
3.txt
4.txt
5.txt
a.doc
b.doc
c.doc
d.doc
e.doc
f.doc
sent 550 bytes received 206 bytes 72.00 bytes/sec
total size is 0 speedup is 0.00
sending incremental file list
扩展:调整inotify监控文件的数量
- 调整 inotify 内核参数(/etc/sysctl.conf)
- mak_queue_events :监控队列大小
- mak_user_instances :最多监控实例数
- max_user_watches :每个实例最多监控文件数
4、 unison+inotify 实现双向实时同步
rsync 在单向同步上支持的非常好,且效率很高,但是在双向同步支持较差
unison 则是双向同步的优秀工具,但其缺点是同步效率较低;
要求:
- 准备好两个目录
- 如若用 root 来实现登录的话,生成密钥对,以便于免密码验证
- 准备好 inotify 和 unison 的软件包
具体步骤:
#src和desc服务器都要安装好inotify
[root@Node1 desc]# tar -xf inotify-tools-3.13.tar.gz
[root@Node1 desc]# cd inotify-tools-3.13/
[root@Node1 inotify-tools-3.13]# yum -y install gcc*
[root@Node1 inotify-tools-3.13]# ./configure && make && make install
#然后两台服务器都要安装OCAML
[root@node0 ~]# tar -xf ocaml-3.10.1.tar.gz
[root@node0 ~]# cd ocaml-3.10.1/
#这里如果有报错就全部忽略
[root@node0 ocaml-3.10.1]# ./configure
[root@node0 ocaml-3.10.1]# make world opt
[root@Node1 ocaml-3.10.1]# make install
#两台服务器都要安装unison
[root@node0 ~]# tar -xf unison-2.48.4.tar.gz
[root@node0 src]# cd src/
#已经存在 Makefile 文件,不需要./configure
[root@node0 src]# make UISTYLE=text THREADS=true STATIC=true
配置监控脚本
注:双向自动同步,监控目录和数据同步时,源目录不能使用*通配符传输,否则会变成死循环。
#src端配置
#!/bin/bash
a="inotifywait -mrq -e create,delete /src"
#-batch:批处理
b="/usr/local/bin/unison -batch /src/ ssh://192.168.75.131//desc/"
$a | while read directory event file
do
$b
done
#desc端配置
#!/bin/bash
a="inotifywait -mrq -e create,delete /desc"
b="/usr/local/bin/unison -batch /desc/ ssh://192.168.75.130//src/" #-batch:批处理
$a | while read directory event file
do
$b
done
#两个脚本都放到后台执行
[root@node0 src]# bash src.sh &