网络服务—RSYNC

网络服务—RSYNC

rsync简介

rsync概述

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

rsync特性

能更新整个目录树和文件系统
有选择性的保留符号链接、硬链接、文件属性、权限、设备以及时间等
对于安装来说,无任何特殊权限要求
对于多个文件来说,文件传输效率高
能用ssh或自定义端口作为传输入口端口

rsync工作原理

既然涉及到数据同步,必要的两个概念是:源地址(文件),目标地址(文件),以及以哪一方为基准,例如,想让目标主机上的文件和本地文件保持同步,则是以本地文件为同步基准,将本地文件作为源文件推送到目标主机上。
rsync在进行数据同步之前需要先进行用户身份验证,验证方式取决于使用的连接方式:
# ssh登录验证模式:
	使用ssh协议作为基础进行用户身份认证,然后进行数据同步。
# rsync登录验证模式:
	使用rsync协议进行用户身份认证(非系统用户),然后进行数据同步。

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

rsync实验演示

	我们一般使用rsync来进行单向数据同步,因此我们需要确定一个基准,比如:两台服务器,一台NFS作为网站数据服务器(基准服务器),另外一台专门做rsync数据备份服务器,我们以此为基础开始我们的实验。

ssh协议数据同步:

将NFS服务器数据同步备份到rsync服务器

实验环境:客户端手动上传或者下载

# 一台NFS服务器(110),一台rsync服务器(111)
# 在两台服务器上分别创建目录(/filesrc、/filedst)

备份110主机上的数据:

nfs服务器创建文件touch {0..9}.txt
# 下行同步(下载)
格式:rsync -avz 服务器地址:/服务器目录/*  /本地目录
示例:
$ rsync -avz root@192.168.190.110:/filesrc/* /filedst
	-a:归档模式,递归并保留对象属性
	-v:显示同步过程
	-z:在传输文件时进行压缩
`	C:恢复112的备份数据到110主机上:
# 上行同步(上传
格式:rsync -avz  /本地目录/*  服务器地址:/服务器目录
示例:
$ rsync -avz /filedst/*  root@192.168.88.10:/filesrc
注意:使用root用户进行实验可以,但生产环境中尽量使用单独创建的普通用户,减少权限溢出
# 创建用来做数据同步的用户,并给予用户对目录的相应权限,一般使用ACL设置权限
$ useradd zhangsan passwd zhangsan setfacl -m u:zhangsan:rwx /filesrc
# 拓展:若要实现免密码数据同步,只需要做好ssh密钥对登录即可
111上创建密钥公钥文件上传至110
$ ssh-keygen -t rsa -b 2048 
$ ssh-copy-id root@192.168.190.110

rsync协议数据同步:

将NFS服务器数据同步备份到rsync服务器

实验环境:一台服务器,一台客户端

在两台服务器上分别创建目录(/filesrc、/filedst)

搭建rsync服务(仅需要在NFS服务器上搭建即可)

# 创建主配置文件(/etc/rsyncd.conf)
$ vim /etc/rsyncd.conf
address = 192.168.190.110 #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 /filesrc 
注意:关闭服务可使用kill命令,但偶尔会造成服务被结束,但进程号配置文件不被删除的问题,若遇到此类问题可自己手动删除,再启动则正常(建议自己写一个rsync的服务管理脚本)
# 下行同步(下载)
格式:rsync -avz rsync://用户名@服务器地址/共享模块名 /本地目录
示例:
$ rsync -avz rsync://user1@192.168.190.110/web /filedst
# 拓展:--delete:删除本地比服务器多出来的文件(源地址没有,目标地址有的删掉)
$ rsync -avz --delete rsync://user1@192.168.88.10/web /filedst
# 上行同步(上传)
格式:rsync -avz  /本地目录/*  rsync://用户名@服务器地址/共享模块名
示例:
$ rsync -avz /filedst/* rsync://user1@192.168.190.110/web
拓展:rsync协议的免密码可以借助一个环境变量实现
$ vim /etc/profile 
	export RSYNC_PASSWORD=虚拟用户密码(user1)(客户端生成) 
	source /etc/profile 
	env | grep RSYNC_PASSWORD   查看环境变量是否生成

配置rsync+inotify实时同步

# 定期同步的缺点:
	执行备份的时间固定,延期明显,实时性差
	当同步源长期不变化时,密集的定期任务是不必要的(浪费资源)
# 实时同步的优点:
	一旦同步源出现变化,立即启动备份,实时性好
	只要同步源无变化,则不执行备份,节省资源

inotify简介

	inotify 是一个 Linux 内核特性,它监控文件系统,并且及时向专门的应用程序发出相关的事件警告,比如删除、读、写和卸载操作等。要使用 inotify,必须具备一台带有 2.6.13 版本的内核操作系统。
inotify两个监控命令:
	inotifywait:用于持续监控,实时输出结果(常用)
	inotifywatch:用于短期监控,任务完成后再出结果

inotify实现单项向同步

inotify部署

$ yum -y install gcc* lrzsz 
$ tar -xf inotify-tools-3.14.tar.gz 
$ cd inotify-tools-3.14 
$ ./configure && make && make install
# inotifywait命令格式
格式:inotifywait -mrq -e 监控动作1,监控动作2 /监控目录 &
示例:
$ inotifywait -mrq -e create,delete /filesrc &
	-m:始终保持事件监听状态
	-r:递归查询目录
	-q:只打印监控事件的信息
	-e 指定监控行为的
监控动作:modify(内容),create(文件创建),attrib(权限),move(改名),delete(删除)

利用rsync+inotifywait结合脚本实现单向实时同步

$ vim src.sh 
#!/bin/bash 
a="inotifywait -mrq -e create,delete /filesrc" 
b="rsync -avz /filesrc/* root@192.168.190.111:/filedst" 
$a | while read directory event file  
#while判断是否接收到监控记录 
do    
	$b 
done

# 注:用户登录时要求免密码验证(提前设置在服务器上生成)
$ ssh-keygen -t rsa -b 2048 
$ ssh-copy-id root@192.168.190.111
# 实验结果验证
在服务器端创建,删除文件,查看备份端是否正常
创建文件正常
删除文件不能进行。
拓展:--delete:删除本地比服务器多出来的文件(源地址没有,目标地址有的删掉)
$ rsync -avz --delete rsync://user1@192.168.88.10/web /filedst

拓展:调整inotify监控的文件数量

调整inotify内核参数(/etc/sysctl.conf)
mak_queue_events 监控队列大小
mak_user_instances 最多监控实例数
max_user_watches 每个实例最多监控文件数

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

rsync在单向同步上支持的非常好,且效率很高,但是在双向同步支持较差;unison则是双向同步的优秀工具,但其缺点是同步效率较低。
结束进程命令:
$ ps aux |grep bash kill -9 端口号

环境要求

准备好同步所需的两个目录

如若用root来实现登录的话,生成密钥对,以便于免密码验证
$ ssh-keygen -t rsa -b 2048 
$ ssh-copy-id root@192.168.190.111

安装步骤

# 在两台虚拟机上准备好inotify和unison的软件包
$ yum -y install gcc* lrzsz
# 先安装inotify
$ tar -xf inotify-tools-3.14.tar.gz 
$ cd inotify-tools-3.14 
$ ./configure && make && make install
# 再安装ocaml
$ tar -xf ocaml-3.10.1.tar.gz 
$ cd ocaml-3.10.1 
$ ./configure #忽略所有报错 
$ make world opt 
$ make install
# 安装unison
$ tar -xf unison-2.13.16.tar.gz 
$ cd unison-2.13.16 
$ make UISTYLE=text THREADS=true STATIC=true
# 已经存在Makefile文件,不需要./configure 
$ cp -a unison /usr/local/bin/ #把生成的脚本拷贝出来
# 注意:同样的操作在服务器端也做一遍 

配置脚本

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

filesrc端:

$ vim ~/src.sh

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

filedst端:

$ vim ~/dst.sh

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

测试

讲两个脚本放入后台执行:                                     
$ bash src.sh & 
$ bash dst.sh &
分别在两个主机上创建文件查看是否可以实现双向实时同步(可能会有延迟)
posted @ 2020-04-20 15:28  候你已久  阅读(132)  评论(0)    收藏  举报