rsync+inotify
程序员文章站
2024-03-14 09:08:10
...
rsync简介
Remote Sync,远程同步
rsync是linux系统下的数据镜像备份工具,支持本地复制,或者与其他SSH、rsync主机同步
- 可以镜像保存整个目录树和文件系统
- 可以很容易做到保持原来文件的权限、时间、软硬链接等等
- 无须特殊权限即可安装
- 第一次同步时rsync会复制全部内容,但在下一次只传输修改过的文件,在传输数据的过程中可以实行压缩及解压缩操作,可以使用更少的带宽且快速
- 可以使用scp、ssh等方式来传输文件,也可以通过直接的socket连接,安全
- 支持匿名传输,以方便进行网站镜象
rsync的ssh认证协议
- rsync命令来同步系统文件之前要先登录remote主机认证,认证过程中用到的协议有2种:ssh(不用启动服务)和rsync
- ssh认证协议跟scp的原理是一样的,如果在同步过程中不想输入密码就用ssh-****** -t rsa打通通道
rsync命令
//Rsync的命令格式常用的有以下三种:
rsync [OPTION]... src dest//用于本地同步,类似cp
rsync [OPTION]... src [[email protected]]host:dest//本地同步到远程
rsync [OPTION]... [[email protected]]host:src dest//远程同步到本地
-a, --archive //归档,文件宿主变化,时间戳不变
-v, --verbose //显示过程
-q, --quiet //静默模式
-r, --recursive //递归
-p, --perms //保持原有的权限属性
-z, --compress //在传输时压缩,节省带宽,加快传输速度
--delete //在源服务器上做的删除操作也会在目标服务器上同步
//这种方式默认是省略了 -e ssh 的,与下面等价:
rsync -avz /SRC -e ssh [email protected]:/DEST
//修改了ssh 协议的端口,默认是22
rsync -avz /SRC -e "ssh -p2222" [email protected]:/DEST
使用rsync的ssh同步数据
//服务端(源)和客户端(目的)都得装rsync
[[email protected] ~]# yum -y install rsync
...
[[email protected] ~]# yum -y install rsync
...
//将134中的/tmp同步到140的/root下
[[email protected] ~]# ls
anaconda-ks.cfg
// /tmp同步的是tmp目录本身,/tmp/同步是tmp目录里的内容
//同步时更衣更换同步资源的名称
[[email protected] ~]# rsync -avz /tmp -t ssh [email protected]:/root
[email protected]'s password:
...
sent 1,621 bytes received 124 bytes 498.57 bytes/sec
total size is 0 speedup is 0.00
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1178) [sender=3.1.2]
[[email protected] ~]# ls
anaconda-ks.cfg tmp
rsync+inotify
rsync优点
- 传统的cp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,可以解决对实时性要求不高的数据备份需求
rsync缺点
- 同步数据时,需要扫描所有文件后进行比对,进行差量传输,如果数据量特别大,非常耗时
- 不能实时的去监测、同步数据,通过linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差
- 主要备份大量的小文件;如果文件内容过大,建议使用scp或nfs备份
- 所以出现了rsync+inotify组合
Inotify
- Inotify是一种强大的、细粒度的、异步的文件系统事件监控机制(内核2.6.13开始支持)
- 可以监控文件系统中添加、删除,修改、移动等各种细微事件,当文件有任何变动时,就触发rsync同步,这样刚好解决了同步数据的实时性问题
- 需安装inotify-tools
案例
需求:将源服务器上/root/test目录实时同步到目标服务器的/root下
- 使用rsync(rsync认证协议)+inotify
- 源服务器上
- rsync+inotify-tools+脚本
- 目标服务器
- rsync,并启动rsync服务
//源服务器
[[email protected] ~]# ls test/
a b c
//目标服务器
[[email protected] ~]# ls
anaconda-ks.cfg
目标服务器
//关闭防火墙和selinux
[[email protected] ~]# systemctl stop firewalld.service
[[email protected] ~]# setenforce 0
[[email protected] ~]# getenforce
Permissive
//安装rsync
[[email protected] ~]# yum -y install rsync
...
//配置rsync的配置文件/etc/rsyncd.conf
[[email protected] ~]# vim /etc/rsyncd.conf
log file = /var/log/rsyncd.log //日志文件位置,启动rsync后自动创建
pidfile = /var/run/rsyncd.pid //pid文件的存放位置
lock file = /var/run/rsync.lock //支持max connections参数的锁文件
secrets file = /etc/rsync.pass //用户认证配置文件,里面保存用户名称和密码,必须手动创建这个文件
[test_from_134] //自定义同步名称
path = /root //rsync服务端(目标)数据存放路径
comment = sync test_from_134
uid = root //设置rsync运行权限为root
gid = root //设置rsync运行权限为root
port = 873 //默认端口
ignore errors //表示出现错误忽略错误
use chroot = no //默认为true,修改为no,增加对目录文件软连接的备份
read only = no //设置rsync服务端(目标)为读写权限
list = no //不显示rsync服务端资源列表
max connections = 200 //最大连接数
timeout = 600 //设置超时时间
auth users = admin //执行数据同步的用户名,可以设置多个,用英文状态下逗号隔开
#hosts allow = //允许进行数据同步的客户端IP地址,可以设置多个,逗号隔开
#hosts deny = //禁止数据同步的客户端IP地址,可以设置多个,逗号隔开
//创建用户认证文件,文件名和上面定义的一致
[[email protected] ~]#echo 'admin:666666' > /etc/rsync.pass
//设置文件权限,为了安全
[[email protected] ~]# chmod 600 /etc/rsync.pass
[[email protected] ~]# ll /etc/rsync.psaa
-rw-------. 1 root root 13 4月 25 16:44 /etc/rsync.pass
//启动rsync服务并设置开机自启动
[[email protected] ~]# systemctl start rsyncd
[[email protected] ~]# systemctl enable rsyncd
源服务器
//关闭防火墙和selinux
[[email protected] ~]# systemctl stop firewalld.service
[[email protected] ~]# setenforce 0
[[email protected] ~]# getenforce
Permissive
//安装rsync
[[email protected] ~]# yum -y install rsync
...
//由于inotify-tools工具只在epel源中有,所以配置网络源
[[email protected] ~]# cd /etc/yum.repos.d/
[[email protected] yum.repos.d]# wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
[[email protected] yum.repos.d]# sed -i 's/\$releasever/7/g' /etc/yum.repos.d/CentOS7-Base-163.repo
[[email protected] yum.repos.d]# sed -i 's/^enabled=.*/enabled=1/g' /etc/yum.repos.d/CentOS7-Base-163.repo
[[email protected] ~]# yum -y install epel-release
...
//创建认证密码文件,只需密码,和目标主机上密码对应
[[email protected] ~]# echo '666666' > /etc/rsync.pass
[[email protected] ~]# chmod 600 /etc/rsync.pass
//手动同步数据
[[email protected] ~]# rsync -avH --port 873 --progress --delete /root/test [email protected]::test_from_134 --password-file=/etc/rsync.pass
[[email protected] ~]# ls
test
//安装inotify-tools
[[email protected] ~]# yum -y install inotify-tools
...
//脚本
[[email protected] ~]# mkdir /scripts
[[email protected] ~]# touch /scripts/inotify.sh
[[email protected] ~]# chmod 755 /scripts/inotify.sh
[[email protected] ~]# vim /scripts/inotify.sh
#!/bin/bash
host=192.168.184.140
src=/root/test
des=test_from_134
password=/etc/rsync.pass
user=admin
inotifywait=/usr/bin/inotifywait
$inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \
| while read files ; do
rsync -avzP --delete --timeout=100 --password-file=${password} $src [email protected]$host::$des
echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done
//执行脚本,因为是循环,所以放入后台执行,nohup是关闭终端还会执行,如果需要重启运行,则加入/etc/rc.local文件
[[email protected] ~]# nohup bash /scripts/inotify.sh &
//此时就能时时同步134中/root/test中的内容了
注:两端/etc/rsync.pass文件权限必须改成600,否则同步会报错