乐趣区

关于linux:使用Rsync加iNotify完成文件异地实时备份

应用 Rsync+iNotify 实现定时备份数据

一、概念介绍

inotify 是一种弱小的、细粒度的、异步的文件系统事件管制机制

  • linux 内核从 2.6.13 起,退出了 inotify 反对,通过 inotify 能够监控文件系统中增加、删除、批改、挪动等各种事件,利用这个内核接口,第三方软件就能够监控文件系统下文件的各种变动状况,而 inotify-tools 正是施行监控的软件

二、功能分析

(1). 角色调配表

生产服务器主机 A 的地址:172.19.255.20 零碎:centos7.2 装置工具:rsync、inotify-tools
备份服务器主机 B 的地址:172.19.255.19 零碎:centos7.2 装置工具:rsync

  • 喜爱这个解释:

谁被动谁是客户端,谁被动谁是服务端

如果咱们须要实时备份数据;
让 inotify 监控文件系统的各种变动;
当文件有任何变动时,就触发 rsync 同步,则该源服务器为被动,那它就是 客户端;
备份服务器为被动方,那它就是 服务端

三、备份服务器配置操作

  • 在此揭示一下,自己在测试过程中,应用的是 root 账户,当然,如果应用的是其余账户,只有保障有足够的权限也可,谢谢 …

1、备份服务端装置 rsync:

现在的 linux 零碎,很可能曾经默认装置了 rsync,能够运行命令 rpm -aq rsync 或者 rsync -v 进行查看,如下信息阐明曾经装置了 rsync

  • 如果没有默认装置,倡议运行如下命令
yum install rsync

2、建设 rsync 配置文件

  • 以自己为例,因为零碎 centos7 已默认装置了 rsync , 为了便于操作,我间接在 /etc/rsyncd.conf 开端编辑配置文件
vim /etc/rsyncd.conf

log file = /var/log/rsyncd.log     
#设置日志文件门路
pid file = /var/run/rsyncd.pid    
#设置 pid 过程地位
lock file = /var/run/rsync.lock   
#锁文件寄存地位

[inotify]                   
#定义一个模块
path=/home/workdata-prd            
#要同步到目录的地位
uid = root               
#运行 rsync 的用户
gid = root               
#运行 rsync 的用户组
ignore = errors            
#疏忽一些非关键的谬误
read only = no             
#no 示意容许可读可写,yes 示意客户端只能读,write only = no            
#no 示意容许客户端能够下载文件,设置 yes 则不能下载
host allow = 172.19.255.20             
#容许连贯的主机,‘*’示意容许任何主机连贯,或者定义一个网段
max connections = 5 
#设置容许连贯到主机的最大连接数
host deny = 192.168.22.21 
#禁止连贯的服务器
list = false #禁止显示列表模块
auth users = inotify           
#连贯该模块的用户,多个用户用空格或逗号离开
secrets file = /etc/rsync.d/server.pass    
#创立并指定一个蕴含“用户名:明码”格局的文件,用户名就是 auth users 定义的用户,该用户与 linux 零碎用户无关,文件名称,地位自定义设置,

3、增加备份用户的用户密码文件,并批改文件权限

echo 'inotify:inotify123' > /etc/rsync.d/server.pass 
chmod 600 /etc/rsync.d/server.pass

4、启动 Rsync

# 启动 因为我间接用的默认配置文件地位,所以无需指定配置文件地位
rsync --daemon
# 查问是否启动胜利
ps -ef | grep rsync
root 2356     1  0 17:29 ?        00:00:00 rsync --daemon --config=/etc/rsync.d/rsyncd.conf
root 2361  1965  0 17:29 pts/1    00:00:00 grep --color=auto rsync

5、批改文件之后 rsync 的重启形式

 killall rsync
 rsync --daemon 
 lsof -i :873 #可查看是否已启动

tips:

在 “client” 端建设的密码文件,只有明码,没有用户名
而在备份服务端 “server” 里建设的密码文件,用户名与明码都有

四、生产服务器配置操作

1)、装置 rsync,只需装置无需启动

2)、建设拜访服务端的明码认证文件

echo "inotify123" >/etc/rsync.d/inotify.pass
#设置密码文件权限为只读
chmod 600 etc/rsync.d/inotify.pass

3)、装置 inotify-tools

yum install inotify-tools -y

inotify 相干零碎参数

inotify 定义了一些零碎参数用来限度 inotify 耗费内存的大小,参数设置文件在 /proc/sys/fs/inotify 下

  • max_queued_events 值:示意调用 inotify_init 时调配到 instances 中可排队的 event 数的最大值,超出这个值的事件被抛弃
  • max_user_instances 值:示意每一个 real user ID 能够创立的 inotify instatnces 数量的下限
  • max_user_watches 值:示意每个 inotify 实例能够监控的最大目录数量

4)、编写 inotify 监听脚本

cd /home
mkdir databacksh
cd databacksh
touch backdata.sh
vim backdata.sh

#/bin/bash
###
##
#
backupdir=/home/workdata-prd
srcdir=/home/workdata-prd
bakmod=inotify
#备份的用户,不是真正的零碎用户
user=inotify
host1=172.19.255.19

/usr/bin/inotifywait -mrq --timefmt '%F %T' --format '%T %w%f%e' -e modify,create,attrib $srcdir | while read files
        do
                /usr/bin/rsync -vzrtopg --progress  $srcdir $user@$host1::$bakmod --password-file=/etc/rsync.d/feng.pass >> /tmp/rsync.log 2>&1
                echo "${files} was rsynced" >> /var/log/rsync.log 2>&1
        done

对于脚本内容参数做简略了解:
backupdir=/home/workdata-prd:近程服务器寄存备份文件的目录
srcdir=/home/workdata-prd:本地要备份的数据目录
bakmod=inotify:近程服务器定义的 rsyncd.conf 中的模块名称
user=inotify:执行备份的用户,该用户是 rsyncd.conf 中“auth users”指定的用户
host1=172.19.255.19:备份主机地址
这个脚本的作用就是同 inotify 监控文件目录的变动,进而触发 rsync 进行同步操作

tips:

因为我的文件备份删除记录不须要同步,等于之前备份的数据如果在生成服务器进行了删除,我的备份服务器有仍然保留的需要,所以我在 inotifywait 中去掉了 delete 的监听与 rsync 中 –delete 的比照

5)、赋予脚本执行权限

chmod 755 /home/databacksh/backdata.sh

6)、后盾执行监听脚本

nohup sh backdata.sh &

五、常见问题

1、防火墙相干

rsync -arzvtopg --delete feng@192.168.214.190::bak /opt/app/ --password-file=/etc/rsync.d/feng.pass 
rsync: failed to connect to 192.168.214.190: No route to host (113)
rsync error: error in socket IO (code 10) at clientserver.c(124) [receiver=3.0.6]

需开启防火墙并关上端口,不倡议间接敞开防火墙,毕竟咱们的数据备份就是为了数据安全,不能顾此失彼。

firewall-cmd --add-port=873/tcp --permanent
firewall-cmd --reload

2、用户验证相干

报错:auth failed on module backup 模块备份验证失败
    [root@web01 ~]# rsync -avz rsync_bac@172.16.1.41::backup ./ --password-file=/etc/rsyncd.passwd
    @ERROR: auth failed on module backup
    rsync error: error starting client-server protocol (code 5) at main.c(1649) [Receiver=3.1.2]
解决:用户名是否写对

1、查看备份服务器中 rsyncd.conf 中的 auth_users 的用户名与 server.pass 中的用户名是否匹配
2、查看生产服务器中密码文件的明码是否与备份服务器中定义的匹配,查看 rsync 同步命令中指定的用户名与定义的用户名是否匹配

3、inotify 监听文件过多

在对一个大磁盘进行 inotify 监听时,爆出如下谬误:Failed to watch /mnt/;
upper limit on inotify watches reached!
Please increase the amount of inotify watches allowed per user via `/proc/sys/fs/inotify/max_user_watches’.

cat 一下这个文件,默认值是 8192,echo 8192000 > /proc/sys/fs/inotify/max_user_watches 即可~
退出移动版