暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

原创|NO.A.0021|网络服务|——|RSYNC|rsyny|rsync+inotify |unison+inotify|

Java BBS 2021-04-03
251

、rsync概述

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

  • 增量备份和差异备份:消耗的资源较少

  • 完全备份:消耗的资源最多,更安全。

二、rsync特性

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

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

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

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

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

三、rsync工作原理

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

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

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

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

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

四、rsync实验演示

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

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

// 1、实验环境:一台NFS服务器,一台rsync服务器
// centos6.x:20.20.20.21 SRC——数据服务器,推送:服务器端
// centos6.x:20.20.20.22 DST——备份服务器,下载:本地客户端
// 在两台服务器上分别创建目录(/filesrc、/filedst)
///2、下行同步(下载)
// 格式:rsync -avz 服务器地址:/服务器目录/* /本地目录
// 示例:rsync -avz root@20.20.20.21:/filesrc/* /filedst
// -a: 归档模式,递归保留对象属性
// -v:显示同步过程
// -z:在传输文件时进行压缩
[root@server21 ~]# yum install-y rsync
[root@server22 ~]# yum install -y rsync
[root@server21 ~]# mkdir /filesrc
[root@server21 ~]# touch /filesrc/{1..5}.txt
[root@server22 ~]# mkdir /filedst
#报错信息:
[root@server22 ~]# rsync -avz root@10.10.10.12:/filesrc/* /filedst/
rsync: Failed to exec ssh: No such file or directory (2)
rsync error: error in IPC code (code 14) at pipe.c(84) [receiver=3.0.6]
rsync: connection unexpectedly closed (0 bytes received so far) [receiver]
rsync error: error in IPC code (code 14) at io.c(600) [receiver=3.0.6]
#解决方案:检查原因是ssh客户端没有安装
[root@server22 ~]# yum install openssh-clients -y
#报错信息
[root@server22 ~]# rsync -avz root@20.20.20.21:/filesrc/* /filedst/
root@20.20.20.21's password:
bash: rsync: command not found
rsync: connection unexpectedly closed (0 bytes received so far) [receiver]
rsync error: remote command not found (code 127) at io.c(600) [receiver=3.0.6]
#解决方案: //目标服务器没有安装rsync服务
[root@server21 ~]# yum install-y rsync
[root@server22 ~]# rsync -avz root@20.20.20.21:/filesrc/* /filedst/
root@20.20.20.21's password: 空格
^[[Areceiving incremental file list
1.txt
2.txt
3.txt
4.txt
5.txt
[root@server22 ~]# ls /filedst/
1.txt 2.txt 3.txt 4.txt 5.txt


///3、上行同步(上传)
// 格式:rsync -avz /本地目录/* 服务器地址:/服务器目录
// 示例:rsync -ava /filedst/* root@192.168.88.10:/filesrc
[root@server21 ~]# rm -rf /filesrc/*
[root@server22 ~]# rsync -avz /filedst/* root@20.20.20.21:/filesrc/
root@20.20.20.21's password:
sending incremental file list
1.txt
2.txt
3.txt
4.txt
5.txt


sent 250 bytes received 107 bytes 238.00 bytes/sec
total size is 0 speedup is 0.00
[root@server21 ~]# ls /filesrc/
1.txt 2.txt 3.txt 4.txt 5.txt


// 注意:使用root用户进行实验可以,但生产环境中尽量使用创建的普通用户,减少权限溢出
//4、 创建用来做数据同步的用户,并给予用户对目录的相应权限,一般使用ACL设置权限
[root@server21 ~]# ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
f4:71:ca:0d:cb:b8:21:c3:6d:9e:a6:97:56:eb:0e:b1 root@server21
The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
| . o . |
| . o = B |
| + S * . |
| = *. |
| Eo . |
| o+.. |
| .o oo |
+-----------------+
#报错信息
[root@server21 ~]# ssh-copy-id root@20.20.20.22
-bash: ssh-copy-id: command not found
#问题分析
[root@server21 ~]# rpm -qa|grep openssh
openssh-5.3p1-117.el6.x86_64
openssh-server-5.3p1-117.el6.x86_64
#解决方案:发现没有安装客户端
[root@server21 ~]# yum install -y openssh-clients
[root@server21 ~]# ssh -copy-id root@20.20.20.22
Unknown cipher type 'opy-id'
[root@server21 ~]# ssh-copy-id root@20.20.20.22
to make sure we haven't added extra keys that you weren't expecting.


[root@server22 ~]# ssh-keygen -t rsa -b 2048
[root@server22 ~]# ssh-copy-id root@20.20.20.21
root@20.20.20.21's password:
to make sure we haven't added extra keys that you weren't expecting.
#验证不需要密码直接传输
[root@server22 ~]# rm -rf /filedst/*
[root@server21 ~]# rsync -avz /filesrc/* root@20.20.20.22:/filedst
1.txt
2.txt
3.txt
4.txt
5.txt
// 拓展:若要实现免密码数据同步,只需要做好ssh秘钥对登录即可

2、rsync协议数据同步,将NFS服务器数据同步备份到rsync服务器

// 实验环境:一台服务器,一台客户端
// 1、在两台服务器上分别创建目录(/filesrc、/filedst)
// 2、搭建rsync服务(仅需要在NFS服务器上搭建即可)
// 2.1、创建主配置文件
[root@server21 ~]# vim /etc/rsyncd.conf #这个文件默认没有,自己创建即可
address = 20.20.20.21 #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 #认证所需账号密码文件(需自行创建同上)// 2.2、创建认证所需账户密码文件
//2、创建认证所需账户密码文件
[root@server21 ~]# vim /etc/rsyncd_users.db
user1:123456
[root@server21 ~]# chmod 600 /etc/rsyncd_users.db          #必须修改权限,否则登录报错
// 2.3、启动服务
[root@server21 ~]# rsync --daemon
[root@server21 ~]# netstat -antp |grep :873
tcp 0 0 20.20.20.21:873 0.0.0.0:* LISTEN 1679/rsync
// 2.4、设置映射用户对共享目录有权限(r)
[root@server21 ~]# setfacl -m u:nobody:rwx /filesrc
#注意:关闭服务可使用kill命令,但偶尔会造成服务被结束,但进程号配置we年不被删除的问题,若遇到此类问题可自己手动删除,再启动则正常(建议自己写一个rsync的服务管理脚本)
// 3、下行同步(下载)
// 格式:rsync -avz rsync://用户名@服务器地址/共享模块名 /本地目录
// 示例:rsync -avz rsync://user1@20.20.20.21/web /filedst
// 拓展:--delete:删除本地比服务器多出来的文件(源地址没有,目标地址有的删掉)
[root@server22 ~]# rm -rf /filedst/*
[root@server21 ~]# touch /filesrc/6.txt
[root@server21 ~]# ls /filesrc/
1.txt 2.txt 3.txt 4.txt 5.txt 6.txt
#报错信息:出现以上情况说明,服务器已经连接上了,密码验证失败
[root@server22 ~]# rsync -avz rsync://user1@20.20.20.21/web /filedst/
Password:
@ERROR: auth failed on module web
rsync error: error starting client-server protocol (code 5) at main.c(1503) [receiver=3.0.6]
#解决方案:
[root@server22 ~]# rsync -avz --delete rsync://user1@20.20.20.21/web /filedst/ #客户端下载
Password: 123456
./
1.txt
2.txt
3.txt
4.txt
5.txt
6.txt
[root@server22 ~]# touch /filedst/7.txt #本地创建7.txt文件
[root@server22 ~]# rsync -avz rsync://user1@20.20.20.21/web /filedst/
Password:
receiving incremental file list #同步7.txt并没有同步过去
./
[root@server22 ~]# rsync -avz --delete rsync://user1@20.20.20.21/web /filedst/
Password:
receiving incremental file list
deleting 7.txt #同步删除差异文件:会拿着本地文件和本地对比,服务器端有,下载下来,服务器端没有,本地有,删除本地即可;保持本地文件和服务器端文件一致
[root@server22 ~]# ls /filedst/
1.txt 2.txt 3.txt 4.txt 5.txt 6.txt


//4、上行同步(上传)
// 格式:rsync -avz /本地目录/* rsync://用户名@服务器地址/共享模块名
// 示例:rsync -ava /filedst/* rsync://user1@20.20.20.21/web
[root@server21 ~]# rm -rf /filesrc/*
[root@server22 ~]# rsync -avz /filedst/ rsync://user1@20.20.20.21/web
Password:
sending incremental file list
./
rsync: failed to set times on "/." (in web): Operation not permitted (1)
1.txt
2.txt
3.txt
4.txt
5.txt
6.txt
//5、 拓展:rsync协议的免密码可以借助一个环境变量实现
// export RSYNC_PASSWORD=虚拟用户密码(客户端生成)
[root@server22 ~]# export RSYNC_PASSWORD=123456          #rsync协议的免密码可以借助一个环境变量实现
[root@server22 ~]# rm -rf /filedst/*
[root@server22 ~]# touch /filedst/{a..f}.txt
[root@server22 ~]# ls /filedst/
a.txt b.txt c.txt d.txt e.txt f.txt
[root@server22 ~]# rsync -avz --delete rsync://user1@20.20.20.21/web /filedst/
receiving incremental file list #没有用户名及密码
deleting f.txt #删除本地差异文件
deleting e.txt
deleting d.txt
deleting c.txt
deleting b.txt
deleting a.txt
./
1.txt #没有的文件同步过来
2.txt
3.txt
4.txt
5.txt
6.txt

五、配置rsync+inotify实时同步

  1. 定期同步的缺点:

  • 当执行备份的时间固定,延期明显,实时性差

  • 当同步源长期不变化时,密集的定期任务是不必要的(浪费资源)

  1. 实时同步的优点:

  • 一旦同步源出现变化,立即启动备份,实时性好

  • 只要同步源无变化,则不执行备份,节省资源

1、inotify简介

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

  • inotify两个监控命令:

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

  2. inotifywatch:用于短期监控,任务完成后再出结果

2、inotify部署

//1、安装编译工具
[root@server21 inotify-tools-3.14]# yum install -y gcc* #在不知道你需要的软件是gcc还是gcc-c++,直接gcc*即可全部安装
//2、部署在服务器端:
centos6.x:20.20.20.21                                     #服务器端
#将inotify-tools.zip上传到服务器
[root@server21 ~]# unzip inotify-tools.zip
[root@server21 ~]# cd inotify-tools
[root@server21 inotify-tools]# tar -zxvf inotify-tools-3.14.tar.gz
[root@server21 inotify-tools]# cd inotify-tools-3.14
[root@server21 inotify-tools-3.14]# ./configure && make && make install
// inotifywait命令格式
// 格式:inotifywait -mrq -e 监控动作2 /监控目录&
// 示例:inotifywait -mrq -e create,delete /filesrc &
// -m:始终保持事件监听状态
// -r:递归查询目录
// -q:只打印监控事件的信息
// 监控动作:modify(内容),create ,attrib(权限),move,delete
[root@server21 ~]# inotifywait -mrq -e create,delete,modify /filesrc/ #监控实时显示操作状态
/filesrc/ CREATE aaa
/filesrc/ DELETE 1.txt
/filesrc/ MODIFY aaa
[root@server21 ~]# touch /filesrc/aaa
[root@server21 ~]# rm -rf /filesrc/1.txt
[root@server21 ~]# echo "aaaaaaa">>/filesrc/aaa


//3、 利用rsync+inotifywait结合脚本实现单向实时同步
// 注:用户登录时要求面密码验证
[root@server21 ~]# vim src.sh
#!/bin/bash
a="inotifywait -mrq -e create,delete,modify /filesrc"     #变量a
b="rsync -avz /filesrc/* root@20.20.20.22:/filedst"       #变量b
$a | while read directory event file
#while判断是否接受到监控记录 $a:执行变量a;$a只要有变化就传输给$b
do
$b
done
[root@server21 ~]# rm -rf /filesrc/*
[root@server22 ~]# rm -rf /filedst/*
[root@server21 ~]# bash ~/src.sh & #执行脚本放在后台执行
// 4、实验结果验证
// 在服务器端创建,删除文件,查看备份端是否正常
#创建同步
[root@server21 ~]# touch /filesrc/a.txt
[root@server21 ~]# sending incremental file list
a.txt
[root@server22 ~]# ls /filedst/
a.txt
[root@server21 ~]# touch /filesrc/xxx.txt
[root@server21 ~]# sending incremental file list #服务端自动执行
xxx.txt


sent 82 bytes received 31 bytes 75.33 bytes/sec
total size is 0 speedup is 0.00
#更改文件内容
[root@server22 ~]# ls /filedst/
a.txt xxx.txt
[root@server21 ~]# echo "1111111111aaaaaaaa" >>/filesrc/a.txt
[root@server21 ~]# sending incremental file list #服务端自动执行
a.txt


sent 91 bytes received 31 bytes 81.33 bytes/sec
total size is 14 speedup is 0.11
echo "1111111111aaaaaaaa" >>/filesrc/a.txt
[root@server22 ~]# cat /filedst/a.txt
aaaaaaaaaaaaa
1111111111aaaaaaaa

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

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

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

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

  • rsync单向同步就可以满足我们的需求,

// 1、环境要求
// 1.1、准备好同步所需的两个目录
// 1.2、如若用root来实现登录的话,生成秘钥对,以便于免密码验证
// 1.3、准备好inotify和unison的软件包


// 2、安装步骤:
[root@server21 ~]# rm -rf /filesrc/*
[root@server22 ~]# rm -rf /filedst/*
[root@server21 ~]# ps aux |grep bash #停止脚本
root 4458 0.0 0.0 106072 1308 pts/2 S 11:37 0:00 bash /root/src.sh
root 4460 0.0 0.0 106072 816 pts/2 S 11:37 0:00 bash /root/src.sh
[root@server21 ~]# kill 4458
[root@server21 ~]# kill 4460
// 2.1、先安装inotify(客户端)
[root@server21 ~]# cp -a inotify-tools.zip /filesrc/       #将文件传输到20.20.20.22下,
[root@server22 ~]# ls /filedst/
inotify-tools.zip
[root@server22 ~]# mv /filedst/inotify-tools.zip .
[root@server22 ~]# unzip inotify-tools.zip
[root@server22 ~]# cd inotify-tools
[root@server22 inotify-tools]# ls
inotify-tools-3.14.tar.gz ocaml-3.10.1.tar.gz unison-2.13.16.tar.gz
[root@server22 inotify-tools]# tar -zxvf inotify-tools-3.14.tar.gz
[root@server22 inotify-tools]# cd inotify-tools-3.14
[root@server22 inotify-tools-3.14]# yum install -y gcc**
[root@server22 inotify-tools-3.14]# ./configure && make && make install
// 2.2、再安装ocaml
[root@server22 inotify-tools-3.14]# cd ..
[root@server21 ~]# cd inotify-tools
[root@server21 inotify-tools]# tar -zxvf ocaml-3.10.1.tar.gz
[root@server21 inotify-tools]# cd ocaml-3.10.1
[root@server21 ocaml-3.10.1]# ./configure                   #忽略所有报错
[root@server21 ocaml-3.10.1]# make world opt
[root@server21 ocaml-3.10.1]# make install
#同步流程部署客户端ocml:20.20.20.22
// 3、安装unison(服务端,客户端)
[root@server21 ocaml-3.10.1]# cd ..
[root@server21 inotify-tools]# tar -zxvf unison-2.13.16.tar.gz
[root@server21 inotify-tools]# cd unison-2.13.16
[root@server21 unison-2.13.16]# make UISTYLE=text THREADS=true STATIC=true #已经存在Makefile文件,不需要./configure
make[1]: [tags] Error 127 (ignored) #错误:忽略即可
[root@server21 unison-2.13.16]# cp unison /usr/local/bin/   #把生成的脚本拷贝出来
#同步流程部署客户端unison:20.20.20.22


// 4、配置脚本
#注:双向自动同步,监控目录和数据同步时,源目录不能使用*通配符传输,否则会变成死循环。
// filesrc端
[root@server21 ~]# vim filesrc.sh
#!/bin/bash
a="inotifywait -mrq -e create,delete,modify /filesrc"
b="/usr/local/bin/unison -batch /filesrc/ ssh://20.20.20.22//filedst/"
#-batch:批处理
$a | while read directory event file
do
$b
done
[root@server21 ~]# bash filesrc.sh &
[1] 10586
// filedst端
[root@server22 ~]# vim filedst.sh
#!/bin/bash
a="inotifywait -mrq -e create,delete,modify /filedst"
b="/usr/local/bin/unison -batch /filedst/ ssh://20.20.20.21//filesrc/"
#-batch:批处理
$a | while read directory event file
do
$b
done
[root@server22 ~]# bash filedst.sh &
[1] 10998
// 4、测试
// 将两个脚本放入后台执行:bash filesrc.sh &
// 分别在两个主机上创建主机查看是否可以实现双向实时同步(可能会有延迟)
#创建同步
[root@server21 ~]# touch /filesrc/a.txt
[root@server21 ~]# Contacting server... #自动执行命令
Looking for changes
[root@server22 ~]# Contacting server... #客户端自动执行命令
[root@server22 ~]# ls /filedst/
a.txt
[root@server22 ~]# touch /filedst/1.txt
#删除同步
[root@server22 ~]# rm -rf /filedst/1.txt
[root@server22 ~]# Contacting server... #自动执行,删除的时候可能会有延迟,生产环境多检查
[root@server21 ~]# Contacting server... #服务端自动执行
Looking for changes
[root@server21 ~]# ls /filesrc/
1.txt a.txt
#改变文件内容
[root@server21 ~]# echo "1111111111aaaaaaaa" >>/filesrc/a.txt
[root@server21 ~]# Contacting server... #自动执行
[root@server22 ~]# Contacting server... #客户端自动执行
Contacting server...
[root@server22 ~]# cat /filedst/a.txt
1111111111aaaaaaaa
[root@server22 ~]# echo "aaaaaaaa111111111" >>/filedst/a.txt
[root@server22 ~]# Contacting server... #自动执行
[root@server21 ~]# Contacting server... #服务端自动执行
[root@server21 ~]# cat /filesrc/a.txt
1111111111aaaaaaaa
aaaaaaaa111111111

=================================END==================================

辅助文本

四、rsync实验演示

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

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

// 实验环境:一台NFS服务器,一台rsync服务器
// 在两台服务器上分别创建目录(/filesrc、/filedst)
// 下行同步(下载)
// 格式:rsync -avz 服务器地址:/服务器目录/* /本地目录
// 示例:rsync -avz root@192.168.88.10:/filesrc/* /filedst
// -a: 归档模式,递归保留对象属性
// -v:显示同步过程
// -z:在传输文件时进行压缩


// 上行同步(上传)
// 格式:rsync -avz /本地目录/* 服务器地址:/服务器目录
// 示例:rsync -ava /filedst/* root@192.168.88.10:/filesrc
// 注意:使用root用户进行实验可以,但生产环境中尽量使用创建的普通用户,减少权限溢出
// 创建用来做数据同步的用户,并给予用户对目录的相应权限,一般使用ACL设置权限
useradd zhangsan
passwd zhangsan
setfacl -m u:zhangsan:rwx /filesrc
// 拓展:若要实现免密码数据同步,只需要做好ssh秘钥对登录即可

2、rsync协议数据同步,将NFS服务器数据同步备份到rsync服务器

// 实验环境:一台服务器,一台客户端
// 1、在两台服务器上分别创建目录(/filesrc、/filedst)
// 2、搭建rsync服务(仅需要在NFS服务器上搭建即可)
// 2.1、创建主配置文件
address = 192.168.88.10 #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 = on #是否仅允许读取
dont compress = *.gz *.bz2 #那些文件类型不进行压缩
auth users = user1 #登录用户名(非系统用户,需要自行创建)
        secrets file = /etc/rsyncd_users.db             #认证所需账号密码文件(需自行创建同上)
// 2.2、创建认证所需账户密码文件
vim /etc/rsyncd_users.db
user1:123456
chmod 600 /etc/rsyncd_users.db #必须修改权限,否则登录报错
// 2.3、启动服务
rsync --daemon
netstat -antp |grep :873
// 2.4、设置映射用户对共享目录有权限(r)
setfacl -m u:nobody:rwx /filesrc
#注意:关闭服务可使用kill命令,但偶尔会造成服务被结束,但进程号配置we年不被删除的问题,若遇到此类问题可自己手动删除,再启动则正常(建议自己写一个rsync的服务管理脚本)
// 下行同步(下载)
// 格式:rsync -avz rsync://用户名@服务器地址/共享模块名 /本地目录
// 示例:rsync -avz rsync://user1@192.168.88.10/web /filedst
// 拓展:--delete:删除本地比服务器多出来的文件(源地址没有,目标地址有的删掉)
rsync -avz --delete rsync://user1@192.168.88.10/web /filedst


//上行同步(上传)
//格式:rsync -avz /本地目录/* rsync://用户名@服务器地址/共享模块名
// 示例:rsync -ava /filedst/* rsync://user1@192.168.88.10/web
// 拓展:rsync协议的免密码可以借助一个环境变量实现
// export RSYNC_PASSWORD=虚拟用户密码(客户端生成)

五、配置rsync+inotify实时同步

  1. 定期同步的缺点:

  • 当执行备份的时间固定,延期明显,实时性差

  • 当同步源长期不变化时,秘籍的定期任务是不必要的(浪费资源)

  1. 实时同步的优点:

  • 一旦同步源出现变化,立即启动备份,实时性好

  • 只要同步源无变化,则不执行备份,节省资源

1、inotify简介

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

  • inotify两个监控命令:

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

  2. inotifywatch:用于短期监控,任务完成后再出结果

2、inotify部署

yum install -y gcc*
tar -xf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
./configure && make && make install


// inotifywait命令格式
// 格式:inotifywait -mrq -e 监控动作2 /监控目录&
// 示例:inotifywait -mrq -e create,delete /filesrc &
// -m:始终保持事件监听状态
// -r:递归查询目录
// -q:只打印监控事件的信息
// 监控动作: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.88.20:/filedst"
$a | while read directory event file #while判断是否接受到监控记录
do
$b
done
// 注:用户登录时要求面密码验证


// 实验结果验证
// 在服务器端创建,删除文件,查看备份端是否正常

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

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

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

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

// 1、环境要求
// 1.1、准备好同步所需的两个目录
// 1.2、如若用root来实现登录的话,生成秘钥对,以便于免密码验证
// 1.3、准备好inotify和unison的软件包


// 2、安装步骤:
// 2.1、先安装inotify
tar -xf inotify-tools-3.14.tar.gz
cd inotigy-tools-3.14
./configure && make && make install
// 2.2、再安装ocaml
tar -xf ocaml-3.10.1.tar.gz
cd ocaml-3.10.1
./configure #忽略所有报错
make world opt
make install


// 3、安装unison
tar -xf unison-2.13.16.tar.gz
cd unison-2.13.16
make UISTYLE=text THREADS=true STATIC=true             #已经存在Makefilewe年,不需要./configure
cp unison /usr/local/bin #把生成的脚本拷贝出来
#注意:同样的操作在服务器端也做一遍


// 4、配置脚本
#注:双向自动同步,监控目录和数据同步时,源目录不能使用*通配符传输,否则会变成死循环。
// filesrc端
#!/bin/bash
a="inotifywait -mrq -e create,delete /filesrc"
b="/usr/local/bin/unison -batch /filesrc/ ssh://192.168.88.20//filedst/" #-batch:批处理
$a | while read directory event file
do
$b
done


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


// 4、测试
// 将两个脚本放入后台执行:bash src.sh &
// 分别在两个主机上创建主机查看是否可以实现双向实时同步(可能会有延迟)

END





声明:JavaBBS论坛主要用于IT技术专题的交流学习,为开源技术爱好者提供广泛、权威的技术资料。若您在技术专题有更好的想法或者建议,欢迎交流!!!



推荐阅读

Recommended reading

 







JavaBBS



Git











  






https://www.javabbs.cn/git






  JavaBBS大数据






→ 






https://www.javabbs.cn





/dsj





  JavaBBS云存储






→  https://www.javabbs.cn






/ycc







  JavaBBS数据库













  https://www.javabbs.cn






/sjk







  JavaBBS云计算













  https://www.javabbs.cn






/yjs







  JavaBBSIT.Log













https://www.javabbs.cn






/itl






  JavaBBSNginx













  https://www.javabbs.cn






/ngx






  JavaBBSzabbix













https://www.javabbs.cn






/zbx






  JavaBBSJavaSE













https://www.javabbs.cn






/jse







  JavaBBS社区文章













https://www.javabbs.cn






/bwz






  JavaBBS社区资料













https://www.javabbs.cn






/bzl







文章转载自Java BBS,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论