rsync+inotify远程同步

目录

前言

一、Rsync 远程同步

1.1  rsync 介绍

1.2  rsync 同步方式

1.3  rsync特性

1.4  rsync与cp、scp对比

1.5  rsync实时同步

二、rsync 命令

2.1  命令格式

2.2   常用的参数

2.3  rsync本地复制实例

2.4  配置源的两种表示方法

三、配置 Rsync 源服务器

3.1  rsync  同步源

3.2  配置 Rsync 下行同步

3.2.1  配置环境

3.2.2  将 server 服务器数据备份到 client  服务器 

3.2.3  客户端配置client :(192.168.10.14) 

3.2.4  关闭rsync 服务

3.3  --delect 用法

扩展:设置周期性计划任务

四、 inotify简介

4.1   inotifywait 命令

4.2  配置Rsync+inotify 实时同步

4.3   配置步骤

4.3.1  server 服务端关闭只读模式并为共享目录赋权 

4.3.2  优化 client 客户端 内核参数 

4.3.3  客户端(192.168.10.14):编译安装 inotify-tools 

4.3.4  客户端启动监听 

4.3.5  编写触发同步脚本

扩展:

五、rsync的应用场景

六、总结


前言

在系统管理员的工作中备份无疑是一个重要的部分。当没有完整备份或者良好规划的备份和实施时,就可能或早或晚不可挽回地丢失重要的数据。rsync 无疑是一个很好的选择,下面将介绍rsync的工作过程。

一、Rsync 远程同步

1.1  rsync 介绍

rsync(Remote Sync,远程同步)是一款开源的快速增量备份工具,可以在不同主机之间镜像同步整个目录树,支持增量备份,并保持链接和权限,且采用优化的同步算法,传输前执行压缩,因此非常适用于异地备份、镜像服务器等应用。

rsync软件支持跨平台,适用于unix/ linux/windows等多种操作系统平台

rsync是一个快速和非常方便的文件复制工具。它能本地复制,远程复制,或者远程守护进程方式复制,它提供了大量的参数来控制其行为的各个方面,并且允许非常灵活的方式来实现文件的传输复制

以其delta-transfer算法闻名。

rsync监听端口:873

rsync运行模式:C/S

官方网址:https://rsync.samba.org/

1.2  rsync 同步方式

1. 完整备份:每次备份都是从备份源将所有的文件或目录备份到目的地

2. 差量备份:备份上次完全备份以后有变化的数据(它针对的上次的完全备份,备份过程中不清除存档属性)。

3. 增量备份:备份上次备份以后所有变化的数据(它不管是哪种类型的备份,有变化的数据就备份,会清除存档属性)。

1.3  rsync特性

  • 可以镜像保存整个目录和文件系统
  • 可以很容易做到保持原文件的权限、时间、软硬连接等
  • 无须特殊权限即可安装

快速

第一次同步时rsync会复制全部内容,但在下一次只传输修改过的文件
rsync在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的宽带

安全

可以使用scp、ssh等方式来传输文件
也可通过直接socket连接
支持匿名传输,以方便进行网站镜像

1.4  rsync与cp、scp对比

  • cp命令是一种典型的将文件完整的拷贝到一个位置。而rsync是,第一次拷贝,在目标位置没有的时候,rsync是全量拷贝过去,但是第二次拷贝的时候,只会对差异项进行同步拷贝。所有如果对同一个文件进行二次备份的话,rsync速度会相较于cp而言更快。
  • cp只支持本地,而rsync支持远程
  • scp是基于cp原理,也是属于完整性拷贝文件。假设rsync和scp拷贝的文件都是第一,目标地址都没有要同步的文件,此时,这两者的差异在于,第一个,这个要传输的文件大不大,第二个要看在传输的过程中,用的带宽大不大。如果文件不大的情况下,scp是把数据从磁盘中的块存储提取出来,封装一下,网络传过去,此时scp更快,如果是更大的文件,比如说40G,带宽只支持100M的带宽,scp想要传输,需要拆分数据,一段一段传输。而rsync会根据一个逻辑意义上的空间,把数据划分出来,把数据先压缩再传输,所以这种方式而言,带宽校,文件大,这个时候先压缩再传输会比较快。此时适合用rsync远程同步。

1.5  rsync实时同步

定期同步的不足:

  • 执行备份的时间固定,延迟明显、实时性差
  • 当同步源长期不变化时,密集的定期任务是不必要的

实时同步的优点:

  • 一旦同步源出现变化,立即启动备份
  • 只要同步源无变化,则不执行备份

二、rsync 命令

2.1  命令格式

rsync  [选项]    原始位置    目标位置 

2.2   常用的参数

常用选项

解释

-v,–verbose

详细模式输出

-q,–quiet

精简输出模式

-c,–checksum

打开校验开关,强制对文件传输进行校验

-a,–archive

归档模式,表示以递归方式传输文件,并保持所有文件树形等同于-rlpt

-z

在传输文件时进行压缩

-r,–recursive

对子目录以递归模式处理,包含目录及子目录中的所有文件

-H,–hard-links

保留硬链接

-l, --links

保留软链接

–delete

删除目标位置有而原始位置没有的文件(一致性)

–delete-after

传输结束以后再删除

             -A

保留ACL属性信息

-D

保留设备文件及其他特殊文件

-checksum

根据对象的校验和来决定是否跳过文件

-o

保留文件的属主标记(仅超级用户使用)

-g

保留文件的属组标记(仅超级用户使用)

-t

保留文件的时间标记

注:常用的是-avz

2.3  rsync本地复制实例

以下两者区别是什么?

  • rsync -avz abc/ /opt/ :只会拷贝abc目录下面的文件,而不会拷贝abc这个目录

  • rsync -avz /abc /opt/:会连着目录一起拷贝到/opt下

#如果是rsync -avz  abc/ /opt/会是什么情况
cd /opt
mkdir /abc
cd /abc/
touch 1.txt 2.txt
cd /
rsync -avz abc/ /opt/
cd /opt/
ls
 
#如果是rsync -avz /abc /opt/会是什么情况
cd /opt/
rm -rf *
rsync -avz /abc /opt/
ls

#如果是rsync -avz abc/ /opt/会是什么情况

rsync+inotify远程同步_第1张图片

#如果是rsync -avz /abc /opt/会是什么情况

rsync+inotify远程同步_第2张图片

2.4  配置源的两种表示方法

方法一:

#用户名@主机地址: :共享模块名
rsync -avz [email protected]::wwwroot /root
 
#backuper指的是我在同步的时候用的哪个用户身份
#wwwroot代表的是模块,模块下面会写同步的默认路径和一些特性,所以我们只需要写模块就好了
#/root指的是本地节点

方法二:

#rsync:/用户名@主机地址/共享模块名
rsync -avz rsync: //[email protected]/wwwroot /root
 
URL:具体的位置点,例如:http://www.baidu.com./class1/men/id01.html
URI:标识的是拥有同一类特性或类型的一个集合 ,例如http://www.baidu.com./class1/men

三、配置 Rsync 源服务器

3.1  rsync  同步源

在远程同步任务中,负责发起 rsync 同步操作的客户机称为客户端,而负责响应来自客户端的 rsync 同步操作的服务器称为备份源**,也称之为同步源

  • 在下行同步(下载)中,同步源负责提供文档的原始位置,发起端应对该位置有读取权限
  • 在上行同步(上传)中,同步源负责提供文档的目标位置,发起端应对该位置具有写入权限

rsync+inotify远程同步_第3张图片

 

3.2  配置 Rsync 下行同步

3.2.1  配置环境

主机 操作系统 IP 地址 主要软件
server CentOS7 192.168.10.13 rsync
client CentOS7 192.168.10.14 rsync / inotify-tools-3.14.tar.gz

3.2.2  将 server 服务器数据备份到 client  服务器 

systemctl stop firewalld
systemctl disable firewalld
setenforce 0
#关闭防火墙及安装机制
 
yum install -y httpd rsync
#rsync系统一般已默认安装,安装httpd是为了生成/var/www/html目录(后续会用到作为共享目录)
 
vim /etc/rsyncd.conf
#编辑rsync配置文件
uid = root
gid = root
use chroot = yes
address = 192.168.10.13
port 873
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
hosts allow = 192.168.10.0/24
[wwwroot]        
path = /var/www/html
comment = Document Root of www.yxp.com
read only = yes
dont comperss = *.gz *.bz2 *.tgz *.zip *.rar *.z
auth users = backuper    
secrets file = /etc/rsyncd_users.db
----详解----
uid = root                                            #用户id,表示共享权限能执行的身份
gid = root                                            #组id
use chroot = yes                                    #开启,禁锢在源目录,表示允许在访问我备份的目录或文件的时候,使用的角色是root,同时你访问本地目录时拥有的也是root权限
address = 192.168.10.13                            #监听地址
port 873                                            #默认端口号为873
log file = /var/log/rsyncd.log                        #日志文件存放位置
pid file = /var/run/rsyncd.pid                        #存放进程id的文件位置
hosts allow = 192.168.10.0/24                        #允许访问的主机网段,有点类似于黑白名单
#####################以上是全局配置,以下是模块配#####################
[wwwroot]                                            #共享模块的名称,rsync默认调用该模块,默认我调用的路径是该模块指定的路径
path = /var/www/html                                #源目录路径
comment = Document Root of www.yxp.com                #
read only = yes                                        #是否为只读
dont comperss = *.gz *.bz2 *.tgz *.zip *.rar *.z    #同步时不再压缩的文件类型,因为同步时,-avz已经进行压缩
auth users = backuper                                    #授权用户,使用wwwroot模块的用户是哪个用户,多个账户以空格隔开
secrets file = /etc/rsyncd_users.db                    #存放账号信息的数据文件,一行一个
#小结
第一部分定义共享模块全局模块配置
第二部分:共享模块(可以为多个)  可以对应不同的“源目录” 和授权账号信息
第三部分,此配置文件是为rsync --daemon模式设置的
#如采用匿名的方式,只要将其中的 “auth users” 和 “secrets file”配置项去掉即可
————————————————
 
vim /etc/rsyncd_users.db
backuper:123123
#编辑用户账号文件,固定格式为[名称:密码],一行一个
 
chmod 600 /etc/rsyncd_users.db
#官方要求,最好只是赋权600!
 
rsync --daemon
#开启服务
netstat -natp | grep rsync
#检测端口号,确认服务是否成功开启
 
cd /var/www/html
#切换至共享目录下
touch 1.txt 2.txt

echo "this is 1.txt" > 1.txt

echo "this is 2.txt" > 2.txt
ls

#关闭防火墙及安装机制

#rsync系统一般已默认安装,安装httpd是为了生成/var/www/html目录(后续会用到作为共享目录)

rsync+inotify远程同步_第4张图片

#编辑rsync配置文件 

rsync+inotify远程同步_第5张图片

#编辑用户账号文件,固定格式为[名称:密码],一行一个

rsync+inotify远程同步_第6张图片

#官方要求,最好只是赋权600!

#开启服务、检测端口号,确认服务是否成功开启

rsync+inotify远程同步_第7张图片

#切换至共享目录下,创建文件

rsync+inotify远程同步_第8张图片

3.2.3  客户端配置client :(192.168.10.14) 

systemctl stop firewalld
systemctl disable firewalld
setenforce 0
#关闭防火墙及安装机制
yum install -y rsync
#安装rsync
mkdir /abc
cd /abc/
#创建一个目录/abc,用来同步
rsync -avz [email protected]::wwwroot /abc
#使用rsync同步备份源的同步文件
ls
#查看同步是否成功
vim /etc/server.pass
123456
#编辑免交互密钥文件,第一行为密码
chmod 600 /etc/server.pass
#给密钥文件赋权600
rsync -az --delete --password-file=/etc/server.pass [email protected]::wwwroot /abc
#rsync,使用密钥文件/etc/server/pass对应backuper用户,IP地址为192.168.10.13的共享模块文件进行压缩,并归档同步至当前服务器的/abc目录下,同时删除差异内容,如果原目标有的,会增加,原目标没有的,会删除。保持一致性。
 
ls /abc
#查看下行同步是否成功

#关闭防火墙及安装机制

#安装rsync

rsync+inotify远程同步_第9张图片

#创建一个目录/abc,用来同步

 

#使用rsync同步备份源的同步文件,并查看是否完成 

rsync+inotify远程同步_第10张图片

#编辑免交互密钥文件,第一行为密码

rsync+inotify远程同步_第11张图片

#给密钥文件赋权600 

#再次同步验证是否需要密码

rsync+inotify远程同步_第12张图片

3.2.4  关闭rsync 服务

kill  $(cat /var/run/rsyncd.pid)
或 rm -rf /var/run/rsyncd.pid

rsync+inotify远程同步_第13张图片

3.3  --delect 用法

--delect 用法   #删除目标位置有而原始位置没有的文件

将源rsync服务器的/var/www/html/ 目录下的文件删除,此时加上–delect,客户端的/abc/目录下的文件被删除,可以看出客户端是目标

rsync+inotify远程同步_第14张图片

应用场景:批量删除

rsync+inotify远程同步_第15张图片

扩展:设置周期性计划任务

crontab -e
30 22 * * * /usr/bin/rsync -az --delete --password-file=/etc/server.pass [email protected]::wwwroot /opt/
#为了在同步过程中不用输入密码,需要创建一个密码文件,保存 backuper 用户的密码,如 /etc/server.pass。在执行 rsync 同步时使用选项 “--password-file=/etc/server.pass” 指定即可。

systemctl restart crond
systemctl enable crond

四、 inotify简介

可以监控文件系统的变动情况,并做出通知响应

#调整inotify内核参数(优化)
letc/ sysctl.conf(内核参数配置文件)
inotifywait:    #用于持续监控,实时输出结果
inotifywatch:   #用于短期监控,任务完成后再输出结果
max_queue_events   #监控事件队列大小
max_user instances      #最多监控实例数,可以看成最多可以监控多少个实例
max_user_watches        #每个实例最多监控文件数 

4.1   inotifywait 命令

持续监控并实时输出监控结果的命令

格式:inotifywait  [参数]

参数: 

-m            持续进行监控
-r            递归监控所有子对象
-q            简化输出信息
-e            指定要监控哪些事件类型

4.2  配置Rsync+inotify 实时同步

  1. 使用inotify通知接口,可以用来监控文件系统的各种变化情况,如文件存取、删除、移动、修改等。利用这一机制,可以非常方便地实现文件异动告警、增量备份,并针对目录或文件的变化及时作出响应。
  2. 将inotify机制与rsync工具相结合,可以实现触发式备份(实时同步),即只要原始位置的文档发生变化,则立即启动增量备份操作;否则处于静默等待状态。
  3. 因为 inotify 通知机制由 Linux 内核提供,因此主要做本机监控,在触发式备份中应用时更适合上行同步

inotify-rsync实际应用原理图:

rsync+inotify远程同步_第16张图片

4.3   配置步骤

4.3.1  server 服务端关闭只读模式并为共享目录赋权 

server   (192.168.10.13)

vim /etc/rsyncd.conf
read only = no
#关闭只读模式,否则将不可写入
kill `cat /var/run/rsyncd.pid`
#修改完配置文件需要重启服务,这里采用直接杀掉进程号的方式
netstat -natp | grep rsync
#检查一下服务是否已被终止
rsync --daemon
netstat -natp | grep rsync
#再次开启服务并检查端口号确认

#关闭只读模式,否则将不可写入

rsync+inotify远程同步_第17张图片

#修改完配置文件需要重启服务,这里采用直接杀掉进程号的方式

再次开启服务并检查端口号确认

4.3.2  优化 client 客户端 内核参数 

client 客户端   :192.168.10.14

cat /proc/sys/fs/inotify/max_queued_events      #监控事件队列
cat /proc/sys/fs/inotify/max_user_instances     #最多监控实例数
cat /proc/sys/fs/inotify/max_user_watches       #每个实例最多监控文件数
 
vim /etc/sysctl.conf         #加大每个参数
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
#当要监控的目录、文件数据量较多或者变化频繁时,建议加大参数值
 
sysctl -p
#刷新

#查看参数

rsync+inotify远程同步_第18张图片

#加大每个参数

rsync+inotify远程同步_第19张图片

#刷新

rsync+inotify远程同步_第20张图片

4.3.3  客户端(192.168.10.14):编译安装 inotify-tools 

yum install -y gcc gcc-c++
#安装gcc gcc-c++
 
cd /opt
#切换至/opt上传inotify-tools安装包
 
tar zxf inotify-tools-3.14.tar.gz
#解压
 
cd /opt/inotify-tools-3.14/
./configure
make -j 4 && make install
#编译安装

#安装gcc gcc-c++

rsync+inotify远程同步_第21张图片

#切换至/opt上传inotify-tools安装包

rsync+inotify远程同步_第22张图片

进行解压,编译安装

rsync+inotify远程同步_第23张图片rsync+inotify远程同步_第24张图片

4.3.4  客户端启动监听 

#持续监听对/abc的modify,create,move,delete操作
inotifywait -mrq -e modify,create,delete /abc

rsync+inotify远程同步_第25张图片rsync+inotify远程同步_第26张图片它首先经历的2.txt还没被更改,所以现在交换分区中先复制一份到内存中,等修改后,落地到磁盘,删除虚拟内存、交换分区 

4.3.5  编写触发同步脚本

vim /opt/inotify.sh
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e create,delete,move,modify,attrib /abc/"
RSYNC_CMD="rsync -azH --delete --password-file=/etc/server.pass /abc/ [email protected]::wwwroot/"
 
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
    if [ $(pgrep rsync | wc -l) -le 0 ] ; then
        $RSYNC_CMD
    fi
done
----详解----
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e create,delete,move,modify,attrib /abc/"
#INOTIFY_CMD变量:持续监控 /opt/abc目录中的创建,删除,移动,修改,改变时间的操作
RSYNC_CMD="rsync -azH --delete --password-file=/etc/server.pass /abc/ [email protected]::wwwroot"
#RSYNC_CMD变量:使 xixi 用户,/etc/server.pass 密钥文件,将 /xcf1 目录下的文件进行压缩,归档,保留硬链接文件同步至 192.168.10.13 的共享模块定义的目录 /var/www/html 下,并删除差异性内容,保持一致性
 
$INOTIFY_CMD | while read DIRECTORY EVENT FILE        #持续监控...
do
    if [ $(pgrep rsync | wc -l) -le 0 ] ; then        #如果服务并未启动,则执行同步
        $RSYNC_CMD
    fi
done
----
 
cd /opt/
chmod +x inotify.sh
#给脚本赋权
 
chmod +x /etc/rc.d/rc.local
echo "/opt/inotify.sh" >> /etc/rc.d/rc.local
#设置开机自启动
 
sh -x ./inotify.sh
#执行脚本
 
cd /abc
touch jingjing.html
rm -rf jiang.html
#创建一个新的html文件并删除之前的qwe
ls
#再次确认一下

#编写脚本

rsync+inotify远程同步_第27张图片

#给脚本赋权

rsync+inotify远程同步_第28张图片 

#设置开机自启动

#测试

rsync+inotify远程同步_第29张图片rsync+inotify远程同步_第30张图片

#执行脚本

rsync+inotify远程同步_第31张图片

进行验证服务端查看文件

扩展:

//使用rsync来实现快速删除大量文件。
假如要在linux下删除大量文件,比如100万、1000万,像/usr/local/nginx/proxy_temp的nginx缓存等,那么rm -rf * 可能就不好使了,因为要等待很长一段时间。在这种情况下我们可以使用rsync来巧妙处理。rsync实际用的是替换原理。

先建立一个空的文件夹:
mkdir /home/blank

用rsync删除目标目录:
rsync --delete-before -a -H -v --progress --stats /home/blank /usr/local/nginx/proxy_temp
这样目标目录很快就被清空了
选项说明:
--delete-before 接收者在传输进行删除操作
-a 归档模式,表示以递归方式传输文件,并保持所有文件属性
-H 保持硬连接的文件
-v 详细输出模式
--progress 在传输时显示传输过程
--stats 给出某些文件的传输状态

五、rsync的应用场景

1、增量同步

2、备份/迁移:可以作为辅助工具(mysql 主从复制 rsync +inotify ——》趋于一致 双向同步——MM,但是只能在并发量不大的时候可以用)

3、假设mysql 从主机A迁移到主机B(一主两从模式)

一主两从模式迁移方案

①确定迁移的时间、业务线停止的时间、要写文档描述具体操作,要发邮件审批

②确认迁移后的节点的环境问题(资源环境 + 系统依赖环境 + mysql内部的格式环境 ------1)例如自增长,自增长可能会导致主从复制不一致的情况 2)版本迁移问题,比如说低版本向高版本迁移。两个版本中的差异比较大,数据迁移比较重要,需要和研发沟通,让研发开发一个工具,让低版本可以转成高版本工具格式,使用工具迁移)

③ 如果数据库是相同版本,可以用rsync + inotify持续同步

④ 测试、之前还要编写回滚方案

⑤ 提交检修申请 22:00 - 00:00

六、总结

rsync 是一个开源的快速备份工具,可以在不同主机之间镜像同步整个目录树,支持增量备份,并保持链接和权限,且采用优化的同步算法,传输前执行压缩,因此非常适用于异地备份、镜像服务器等应用。

你可能感兴趣的:(rsync)