rsync+inotify

一、rsync简介

rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步。它使用一种称为"Rsync演算法"的技术,只传输文件的不同部分,而不是每次都整份传送,这使得它在备份和同步大量数据时非常高效。rsync可以镜像保存整个目录树和文件系统,保持原来文件的权限、时间、软硬链接等属性,并且可以通过SSH等方式安全传输文件。

rsync特性:

rsync支持很多特性:

1、可以镜像保存整个目录树和文件系统;

2、可以很容易做到保持原来文件的权限、时间、软硬链接等等;

3、无须特殊权限即可安装;

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

5、安全:可以使用scp、ssh等方式来传输文件,当然也可以通过直接的socket连接;

6、支持匿名传输,以方便进行网站镜像。

rsync的ssh认证协议:

rsync命令来同步系统文件之前要先登录remote主机认证,认证过程中用到的协议有2种:

1、ssh协议

2、rsync协议

  • rsync server端不用启动rsync的daemon进程,只要获取remote host的用户名和密码就可以直接rsync同步文件
  • rsync server端因为不用启动daemon进程,所以也不用配置文件/etc/rsyncd.conf
  • ssh认证协议跟scp的原理是一样的,如果在同步过程中不想输入密码就用ssh-keygen -t rsa打通通道

这种方式默认是省略了 -e ssh 的,与下面等价:

rsync -avz /SRC -e ssh root@192.168.100.20:/DEST

当遇到要修改端口的时候,我们可以:

rsync -avz /SRC -e "ssh -p2222" root@192.168.100.20:/DEST

修改了ssh 协议的端口,默认是22

rsync常用选项:
  • -a, --archive //归档,表示以递归方式传输文件,并保持所有属性
  • -v, --verbose //显示打印的信息,比如文件列表、文件数量等
  • -q, --quiet //不显示打印信息
  • -r, --recursive //递归,传输目录时必须加
  • -p, --perms //保持原有的权限属性
  • -z, --compress //在传输时压缩,节省带宽,加快传输速度
  • --delete //表示删除目标服务中源服务器没有的文件,在源服务器上做的删除操作也会在目标服务器上同步
rsync命令:

Rsync的命令格式常用的有以下三种:

rsync OPTION... SRC DEST

rsync OPTION... SRC USER@HOST:DEST

rsync OPTION... USER@HOST:SRC DEST

rsync工作模式

对应于以上三种命令格式,rsync有三种不同的工作模式:

1、拷贝本地文件

当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。如:

Matlab 复制代码
[root@server tmp]# touch a
[root@server tmp]# ls
a
[root@server tmp]# rsync -a a afile
[root@server tmp]# ll
total 0
-rw-r--r--. 1 root root 0 Sep 20 23:53 a
-rw-r--r--. 1 root root 0 Sep 20 23:53 afile
2、使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器

当DST路径地址包 \ 含单个冒号":"分隔符时启动该模式。如:

Matlab 复制代码
[root@server tmp]# rsync -avz a root@192.168.100.20:/tmp/b
sending incremental file list
a
sent 80 bytes  received 35 bytes  25.56 bytes/sec
total size is 0  speedup is 0.00
# 登录192.168.100.20主机
[root@cy tmp]# ll
total 0
-rw-r--r--. 1 root root 0 Sep 20  2022 b
3、使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器

当SRC地址路径 \ 包含单个冒号":"分隔符时启动该模式。如:

Matlab 复制代码
# 192.168.100.20主机
[root@cy tmp]# touch file1
[root@cy tmp]# ll
total 0
-rw-r--r--. 1 root root 0 Sep 20  2022 b
-rw-r--r--. 1 root root 0 Sep 20 15:57 file1

# 在192.168.100.10主机
[root@server tmp]# rsync -avz root@192.168.100.20:/tmp/file1 /tmp/
receiving incremental file list
file1
sent 43 bytes  received 84 bytes  36.29 bytes/sec
total size is 0  speedup is 0.00
[root@localhost ~]# ls
anaconda-ks.cfg  a.sh  nfs.sh  yum.repos.d
[root@server tmp]# ll
total 0
-rw-r--r--. 1 root root 0 Sep 20 23:53 a
-rw-r--r--. 1 root root 0 Sep 20 23:53 afile
-rw-r--r--. 1 root root 0 Sep 20 15:57 file1

二、rsync+inotify

rsync与传统的cp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等。

但随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足。

首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。

其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因,rsync+inotify组合出现了!

1、Inotify简介

Inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件。

在前面有讲到,rsync可以实现触发式的文件同步,但是通过crontab守护进程方式进行触发,同步的数据和实际数据会有差异,而inotify可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync同步,这样刚好解决了同步数据的实时性问题。

2、部署

需求:

把源服务器上/root/etc目录实时同步到目标服务器的/tmp下;

配置时钟同步,将源服务器当作时钟服务器。

源服务器:
Matlab 复制代码
[root@server ~]# vim /etc/chrony.conf
# Serve time even if not synchronized to a time source.
local stratum 10
[root@server ~]# systemctl restart chronyd
[root@server ~]# systemctl enable chronyd
[root@server ~]# hwclock -w
目标服务器:
Matlab 复制代码
[root@cy tmp]# vim /etc/chrony.conf
server 192.168.100.10 iburst
[root@cy tmp]# systemctl restart chronyd
[root@cy tmp]# systemctl enable chronyd
[root@cy tmp]# hwclock -w
[root@cy tmp]# chronyc sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^? 192.168.100.10                0   8     0     -     +0ns[   +0ns] +/-    0ns
在目标服务器上:

关闭防火墙与SELINUX

Matlab 复制代码
[root@cy ~]# systemctl stop firewalld
[root@cy ~]# systemctl disable firewalld
[root@cy ~]# setenforce 0
[root@cy ~]# sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/sysconfig/selinux

安装rsync服务端软件,默认server中已经安装了rsync,如果未安装,则执行下面命令进行安装

Matlab 复制代码
[root@cy ~]# yum -y install rsync

设置rsyncd.conf配置文件

Matlab 复制代码
[root@cy ~]# vim /etc/rsync.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    # 用户认证配置文件,里面保存用户名称和密码,必须手动创建这个文件

[etc_from_client]     # 自定义同步名称
path = /tmp/          # rsync服务端数据存放路径,客户端的数据将同步至此目录
comment = sync etc from client
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 = 192.168.100.10   # 允许进行数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开
hosts deny = 192.168.1.1      # 禁止数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开

创建用户认证文件

Matlab 复制代码
[root@cy tmp]# echo 'admin:redhat' > /etc/rsync.pass
[root@cy tmp]# cat /etc/rsync.pass
admin:redhat

设置文件权限

Matlab 复制代码
[root@cy tmp]# chmod 600 /etc/rsync*
[root@cy tmp]# ll /etc/rsync*
-rw-------. 1 root root 384 Sep 20 16:14 /etc/rsyncd.conf
-rw-------. 1 root root  13 Sep 20 16:15 /etc/rsync.pass

启动rsync服务并设置开机自启动

Matlab 复制代码
[root@cy ~]# rsync --daemon
[root@cy ~]# echo 'rsync --daemon --config=/etc/rsyncd.conf' >> /etc/rc.d/rc.local
[root@cy ~]# netstat -tulnp | grep 873
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      2043/rsync 
tcp6       0      0 :::873                  :::*                    LISTEN      2043/rsync 
[root@cy ~]#
在源服务器上:

关闭防火墙与SELINUX

Matlab 复制代码
[root@server ~]# systemctl stop firewalld
[root@server ~]# systemctl disable firewalld
[root@server ~]# setenforce 0
[root@server ~]# sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/sysconfig/selinux

配置yum源

Matlab 复制代码
[root@server ~]# cd /etc/yum.repos.d/
[root@server yum.repos.d]# rm -rf *
[root@server yum.repos.d]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
[root@server ~]# yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
[root@server ~]# sed -i 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
[root@server ~]# sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*

安装rsync服务端软件,只需要安装,不要启动,不需要配置

Matlab 复制代码
[root@server ~]# yum -y install rsync

创建认证密码文件

Matlab 复制代码
[root@server ~]# echo 'redhat' > /etc/rsync.pass
[root@server ~]# cat /etc/rsync.pass
redhat

设置文件权限,只设置文件所有者具有读取、写入权限即可

Matlab 复制代码
[root@server ~]# chmod 600 /etc/rsync.pass

在源服务器上创建测试目录,然后在源服务器运行以下命令

Matlab 复制代码
[root@server ~]# mkdir -pv /root/etc/test
mkdir: created directory '/root/etc'
mkdir: created directory '/root/etc/test'
[root@server ~]# rsync -avH --port 873 --progress --delete /root/etc/ admin@192.168.100.20::etc_from_client --password-file=/etc/rsync.pass
sending incremental file list
deleting .font-unix/
deleting .esd-0/socket
deleting .esd-0/
deleting .XIM-unix/
deleting .X11-unix/X1024
deleting .X11-unix/
deleting .Test-unix/
deleting .ICE-unix/1486
deleting .ICE-unix/
deleting .viminfo
deleting .X1024-lock
./
test/
sent 77 bytes  received 191 bytes  536.00 bytes/sec
total size is 0  speedup is 0.00

运行完成后,在目标服务器上查看,在/tmp目录下有test目录,说明数据同步成功

Matlab 复制代码
[root@cy ~]# cd /tmp/
[root@cy tmp]# ls
test

安装inotify-tools工具,实时触发rsync进行同步

查看服务器内核是否支持inotify

Matlab 复制代码
[root@server ~]# ll /proc/sys/fs/inotify
total 0
-rw-r--r--. 1 root root 0 Sep 20 16:54 max_queued_events
-rw-r--r--. 1 root root 0 Sep 20 16:54 max_user_instances
-rw-r--r--. 1 root root 0 Sep 20  2022 max_user_watches

如果有这三个max开头的文件则表示服务器内核支持inotify

安装inotify-tools

Matlab 复制代码
[root@server ~]# yum -y install make gcc gcc-c++
[root@server ~]# yum -y install inotify-tools

写同步脚本,此步乃最最重要的一步,请慎之又慎。让脚本自动去检测我们制定的目录下 \

文件发生的变化,然后再执行rsync的命令把它同步到我们的服务器端去

Matlab 复制代码
[root@server ~]# mkdir /chenyu
[root@server ~]# touch /chenyu/inotify.sh
[root@server ~]# chmod +x /chenyu/inotify.sh
[root@server ~]# vim /chenyu/inotify.sh
host=192.168.100.20      # 目标服务器的ip(备份服务器)
src=/root/etc        # 在源服务器上所要监控的备份目录(此处可以自定义,但是要保证存在)
des=etc_from_client     # 自定义的模块名,需要与目标服务器上定义的同步名称一致
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 $user@$host::$des
    echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done

启动脚本

Matlab 复制代码
[root@server ~]# nohup bash /chenyu/inotify.sh &
[1] 32503
 nohup: ignoring input and appending output to 'nohup.out'

查看端口

Matlab 复制代码
[root@server ~]# ps -ef | grep inotify
root       32503    2458  0 17:05 pts/1    00:00:00 bash /chenyu/inotify.sh
root       32504   32503  0 17:05 pts/1    00:00:00 /usr/bin/inotifywait -mrq --timefmt %Y%m%d %H:%M --format %T %w%f%e -e modify,delete,create,attrib /root/etc
root       32505   32503  0 17:05 pts/1    00:00:00 bash /chenyu/inotify.sh
root       32510    2458  0 17:05 pts/1    00:00:00 grep --color=auto inotify

在源服务器上生成一个新文件

Matlab 复制代码
[root@localhost ~]# touch /root/etc/chenyu123

查看inotify生成的日志

Matlab 复制代码
[root@server ~]# tail /tmp/rsync.log
20220920 17:06 /root/etc/chenyu123CREATE was rsynced
20220920 17:06 /root/etc/chenyu123ATTRIB was rsynced

从日志上可以看到,我们生成了一个test文件,并且添加了内容到其里面

去目标服务器验证

源服务器中:

设置脚本开机启动

Matlab 复制代码
[root@server ~]# chmod +x /etc/rc.d/rc.local
[root@server ~]# ll /etc/rc.d/rc.local
-rwxr-xr-x. 1 root root 474 Mar 24  2020 /etc/rc.d/rc.local
[root@server ~]# echo 'nohup /bin/bash /chenyu/inotify.sh' >> /etc/rc.d/rc.local
[root@server ~]# tail /etc/rc.d/rc.local
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

touch /var/lock/subsys/local
nohup /bin/bash /chenyu/inotify.sh

到目标服务器上去查看是否把新生成的文件自动传上去了

Matlab 复制代码
[root@cy tmp]# ls
etc  test
[root@cy tmp]# cd etc/
[root@cy etc]# ls
chenyu123  test
[root@cy etc]# pwd
/tmp/etc

由此可见,已将源服务器的/root/etc目录整个同步到了目标服务器,且新增的test文件也自动同步了。

相关推荐
雯宝2 小时前
mnt_init 函数
linux
律宏阔8 小时前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
律宏阔8 小时前
WSL 突然断网,无法 ping 内网或外网
linux·windows
穷人小水滴8 小时前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox
乱码三千9 小时前
如何优雅地直连无公网 IP 的远程 GPU 服务器
linux·人工智能·程序员
yunwei379 小时前
使用 eBPF 跟踪 Nginx 请求
linux·后端·性能优化
yunwei379 小时前
使用 eBPF 跟踪 MySQL 查询
linux·后端·性能优化
yunwei379 小时前
eBPF 示例教程:使用 XDP 捕获 TCP 信息
linux·后端·性能优化
judezh9 小时前
api 容器一直 unhealthy?我把一个 Agent 运行时的健康检查逐条拆了,查出四个问题
运维·docker
GeW9 小时前
制造业高端化,为什么必须重估Linux和数据库?
linux