zoukankan      html  css  js  c++  java
  • rsync+inotify同步

    一、相关参数

    https://rsync.samba.org/documentation.html  官网

    https://download.samba.org/pub/rsync/rsync.1 具体使用

    rsync竟然是samba团队开发的。

     

    注意rsync默认同步 大小和修改时间有变动的文件,可以使用--size-only指定只同步大小有变动的文件。

     

    1-r-a参数的不同

    rsync-a选项是archive的意思,加了之后相当于-rlptgoD(注意包括了-l软链接,但不包括-H硬链接),有以下作用

    递归模式

    • 同步软链接(不含硬链接)

    • 同步权限

    • 同步时间戳

    • 同步属主和属组

     

    -r参数应该就只是表示递归的意思。

     

    当复制链接文件/etc/mtab时:

    rsync -rv --progress /etc/mtab  /root

    rsync使用-r参数时,/etc/mtab为  链接文件,注意看跳过复制链接文件

     

    rsync -avz  /etc/mtab /root 如下:

     

     2--existing参数:仅仅更新那些已经存在于接收端的文件,而不备份那些新创建的文件

    假设如下:

    1目录下存在aa.txtbb.txt2目录,2目录下有cc.txt  

    yangweihua目录,存在2目录和aa.txt

    rsync -avz  --existing  1/  yangweihua  

    rsync -avz  --existing  1  yangweihua  什么也不会同步

     

    3)-u参数

    源和目标都存在,如果目标相对源头已经修改过,就不从源同步到目标

    1/ee.txt初始和yangweihua/ee.txt内容一致,人为修改yangweihua/ee.txt内容,再使用命令同步rsync -avz -u  1/ yangweihua/    发现yangweihua/ee.txt 还保持原来的内容

     

    4)--delete 如果目标存在而源存在,将会将目标存在的文件删除

    考虑将-u参数、--existing参数以及--delete参数放在一起比较,这三个参数都是和 源以及目标文件相关联,其中-u--existing参数与源目标同名文件关联。--delete参数则表示目标存在源中没有的文件时就会在同步时删除目标中的这些文件。

     

    5)-d参数 只复制目录结构,不复制目录下的文件

    rsync -d -v /var/lib yangweihua  

    rsync -d -v /var/lib/ yangweihua

    以上/var/lib后不加/ 表示将/var/lib目录自己给复制到 yangweihua目录下,即复制空/var/lib目录(即使/var/lib下有别的子目录)

    以上/var/lib后加/ 表示将/var/lib/目录下的目录层级都给复制到 yangweihua目录下

    rsync -avz -d -v /var/lib/ yangweihua  -a-d参数同时使用 ,发现-a参数会将-d参数压制下去,也即会递归复制。

     

    6)--progress 表明处理进度 注意和-v参数区别(-v参数输出处理的详细过程)

     

    7)-e 指定shell  -e ssh 或者-e ssh” 或者 -e ssh -p 40022

     

    8)-z 压缩

     

    9)-i参数表示输出源目录与目标目录之间文件差异的详细情况。

     

    10)--maxsize=’1000k’

     

    11

    --include “p*” --exclude “*”

     

    12)-W参数 表示整个文件,参看man,加快传输

     

    13)--link-dest增量备份的基准目录

    #!/bin/bash

     

    # A script to perform incremental backups using rsync

     

    set -o errexit

    set -o nounset

    set -o pipefail

     

    readonly SOURCE_DIR="${HOME}"

    readonly BACKUP_DIR="/mnt/data/backups"

    readonly DATETIME="$(date '+%Y-%m-%d_%H:%M:%S')"

    readonly BACKUP_PATH="${BACKUP_DIR}/${DATETIME}"

    readonly LATEST_LINK="${BACKUP_DIR}/latest"

     

    mkdir -p "${BACKUP_DIR}"

     

    rsync -av --delete

      "${SOURCE_DIR}/"

      --link-dest "${LATEST_LINK}"

      --exclude=".cache"

      "${BACKUP_PATH}"

     

    rm -rf "${LATEST_LINK}"

    ln -s "${BACKUP_PATH}" "${LATEST_LINK}"

     

    上面脚本中,每一次同步都会生成一个新目录${BACKUP_DIR}/${DATETIME},并将软链接${BACKUP_DIR}/latest指向这个目录。下一次备份时,就将${BACKUP_DIR}/latest作为基准目录,生成新的备份目录。最后,再将软链接${BACKUP_DIR}/latest指向新的备份目录。

    解释下上面的意思:第1次通过source生成dest,然后针对dest软连接到link。第23..x次就先对比linksource的变动,将变动同步到dest,然后再次将dest的软连接创建为link

     

    14)--remove-source-files

    source传输到dest后,删掉source,所谓卸磨杀驴

     

    -l 是链接文件,意思是拷贝链接文件;-p 表示保持文件原有权限;-t 保持文件原有时间;-g 保持文件原有用户组;-o 保持文件原有属主;-D 相当于块设备文件;

    -P 传输进度;

    password-file=/password/path/file来指定密码文件,这样就可以在脚本中使用而无需交互式地输入验证密码了,这里需要注意的是这份密码文件权限属性要设得只有属主可读。

    -R  只同步文件本身

     

    二、daemon方式启动

    pve5上启动daemon方式如下:

     

     注意/etc/web.passwd 内容为echo ‘ywh:2020’ >/etc/web.passwd &&chmod 600 /etc/web.passwd

    systemctl start rsync

    mkdir /root/test/weihua

    touch /root/test/{1,2,3}

     

    使用rsync协议同步到centos7中的/test2020,centos7客户端,pve5为服务端

    centos7上操作:

     

     或者rsync 100.72.139.1::

     rsync -avz -P ywh@100.72.139.1::web1 /test2020或者rsync -avz -P ywh@100.72.139.1::web1/ /test2020(这里的/加上与否效果一样) 注意ywh是用户名如下:

     

     尝试--delete

     接着上面,这回是从centos7把数据(作为数据源)推到pve 5 100.72.139.1上(配置为了rsyncd),如下:

    rsync -avz -P examples/ ywh@100.72.139.1::web1  --delete

     

     列出以上推上的文件,如下:

    rsync -ir ywh@100.72.139.1::web1 |less 如下:

     

     此外还可以根据需求加上--exclude=”*.txt”来选择性的 同步文件

    对以上同步需要输入密码不便于在shell中使用,可以在如下操作:

    echo ‘2020’ >/tmp/secrets

    chmod 600 /tmp/secrets

    rsync 加入--password_file=’/tmp/secrets’ 的方式来免登录

    然后在crondrsync -avz -P --delete --password_file=/tmp/secrets  examples/  ywh@100.72.139.1::web1

     

    三、结合inotify-tools 实现实时同步

    在手动使用或者在crond中使用rsync命令时只能实现手动同步的效果,如果实现实时同步内,需要用到inotify-tools

     

    数据实时同步以及双同步

    环境:Rsync + Inotify-tools

    1inotify-tools

    是为linuxinotify文件监控工具提供的一套c的开发接口库函数,同时还提供了一系列的命令行工具,这些工具可以用来监控文件系统的事件

    inotify-tools是用c编写的,除了要求内核支持 inotify 外,不依赖于其他

    inotify-tools提供两种工具:一是inotifywait,它是用来监控文件或目录的变化,二是inotifywatch,它是用来统计文件系统访问的次数

    2、安装inotify-tools

    下载地址:http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz

    # yum install y gcc --安装依赖

    # mkdir /usr/local/inotify

    # tar -xf inotify-tools-3.14.tar.gz

    # cd inotify-tools-3.14

    # ./configure --prefix=/usr/local/inotify/

    # make && make install

     

    也可以通过apt-get install直接安装,此时不用设置下面的环境变量

     

    3、设置环境变量

    # vim /root/.bash_profile

    export PATH=/usr/local/inotify/bin/:$PATH

    # source /root/.bash_profile

    # echo '/usr/local/inotify/lib' >> /etc/ld.so.conf --加载库文件

    # ldconfig

    # ln -s /usr/local/inotify/include /usr/include/inotify

     

    4、常用参数

    -m --始终保持监听状态,默认触发事件即退出

    -r --递归查询目录

    -q --打印出监控事件

    -e --定义监控的事件,可用参数: access --访问文件 modify --修改文件 attrib --属性变更 open --打开文件 delete --删除文件 create --新建文件 move --文件移动

    --fromfile --从文件读取需要监视的文件或者排除的文件,一个文件一行,排除的文件以@开头

    --timefmt --时间格式

    --format --输出格式

    --exclude --正则匹配需要排除的文件,大小写敏感

    --excludei --正则匹配需要排除的文件,忽略大小写

    %y%m%d %H%M --年月日时钟 %T%w%f%e --时间路径文件名状态

     

     

    5、测试一

    检测源目录中是否有如下动作:modify,create,move,delete,attrib;一旦发生则发布至目标机器;方式为 ssh

    src: 192.168.22.11(Rsync + Inotify-tools) dest: 192.168.22.12

    两台机器需要做好 ssh 免密登录

    # mdkir /data/test/dest/ --dest机器

    # mdkir /data/test/src/ --src机器

    # rsync -av --delete /data/test/src/ 192.168.22.12:/data/test/dest --测试下命令

    # vim /data/test/test.sh

    #!/bin/bash

    /usr/local/inotify/bin/inotifywait -mrq -e modify,create,move,delete,attrib /data/test/src | while read events

    do

    rsync -a --delete /data/test/src/ 192.168.22.12:/data/test/dest

    echo "`date +'%F %T'` 出现事件:$events" >> /tmp/rsync.log 2>&1

    done

    # chmod 755 /data/test/test.sh

    # /data/test/test.sh &

    # echo '/data/test/test.sh &' >> /etc/rc.local --设置开机自启

    *******我们可以在目标机上也写一个这样的脚本: rsync -a --delete /data/test/dest/ 192.168.22.11:/data/test/src ;这样可以实现双向同步

     

     

    四、rsync实际使用场景

    实施备份的两种情况:
    1)需保留备份历史归档:在备份时保留历史的备份归档,是为了在系统出现错误后能恢复到从前正确的状态。这可以使用完全备份和增量备份来完成。
    可以使用 tar 命令保存归档文件。
    为了提高备份效率,也可以使用 rsync 结合 tar 来完成。

    2)无需保留备份历史归档:若无需从历史备份恢复到正确状态,则只备份系统最“新鲜”的状态即可。这可以简单地使用 rsync 同步来完成。此时通常称为镜像。镜像可以分为两种:
    被镜像的目录在各个主机上保持相同的位置。此时一般是为了实施负载均衡而对多个主机进行同步镜像。例如:将主机 A 的 /srv/www 目录同步到主机 B 的 /srv/www 目录等。
    被镜像的目录在各个主机上不保持相同的位置。例如:主机 A 和主机 B 都运行着各自的业务,同时又互为镜像备份。此时主机 A 的 /srv/www 目录同步到主机 B 的 /backups/hosta/www 目录;主机 B 的 /srv/www 目录同步到主机 A 的 /backups/hostb/www 目录等。

    rsync -e ‘ssh’ -av /root/ywh  root@192.168.44.248:/root

     

    调整ssh配置文件,可以关闭ssh访问时提示信息的出现,加快访问速度

    #vim /etc/ssh/ssh_config 把下面两行注释去掉
    GSSAPIAuthentication no
    GSSAPITrustDNS no

     4.1linuxlinux

    ①、单linux主机的2个不同的目录之间

     

    ②、双linux之间同步

     

    4.2linuxwindows之间

     

    4.3windowswindows之间同步

    在 windows 平台下也有相应的版本,如 cwrsync (分server和client’端)和DeltaCopy,   不在讨论范围内,略

     

    五、可以解决的问题

    比如可以同步图片和数据库等,rsync特点是增量备份,速度很快。

    同步网站  同步镜像

     

    六、参考

    重点查看其中的增量备份:

    https://www.ruanyifeng.com/blog/2020/08/rsync.html

  • 相关阅读:
    SpringMvc最全的约束——你的感冒清个人总结
    spring配置文件比较全的约束
    android 发送邮件--实现 send email for android
    android异常 More than one file was found with OS independent path 'META-INF/XXX'
    android异常 More than one file was found with OS independent path 'META-INF/XXX'
    Error:(949) Multiple substitutions specified in non-positional format; Android格式化string.xml
    Android 设置ImageView全屏
    Android 设置ImageView全屏
    git的使用之eclipse Hbuilder
    git的使用之eclipse Hbuilder
  • 原文地址:https://www.cnblogs.com/weihua2020/p/13731708.html
Copyright © 2011-2022 走看看