Linux下文件实时自动同步备份

本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 chaodev 即可关注。


前言

我们都知道一旦 Linux 系统被入侵了,或者 Linux 系统由于硬件关系而死机,如何快速恢复系统呢?当然,如果有备份数据的话,那么恢复系统所花费的时间与成本将会很少。平时最好就养成备份的习惯,可以避免发生突发事件时束手无策。

本篇文章将对 Linux 主机之间文件实时自动同步备份进行讲解,使用 rsync+inotify 组合的方式来实现,避免由于硬件或者软件导致的 Linux 系统死机或损坏造成的损失。


文章重点

1、rsync+inotify 简介
2、整体架构
3、同步节点部署(rsync)
4、源服务器节点部署(rsync+inotify)
5、实时同步备份验证
6、遇到的问题及解决方法


一、rsync+inotify 简介

1、rsync简介

rsync(remote synchronize)是 Liunx/Unix 下的一个远程数据同步工具,它可通过 LAN/WAN 快速同步多台主机间的文件和目录。

Linux 之间同步文件一般有两种方式,分别是 rsyncscp 。scp 相当于复制,粘贴,文件不存在则新建,若存在则覆盖,而 rsync 则是比较两边文件是否相同,不相同才进行更新。所以 rsync 和 scp 在文件夹存在的情况下差异很大,因为 scp 是复制和覆盖,从执行性能来说 rsync 更胜一筹。而且 rsync 能将文件夹、文件的权限等信息也保存下来。

但是 rsync 也有一定的缺点,在同步数据时,需要扫描所有文件后进行比对,如果文件数量相当大时,扫描文件就非常耗费时间和性能。其次,rsync 不能够实时监测、同步数据,这就可能导致一些时间段数据不一致。解决这个问题的方法就是实时同步,所以需要使用 rsync+inotify 组合。


2、inotify简介

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

首先检查系统内核是否支持 inotify

uname -r  
ll /proc/sys/fs/inotify

出现以下三个文件表示系统默认支持 inotify,如下所示。

[root@localhost ~]# uname -r  #查询系统内核版本
3.10.0-327.el7.x86_64
[root@localhost ~]# ll /proc/sys/fs/inotify
total 0
-rw-r--r-- 1 root root 0 Mar 11 09:34 max_queued_events
-rw-r--r-- 1 root root 0 Mar 11 09:34 max_user_instances
-rw-r--r-- 1 root root 0 Mar 11 09:34 max_user_watches

二、整体架构

这里我使用两个 Linux 服务器节点来做演示,实现两个节点间文件的实时同步,node1 为源服务器节点,就是需要同步数据的节点,部署 rsync+inotify ,node2 为同步节点,也就是接收同步数据的节点,只需要部署 rsync,如下所示。

主机节点名系统ip角色软件
node1源服务器节点CentOS7 64位192.168.157.129Serverrsync,inotify
node2同步节点CentOS7 64位192.168.157.130Clientrsync

node1 中的 inotify 用于监控文件或文件夹的各种变化情况,一旦变动则利用 rsync 来进行文件的同步,具体架构图如下所示。
在这里插入图片描述

三、同步节点部署(rsync)

同步节点,也就是node2 192.168.157.130,只需要安装配置 rsync 即可,具体步骤如下。

1、安装rsync

(1)直接使用yum命令安装

yum -y install rsync

(2)使用编译安装

官网:https://rsync.samba.org/
下载地址:https://rsync.samba.org/ftp/rsync/ ,目前最新版本是3.1.3 。

在这里插入图片描述


下载完成后解压安装,如下

# 解压
tar zxvf rsync-3.1.3.tar.gz
cd rsync-3.1.3/
# 配置
./configure
# 编译及安装
make && make install

安装完成后,使用rsync –-help命令可查看 rsync 相关信息

在这里插入图片描述

2、配置rsync

rsync 安装好之后,在 etc 目录下有一个 rsyncd.conf 文件,修改rsync配置文件。

vim /etc/rsyncd.conf

修改内容如下

uid = nobody
gid = nobody
use chroot = yes
max connections = 10
strict mode=yes
pid file = /var/run/rsyncd.pid
lock file=/var/run/rsync.lock
log file=/var/log/rsyncd.log
[backup]
        path = /backup129/
        comment = backup file
        ignore errrors
        read only=no
        write only=no
        hosts allow=192.168.157.129
        hosts deny=*
        list=false
        uid=root
        gid=root
        auth users=yxc
        secrets file=/etc/rsync.password

其中需要用到一个密码文件,也就是上面配置的 secrets file 的值 /etc/rsync.password,在 rsync3.1.3 版本中默认没有密码文件,需要手动创建,内容格式为:user:password,user 就是上面配置的 yxc,password 就是密码,如下所示。

echo "yxc:123456" > /etc/rsync.password

然后需要给密码文件600权限

chmod 600 /etc/rsync.password

启动 rsync 守护进程

/usr/local/bin/rsync --daemon

启动之后可查看 rsync 进程,如下

ps -ef | grep rsync

在这里插入图片描述

如有需要可加入系统自启动文件

echo "/usr/local/bin/rsync --daemon" >> /etc/rc.local

rsync 默认端口为873,所以开放873端口

firewall-cmd --add-port=873/tcp --permanent --zone=public
#重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload

四、源服务器节点部署(rsync+inotify)

源服务器节点,也就是 node1 192.168.157.129,需要部署 rsync 和 inotify。

1、安装rsync

rsync 安装方式和上面相同,就不详细讲解了。

# 解压
tar zxvf rsync-3.1.3.tar.gz
cd rsync-3.1.3/
# 配置
./configure
# 编译及安装
make && make install

2、配置rsync

源服务器节点中只需要配置认证密码文件,首先在 etc 文件夹下创建文件 rsync.password,只需要密码,不需要用户,密码需要和同步节点 node2 中的一致,我这里也就是123456。

vim /etc/rsync.password

在这里插入图片描述

修改密码文件权限

#需要给密码文件600权限
chmod 600 /etc/rsync.password

启动 rsync 守护进程

/usr/local/bin/rsync --daemon

如有需要可加入系统自启动文件

echo "/usr/local/bin/rsync --daemon" >> /etc/rc.local

同样开放873端口,如下所示

firewall-cmd --add-port=873/tcp --permanent --zone=public
#重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload

3、手动同步测试

先在源服务器节点的 /root/data/backuptest/ 目录下新建一个 test 文件夹

mkdir data/backuptest/test

然后使用如下命令进行同步测试,其中一些参数要和同步节点配置文件中相对应,比如下面的认证模块名 backup、用户名 yxc 等。

rsync -avH --port 873 --delete /root/data/backuptest/ yxc@192.168.157.130::backup --password-file=/etc/rsync.password

在这里插入图片描述

可以看到 node1 中文件夹 test 已经发送,查看同步节点 node2 中,如下

在这里插入图片描述

test 文件夹已经同步到 node2,所以我们的 rsync 配置成功,可以进行文件同步,接下来就是部署 inotify 实现实时同步,通过inotify监听文件或文件夹,如果有变动就进行同步。


4、部署inotify
(1)下载安装

inofity-tools下载地址:http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
inotify-tools 的详细介绍可以看:https://github.com/rvoicilas/inotify-tools/wiki

下载完成后,进行解压安装,如下

# 解压
tar zxvf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14/
# 配置
./configure
# 编译及安装
make && make install

(2)创建rsync同步的shell脚本

安装完成之后需要创建用于 rsync 同步的 shell 脚本,如果添加、修改、删除了文件或文件夹,inotify 可以监控到,然后通过 rsync 进行同步,这里我们就在需要进行监控的目录创建这个脚本

vim /root/data/backuptest/inotifyrsync.sh
#!/bin/bash
host1=192.168.157.130
src=/root/data/backuptest/
dst1=backup
user1=yxc
/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,delete,create,attrib $src \
| while read files
do
        /usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/rsync.password $src $user1@$host1::$dst1 > /dev/null 2>&1
        echo "${files} was rsynced." >> /tmp/rsync.log 2>&1
done

其中 host 是 client 的 ip,src 是 server 端要实时监控的目录,des 是认证的模块名,需要与 client 一致,user 是建立密码文件里的认证用户。

然后给这个脚本赋予权限

chmod 755 /root/data/backuptest/inotifyrsync.sh

后台运行这个脚本

/root/data/backuptest/inotifyrsync.sh &

有需要可以将脚本加入系统自启动文件中

echo "/root/data/backuptest/inotifyrsync.sh &" >> /etc/rc.local

五、实时同步备份验证

在 node1 节点中添加删除修改文件或文件夹,看 node2 中是否会自动同步,首先在 node1 中创建一个文件夹 hello
在这里插入图片描述
查看 node2 中 backup129 文件夹,hello 文件夹已经同步,如下
在这里插入图片描述


再在 node1 中创建、删除或修改一些文件或文件夹
在这里插入图片描述
在 node2 中都会进行实时的同步备份,如下所示
在这里插入图片描述

所以经验证,实时自动同步备份功能成功实现。


六、遇到的问题及解决方法

1、手动同步测试时出现如下错误。

[root@oraserver ~]# rsync -avH --port 873 --delete /root/data/backuptest/ yxc@192.168.157.130::backup --password-file=/etc/rsync.password
@ERROR: chroot failed
rsync error: error starting client-server protocol (code 5) at main.c(1657) [sender=3.1.3]
[root@oraserver ~]# 

出现这个错误的原因是服务器端的目录不存在或无权限。查看130节点日志,如下

[root@localhost backup129]# cat /var/log/rsyncd.log 
2020/03/11 15:46:17 [90120] rsync: chroot /backup129 failed: No such file or directory (2)

果然backup129 这个目录不存在,创建这个目录即可解决问题。


2、启动rsync失败,提示pid文件已经存在

[root@localhost data]#  /usr/local/bin/rsync --daemon
[root@localhost data]# failed to create pid file /var/run/rsyncd.pid: File exists

删除pid文件即可

rm -rf /var/run/rsyncd.pid

3、启动inotifyrsync.sh这个shell脚本时,发生错误

[root@oraserver ~]# /root/data/backuptest/inotifyrsync.sh &
[1] 30084
[root@oraserver ~]# /root/data/backuptest/inotifyrsync.sh: line 6: /usr/local/inotify/bin/inotifywait: No such file or directory
/root/data/backuptest/inotifyrsync.sh: line 7: syntax error near unexpected token `|'
/root/data/backuptest/inotifyrsync.sh: line 7: `| while read files '
[1]+  Exit 2                  /root/data/backuptest/inotifyrsync.sh

原因:/usr/local/inotify/bin/inotifywait 路径不对,是 /usr/local/bin/inotifywait ,修改即可。



觉得有帮助点个赞吧!!!
原创不易,转载请注明出处。

微信扫一扫下方二维码即可关注我的公众号

  • 10
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员大佬超

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值