zoukankan      html  css  js  c++  java
  • centos 配置rsync+inotify数据实时同步2

    、Rsync服务简介

    1. 什么是Rsync

    它是一个远程数据同步工具,它在同步文件的同时,可通过LAN/WAN快速同步多台主机间的文件。Rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。可以保持原来文件的权限、时间、软硬链接等附加信息。

    2. Rsync的特性

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

    (2)容易做到保存原有的权限,owner、group、时间(修改时间 modify time)、软硬链接等;

    (3)传输效率高,使用同步算法,只比较变化的部分;

    (4)支持匿名传输,方便网站镜像管理。

    二、Rsync配置使用

    1. 安装rsync软件

    #  yum  -y  install  rsync                               --安装rsync

    image.png


    2. 配置文件

    rsync的主要有以下三个配置文件,后面两个文件默认不存在,请手动创建它。

    (1)rsyncd.conf(主配置文件)

    (2)rsyncd.secrets(密码文件)

    (3)rsyncd.motd(rsync服务器信息)

    3. Rsync选项

    -v      # verbose 详细模式输出
    -q      # quiet 精简输出模式。
    -c      # checksum 打开校验开关,强制对文件传输进行校验
    -a      # archive 归档模式,以递归的方式传输文件,并保持所有文件属性,(-a = -rlptgoD)
    -r      # recursive 对子目录以递归模式处理
    -R      # relative 保留相对路径信息
    -b      # backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不>同的备份文件前缀
    --backup-dir    # 将备份文件(如~filename)存放在在目录下
    -suffix=SUFFIX  # 定义备份文件前缀
    -u      # update 仅进行更新,也就是跳过所有已经存在于DST(目标主机),并且文件时间晚于要备份的文件,不覆盖更新的文件
    -l      # links 保留软链接
    -L      # copy-links 想对待常规文件一样处理软链接
    --copy-unsafe-links     # 仅仅拷贝指向SRC(源主机)路径目录树以外的链结
    --safe-links    # 忽略指向SRC(源主机)路径目录树以外的链结
    -H      # hard-links 保留硬链结
    -p      # perms 保留文件权限
    -t      # times 保持文件时间信息
    -g      # group 保持文件属组信息
    -o      # owner 保持文件属主信息
    -D      # devices 保持设备文件信息,表示支持b,c,s,p类型的文件
    -A      # 保留acl(访问控制权限)权限
    -S      # sparse 对稀疏文件进行特殊处理以节省DST(目标主机)的空间
    -n      # dry-run 现实哪些文件将被传输。
    -w      # whole-file 拷贝文件,不进行增量检测
    -x      # one-file-system 不要跨越文件系统边界
    -B      # block-size=SIZE 检验算法使用的块尺寸,默认是700字节
    -e      # rsh=command 指定使用rsh、ssh方式进行数据同步
    --rsync-path=PATH       # 指定远程服务器上的rsync命令所在路径信息
    -C      # cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件
    --existing      # 仅仅更新那些已经存在于DST(目标主机)的文件,而不备份那些新创建的文件
    --delete        # 删除那些DST(目标主机)中SRC(源主机)没有的文件
    --delete-excluded       # 同样删除接收端那些被该选项指定排除的文件
    --delete-after  # 传输结束以后再删除
    --ignore-errors # 及时出现IO错误也进行删除
    --max-delete=NUM        # 最多删除NUM个文件
    --partial       # 保留那些因故没有完全传输的文件,以是加快随后的再次传输
    --force         # 强制删除目录,即使不为空
    --numeric-ids   # 不将数字的用户和组id匹配为用户名和组名
    --timeout=time ip       # 超时时间,单位为秒
    -I      # ignore-times 不跳过那些有同样的时间和长度的文件
    --size-only     # 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间
    --modify-window=NUM     # 决定文件是否时间相同时使用的时间戳窗口,默认为0
    -T      # temp-dir=DIR 在DIR中创建临时文件
    --compare-dest=DIR      # 同样比较DIR中的文件来决定是否需要备份
    -P      # 等同于 --partial
    --progress      # 显示备份过程
    -z      # compress 对备份的文件在传输时进行压缩处理
    --exclude       # 指定不传输的文件
    --exclude=PATTERN       # 指定排除不需要传输的文件模式
    --include=PATTERN       # 指定不排除而需要传输的文件模式
    --exclude-from=FILE     # 排除FILE中指定模式的文件
    --include-from=FILE     # 不排除FILE指定模式匹配的文件
    --version       # 打印版本信息
    --address       # 绑定到特定的地址
    --config=FILE   # 指定其他的配置文件,不使用默认的rsyncd.conf文件
    --port=PORT     # 指定其他的rsync服务端口
    --blocking-io   # 对远程shell使用阻塞IO
    -stats          # 给出某些文件的传输状态
    --progress      # 在传输时现实传输过程
    --log-format=formAT     # 指定日志文件格式
    --password-file=FILE    # 从FILE中得到密码
    --bwlimit=KBPS  # 限制I/O带宽,KBytes per second
    -h      # help 显示帮助信息
     

    4. Rsync的普通用法

    #  rsync  -av  /test/  /backup                               --本机上的同步,把/test目录下的内容同步到/backup目录下(包括隐藏文件)

    #  rsync  -av  /test/  192.168.1.20:/backup          --把本地的/test目录内容,同步到远端191.168.1.10的/backup目录下

    #  rsync  -av  192.168.1.20:/backup/  /backup/   --把远端192.168.1.20的/backup目录下的内容同步到本地的/backup目录

    (注意:路径写法的区别!原目录后面加不加/也影响你的同步目录;没加/,就是将目录本身同步过去;目录加/,就是将目录里的内容同步过去!)

    #  rsync  -av  /home  --exclude=abc  /backup    --将/home目录下除了abc其他内容都同步到/backup目录下

    #  rsync  -a  --delete  /backup/  /test/                 --如果同步后,源主机中有文件删除了,这时要想目标主机与源主机的内容保持一致,可以使用--delete参数进行同步

    Rsync本身不具备控制功能和日志记录功能,需要把Rsync做成服务的形式,并加上一些控制功能或日志记录功能。

    三、CentOS下的Rsync服务

    1. 系统环境

    系统平台: CentOS 7.3

    Rsync Server: 192.168.1.88

    Rsync Client:  192.168.1.20

    关闭防火墙

    #  systemctl  stop  firewalld              --临时关闭防火墙 

    #  systemctl  disable  firewalld          --永久关闭防火墙

    关闭selinux

    临时关闭:

    #  setenforce 0

    永久关闭:

    #  vim  /etc/selinux/config

     SELINUX=disabled              --将enforcing改为disabled

    #  reboot                                 --重启系统永久生效

    2. 搭建Rsync服务

    服务器的操作

    (1)设置配置文件

    #  mkdir  /data                                            --创建同步目录

    #  vim  /etc/rsyncd.conf                              --文件最后添加一下内容

    motd file=/etc/rsyncd.welcome   # 定义指定的文件路径
    [test]                          # 参数组名称
    path=/data                      # 定义参数组同步目录路径
     

    image.png

    #  vim  /etc/rsyncd.welcome                    --手动建立自己定义的motd文件,并写上自定义的欢迎信息
    *******************************************
    ****** ^_^ Welcome to use rsync!^_^ ******
    *******************************************
     

    image.png

    (2)启动服务

    #  systemctl  restart  rsyncd.service             --重新启动rsync服务

    #  netstat  -ntlp  |  grep  rsync                     --查看监听rsync服务的端口

    #  lsof  -i:873                                                --rsync的端口为873

    image.png

    客户端的操作

    #  rsync  -v  192.168.1.88::                           --查看rsync服务器同步路径名(注意服务器ip后面有两个冒号)

    无标题.png

    #  mkdir  /databak                                      --创建存放同步内容的目录

    #  rsync  -a  192.168.1.88::test  /databak

    --这样同步,是不需要密码的;注意test为共享路径名称,语法上在该名称前面有两个“:”

    image.png


    没有密码有好处也有坏处,好处是不需要密码方便写脚本做远程同步。如果要密码写脚本就要用到expect自动应答。坏处就是不安全,但你可以使用iptables等来加强安全。

    如果你希望有密码,也不用传密码的话,可以用rsyncd本身自带的secrets file(密码文件)来做:

    (secrets file = /etc/rsyncd.secrets)

    如果同步报permission denied这种错误,可能是服务端防火墙或selinux没有关闭。

    Rsync和Xinetd比较

      rsyncd xinetd
    把日志记录到/var/log/rsyncd.log log file log_type
    共享模块要求隐藏(也就是说客户端查看不到这个模块名(test)) list list
    同时只能1个客户端连接进行同步这个module(notes) max connections instances
    只能允许192.168.1.207(ip自定义)同步这个module hosts allow only_from
    只能早上9点到下午5点同步 access_times access_times
    #  vim  /etc/rsyncd.conf
    motd file = /etc/rsyncd.welcome
    [test]
    path = /data                          
    [notes]                               # 参数组名称 
    path = /var/www/html                  # 设置rsync同步文件路径
    list = false                          # 隐藏共享模块名称(test)
    max connections = 1                   # 设置同一时间内最大的链接数
    log file = /var/log/rsyncd.log        # 设置指定的日志文件路径
    hosts allow = 192.168.1.207 192.168.1.20 (192.168.1.0/24)    # 设置限定的ip或网段
    access_times = 9:00-17:00             # 允许连接时间段
     

    image.png

    #  systemctl  restart  rsyncd.service                 --重新启动rsync服务


    用xinetd托管rsync服务(CentOS 7.3 Xinetd服务的安装与配置

    #  vim  /etc/xinetd.d/rsync                              --这个文件需要自己创建,下面这个是基础配置,需要加其他功能可以再添加参数
    service rsync
    {
            disable         = no                 # yes改为no  打开托管rsync服务功能
            socket_type     = stream             # socket连接方式,这个是属于本地方式,对ssh无效
            wait            = no                 # 是否并发
            user            = root               # 以什么用户进行启动
            server          = /usr/bin/rsync     # 被托管服务(rsync)的启动脚本
            server_args     = --daemon           # 设置服务启动时需要的参数
            log_on_failure  += USERID            # 设置失败时,UID添加到系统登记表
    }
     

    image.png

    #  systemctl  restart  xinetd.service                   --重新启动xinetd服务

    到此,rsync服务就被xinetd托管了。

    四、Rsync + Inotify实时同步搭建

    Rsync实时同步,是以Inotify工具实现的,Inotify是监听工具。

    Inotify是一种基于内核的文件变化通知机制,用于监控文件系统时间,如文件存取、删除、移动、修改等。

    1. 下载inotify源码包并编译安装

    包名称:inotify-tools-3.14.tar.gz

    下载网址:https://github.com/rvoicilas/inotify-tools/wiki

    或             https://sourceforge.net/projects/inotify-tools/files/latest/download

    网络下载:

    #  wget  http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz

    #  tar  xf  ./inotify-tools-3.14.tar.gz  -C  /usr/src/   --解压

    #  cd  /usr/src/inotify-tools-3.14/                           --cd到解压的路径里

    #  ./configure                --配置源码包

    #  make                         --编译源码包

    #  make  install             --安装源码包

    image.png

    安装成功后,会有以下两条命令

    #  /usr/local/bin/inotifywait                         --我们使用就是这条命令
    #  /usr/local/bin/inotifywatch

    image.png

    2. 查看命令参数

    #  /usr/local/bin/inotifywait  -help               --查看命令的帮助文件,有些参数可用

    常用的参数为4个:

    -m   --监听
    -r   --递归
    -q   --打印
    -e   --事务
     

     事务又分为以下参数:

    modify   --修改事务
    attrib   --属性改变事务
    move    --移动事务
    create   --创建事务
    delete   --删除事务
     

    3. Rsync本地实时同步

    准备工作:

    1台服务器,两个目录,用于同步,1个为源(/test),1个为目标(/testbak)

    image.png

    #  mkdir  /test                 --创建/test目录为源,用于监听

    #  mkdir  /testbak           --创建/testbak目录为目标,用于将/test目录内容同步到/testbak

    #  vim  /tmp/rsync.sh     --写一个监听脚本

    #!/bin/bash
    /usr/local/bin/inotifywait -mrq -e modify,attrib,move,create,delete /test | while read file
    do
        rsync -a --delete /test/ /testbak/
        echo "$file在`date +'%F %T %A'`同步成功" >> /var/log/rsync.log
    done
     

    image.png

    启动脚本,实现rsync实时同步

    #  nohup  sh  -x  /tmp/rsync.sh  &                 --使用nohup方式执行脚本,并放到后台执行

    #  jobs  –l                                                        --查看在后台运行的任务

    image.png

    注意:

    如果要中止后台执行的任务,执行 kill  -9  %x,-9为强制杀死,x为jobs任务号

    如果执行 jobs  -l 没有内容显示出来,则在 vim  nohup.out 查看是否报错

    测试

    打开两个终端,一个在监听的目录里创建文件,另一个运行监听日志

    #  mkdir  /test/abc                                       --在监听的目录里创建abc目录

    #  tail  -f  /var/log/rsync.log                        --监听日志(只有当/test目录的内容有改变时,日志才会有信息)

    #  ll  /testbak                                               --查看abc目录是否有同步到/testbak目录下

    image.png

    4. Rsync远程实时同步(三种方法)

    准备两台虚拟机,一台作为本机(服务器),另一台作为远程机(客户端),两台虚拟机IP要能互相ping通

    image.png

    方法一:使用ssh创建密钥的方法

    创建ssh远程登陆自动密码,实现无需输入密码即可登陆

    #  cd                        --切换到用户家目录

    #  ssh-keygen         --执行该命令后,一直回车,会自动生成两个密钥文件

    #  ll  /root/.ssh/      --两个密钥文件目录

    id_rsa                      --本地密钥

    id_rsa.pub               --公共密钥

    image.png

    把公共密钥id_rsa.pub复制给需要远程登陆的机子(即目标机)并改名为authorized_keys

    #  scp  /root/.ssh/id_rsa.pub  192.168.1.20:/root/.ssh/authorized_keys

    #  ssh  192.168.1.20                          --验证是否还需要输入密码,不需要输入密码就可以登陆说明密钥设置成功

    #  exit                                                --退出远程登陆

    image.png

    #  vim  /tmp/rsync_key.sh                --写一个监听脚本
    #!/bin/sh
    /usr/local/bin/inotifywait -mrq -e modify,attrib,move,create,delete /test | while read file
    do
        rsync -a --delete /test/ 192.168.1.20:/testbak/
        echo "$file在`date +'%F %T %A'`同步成功" >> /var/log/rsync.log
    done
     

    启动脚本,实现rsync实时同步

    #  nohup  sh  -x  /tmp/rsync_key.sh  &          --使用nohup方式执行脚本,并放到后台执行

    #  jobs  –l                                                        --查看在后台运行的任务

    注意:

    如果要中止后台执行的任务,执行 kill  -9  %x,-9为强制杀死,x为jobs任务号

    如果执行 jobs  -l 没有内容显示出来,则在 vim  nohup.out 查看是否报错

    测试

    服务器上创建文件或者目录,然后在客户端进行查看 ls  /testbak 目录是否有同步。并查看服务器 cat  /var/log/rsync.log 是否有同步成功信息。

    方法二:使用expect自动应答的方法

    用脚本的expect(TCL;tool command language 工具命令语言,是一种脚本语言)自动应答来处理远程连接时要输入的密码问题

    修改脚本,然后把先前的脚本进程都 kill 掉,重新执行,重新验证(如果没有做方法二步骤,可不用执行kill)

    #  yum  -y  install  expect                 --安装expect

    #  mkdir  /test                                  --创建/test目录

    #  vim  /tmp/rsync.sh                       --写一个监听脚本
    #!/bin/bash
    /usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib,move /test | while read file
    do
    sed -i '/^192.168.1.20/d' /root/.ssh/known_hosts        # 清空192.168.1.20远程连接记录
    expect << EOF &> /dev/null
    spawn rsync -a --delete /test/ 192.168.1.20:/testbak/
    expect "(yes/no)?"              # 提示输入yes或no
    send "yes
    "                    # 输入yes,
    表示回车
    expect "password:"              # 提示输入密码
    send "123456
    "                 # 密码为123456(192.168.1.20的登录密码)
    expect eof                      # 自动应答结束
    EOF                             # 输入内容结束(对照下图可以更好的理解)
    echo "$file 在`date +'%F %T'`被同步完成" >> /var/log/rsync.log
    done
     

    image.png

    启动脚本,实现rsync实时同步

    #  nohup  sh  -x  /tmp/rsync.sh  &                 --使用nohup方式执行脚本,并放到后台执行

    #  jobs  –l                                                        --查看在后台运行的任务

    注意:

    如果要中止后台执行的任务,执行 kill  -9  %x,-9为强制杀死,x为jobs任务号

    如果执行 jobs  -l 没有内容显示出来,则在 vim  nohup.out 查看是否报错

    测试

    服务器上创建文件或者目录,然后在客户端进行查看 ls  /testbak 目录是否有同步。并查看服务器 cat  /var/log/rsync.log 是否有同步成功信息。

    方法三:使用secrets file的方法

    准备两台虚拟机,1台作为rsync服务器,另一台作为客户端。

    需求:将服务器/localtest目录内容同步到客户端上/test目录里

    服务器:192.168.1.88

    客户机:192.168.1.20

    1)客户端上操作

    #  mkdir  /test                                --创建/test目录用来同步服务器中/localtest目录中的内容

    客户端上搭建rsync服务

    #  vim  /etc/rsyncd.conf                --文件最后添加以下内容
    uid=root
    gid=root
    
    [notes]
    path=/test/
    ignore errors
    read only=no
    auth users=test
    secrets file=/etc/rsyncd.secrets
    hosts allow=192.168.1.0/24
     

    image.png

    #  vim  /etc/rsyncd.secrets                     --创建客户机访问时验证帐号密码的文件,并写上帐号和密码

    test:123456                                            --test为帐号:后面为密码

    #  chmod  600  /etc/rsyncd.secrets       --把密码文件改为600权限

    #  systemctl  restart  rsyncd.service       --重启服务

    #  systemctl  enable  rsyncd.service      --设为开机自启动

    image.png

    2)服务器上操作

    #  mkdir  /localtest                 --创建/localtest文件夹为源,用于同步给客户端的/test
    #  vim  /tmp/rsync.sh             --写一个监听脚本
    #!/bin/sh
    /usr/local/bin/inotifywait -mrq -e modify,attrib,move,create,delete /localtest | while read aa
    do
        rsync -a --delete --password-file=/etc/rsync.passwd /localtest/ test@192.168.1.20::notes/
        echo "$aa在`date +'%F %T %A'`同步成功" >> /var/log/rsync.log
    done
     

    image.png

    #  chmod  757  /tmp/rsync.sh                 --安装tcp_wrappers

    #  vim  /etc/rsync.passwd                        --创建密码文件

    123456

    #  chmod  600  /etc/rsync.passwd          --把密码文件改成600权限          


    启动脚本,实现rsync实时同步

    #  nohup  sh  -x  /tmp/rsync.sh  &          --使用nohup方式执行脚本,并放到后台执行

    #  jobs  -l                                                 --查看在后台运行的任务

    注意:

    如果要中止后台执行的任务,执行 kill  -9  %x,-9为强制杀死,x为jobs任务号

    如果执行 jobs  -l 没有内容显示出来,则在 vim  nohup.out 查看是否报错

    测试

    服务器上操作:

    #  tail  -f  /var/log/rsync.log                 --在监听的文件夹里创建test.txt文件夹

    #  touch  /localtest/test.txt                   --来到客户机上查看/test文件是否有同步过去

    客户机上操作:

    #  ll  /test


    如果你想搭建双向数据实时同步,反过来做一遍就OK了。

  • 相关阅读:
    五条面试忠告
    NET平台微服务
    CentOS,net core2 sdk nginx、supervisor、mysql
    搭建基于java环境
    产生唯一随机码的方法分析
    SpringBoot JPA 专题
    关于 MySQL 的 boolean 和 tinyint(1)
    org.springframework.data.mapping.PropertyReferenceException: No property created found for type
    交流心得
    github如何删除一个repository(仓库)
  • 原文地址:https://www.cnblogs.com/duanlinxiao/p/11011881.html
Copyright © 2011-2022 走看看