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 &