jxnxsdengyu
作者jxnxsdengyu课题专家组·2020-04-09 15:00
系统工程师·江西农信

技术技巧---Linux文件同步

字数 5759阅读 1033评论 0赞 1

摘要

"Rsync + inotify"是常用的Linux文件实时同步方案,可用于作为容灾备份、实时更新、安全监控或其他用途。本文通过yum源同步案例,提供Linux下文件同步思路。

实现原理

通过使用inotify-tools调用inotify这个API,在内核层面对文件系统进行监控,对于文件系统中删除、读、写和移动等操作做出响应,并用read方法从描述符获取事件。在事件发生后调用rsync对监控文件目录进行增量复制。

详细介绍

rsync介绍

rsync(remote sync)是类unix系统下的数据镜像备份工具。
特性:
可以镜像保存整个目录树和文件系统。
可以很容易做到保持原来文件的权限、时间、软硬链接等等。
无须特殊权限即可安装。
快速:第一次同步时 rsync 会复制全部内容,但在下一次只传输修改过的文件。rsync 在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽。
安全:可以使用scp、ssh等方式来传输文件,当然也可以通过直接的socket连接。

inotify介绍

inotify可以监控文件,也可以监控目录。当监控目录时,它可以同时监控目录及目录中的各子目录及文件的。此外,inotify使用文件描述符作为接口,因而可以使用通常的文件I/O操作select、poll和epoll来监视文件系统的变化。
inotify可以监视的文件系统常见事件包括:

IN_ACCESS:文件被访问
IN_MODIFY:文件被修改
IN_ATTRIB,文件属性被修改
IN_CLOSE_WRITE,以可写方式打开的文件被关闭
IN_CLOSE_NOWRITE,以不可写方式打开的文件被关闭
IN_OPEN,文件被打开
IN_MOVED_FROM,文件被移出监控的目录
IN_MOVED_TO,文件被移入监控着的目录
IN_CREATE,在监控的目录中新建文件或子目录
IN_DELETE,文件或目录被删除
IN_DELETE_SELF,自删除,即一个可执行文件在执行时删除自己
IN_MOVE_SELF,自移动,即一个可执行文件在执行时移动自己

inotify-tools 介绍

inotify是一个API,需要通过开发应用程序进行调用,对于大多数用户来讲这有着许多不便,inotify-tools的出现弥补了这一不足。inotify-tools是一套组件,它包括一个C库和几个命令行工具,这些命令行工具可用于通过命令行或脚本对某文件系统的事件进行监控。
inotify-tools提供的两个命令行工具:
1、inotifywait:通过inotify API等待被监控文件上的相应事件并返回监控结果,默认情况下,正常的结果返回至标准输出,诊断类的信息则返回至标准错误输出。它可以在监控到对应监控对象上指定的事件后退出,也可以进行持续性的监控。
2、inotifywatch:通过inotify API收集被监控文件或目录的相关事件并输出统计信息。
其他更详细介绍:
inotify 请参考http://www.ibm.com/developerworks/oucn/linux/l-inotifynew/

Yum源同步案例

环境准备

系统环境:RHEL6.6
软件环境: rsync-3.0.6-12.el6.x86_64 , inotify-tools-3.14-1.el6.x86_64
服务器A 10.X.X.30 目标文件目录: /home/virtuser/www/repo
服务器B 10.X.X.112 源文件目录: /home/virtuser/www/repo
实现目标:服务器B源文件目录修改后实时同步到服务器B目标目录

服务器A配置

  1. 确认安装了rsync,未安装使用“yum install rsync –y”安装
  2. 编辑rsync服务器配置文件

    vim /etc/rsyncd.conf
    uid = root //运行RSYNC守护进程的用户
    gid = root //运行RSYNC守护进程的组
    use chroot = no //不使用chroot
    max connections=0 // 最大连接数无限制
    log file=/var/log/rsyncd.log //日志记录文件的存放位置
    pid file=/var/run/rsyncd.pid //锁文件的存放位置
    lock file=/var/run/rsyncd.lock //pid文件的存放位置
    [olyum] //认证模块名,自定义。在client端中需要指定
    path = /home/virtuser/www/repo //做镜像的目录,必须存在
    comment = rsync from 10.X.X.112 //注解
    read only = no //非只读
    list = no //不允许列文件列表
    auth users = rsync //认证用户名,如果没有这行则表名是匿名,此用户与系统无关
    secrets file = /etc/rsync.pas //密码和用户名对比表,密码文件自己生成

3.创建密码文件

vim /etc/rsync.pas
rsync:RCCB    //用户名:密码,中间用“:”隔开
chmod 600 /etc/rsync.pas      //修改密码文件权限,必须设置特定权限不然会报错

4. 配置rsync服务启动

[root@test0 ~]# vim /etc/init.d/rsync_server 
#!/bin/bash
#
# rsync_server        Startup script for the rsync Server
#
# chkconfig: - 86 18
# description: The Apache HTTP Server is an efficient and extensible  \\
#              server implementing the current HTTP standards.
# processname: rsync_server
# config: //etc/rsyncd.conf
# pidfile: /var/run/rsyncd.pid 
#
# Source function library.
. /etc/rc.d/init.d/functions

rsync=${rsync-/usr/bin/rsync}
prog=rsync_server
pidfile=${PIDFILE-/var/run/rsyncd.pid}
RETVAL=0
lockfile=/var/lock/subsys/$prog
STOP_TIMEOUT=${STOP_TIMEOUT-10}

start() {
        echo -n $"Starting $prog: "
        /usr/bin/rsync --daemon && success || failure
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch ${lockfile}
        return $RETVAL
}

stop() {
        echo -n $"Stopping $prog: "
        killproc -p ${pidfile} -d ${STOP_TIMEOUT}  $rsync
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && rm -f ${lockfile}   ${pidfile}
}

# See how we were called.
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  status)
        status -p ${pidfile} $rsync
        RETVAL=$?
        ;;
  restart)
        stop
        start
        ;;

  *)
        echo $"Usage: $prog {start|stop|restart|status}"
        RETVAL=2
esac
exit $RETVAL

5、赋权并验证启动rsync_server服务

chmod 755 /etc/init.d/rsync_server
service rsync_server start
ps -ef | grep rsync 

服务器B配置

1、使用 rpm –qa rsync inotify-tools确认是否已经安装 rsync ,inotify安装包,如未安装使用yum install rsync inotify-tools –y 安装
2、创建 inotify_rsync.sh 脚本(名称可以自定义)

vim  inotify_rsync.sh
#!/bin/bash
#date: 2015-09-22
#function: rsync 10.X.X.112 to 10.X.X.30
log=/var/log/inotify.log
src="/home/virtuser/www/repo/"
host="10.X.X.30"
module="OLyum"
/usr/bin/inotifywait –mrq --timefmt '%Y/%m/%d %H:%M' --format '%T %w %f %e' -e \\
close_write,modify,delete,create,attrib $src | while read DATE TIME DIR FILE e; do \\
FILECHANGE=${DIR}${FILE}
/usr/bin/rsync -avH –delete --password-file=/etc/rsync.pas $src rsync@$host::$module &
echo "DATE: ${DATE} ${TIME}, FILE: $FILECHANGE ,ACTION: ${e}" >> $log
done

3、用chmod +x inotify_rsync.sh 赋予执行权限
4、新增inotify_rsync 启动服务,并设置开机启动

[root@architecture ~]#vim  /etc/init.d/inotify_rsync 
#!/bin/bash
#
# inotify_rsync        Startup script for inotify_rsync.
#
# chkconfig: 2345 19 91
# description: inotify_rsync is used to  sync yum  online
# Source function library.
. /etc/init.d/functions

start() {
        if [ $UID -ne 0 ] ; then
            echo "User has insufficient privilege."
        exit 4
        fi
        /root/shell/inotify_rsync.sh &
}
stop()  {
        if [ $UID -ne 0 ] ; then
            echo "User has insufficient privilege."
        exit 4
        fi
        killall rsync
        killall inotifywait
}
restart() {
        stop
        start
}

case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        restart
        ;;
  *)
        echo $"Usage: $0 {start|stop|restart}"
        exit 3
esac
exit $?


chmod +x  /etc/init.d/inotify_rsync   //赋执行权限  

chkconfig -add inotify_rsync         //加入启动管理  

chkconfig -level 35 inotify_rsync on   //设置开机启动  


验证

修改10.X.X.112 中 /home/virtuser/www/repo 目录内容,查看是否在10.X.X.30中同步。注意,可能同步存在几秒时延。

排错

参考 10.X.X.30中/var/log/rsyncd.log 和10.X.X.112中/var/log/inotify.log 中错误信息进行中和判断

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广