欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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,否则同步会报错

相关标签: rsync