1

使用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
    image.png

  • 如果没有默认安装,建议运行如下命令

    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即可~

独上兰舟
119 声望5 粉丝

路漫漫其修远兮,吾将上下而求索。