zoukankan      html  css  js  c++  java
  • rsync简介与rsync+inotify配置实时同步数据

    rsync简介

    rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步。

    rsync特性

    rsync支持很多特性:

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

    rsync的ssh认证协议

    rsync命令来同步系统文件之前要先登录remote主机认证,认证过程中用到的协议有2种:

    • ssh协议
    • rsync协议

    rsync server端不用启动rsync的daemon进程,只要获取remote host的用户名和密码就可以直接rsync同步文件
    rsync server端因为不用启动daemon进程,所以也不用配置文件/etc/rsyncd.conf

    ssh认证协议跟scp的原理是一样的,如果在同步过程中不想输入密码就用ssh-keygen -t rsa打通通道

    #这种方式默认是省略了 -e ssh 的,与下面等价:
    rsync -avz /SRC -e ssh root@172.16.12.129:/DEST 
        -a  文件宿主变化,时间戳不变
        -z  压缩数据传输
     
    #当遇到要修改端口的时候,我们可以:
    rsync -avz /SRC -e "ssh -p2222" root@172.16.12.129:/DEST  
    #修改了ssh 协议的端口,默认是22
    

    rsync命令

    Rsync的命令格式常用的有以下三种:

    #本地内容备份
    rsync [OPTION]... SRC DEST
    #本地备份到远程
    rsync [OPTION]... SRC [USER@]HOST:DEST
    #远程备份到本地
    rsync [OPTION]... [USER@]HOST:SRC DEST
    

    常用选项

    • -a, --archive:归档
    • -v, --verbose:啰嗦模式
    • -q, --quiet:静默模式
    • -r, --recursive:递归
    • -p, --perms:保持原有的权限属性
    • -z, --compress:在传输时压缩,节省带宽,加快传输速度
    • --delete:在源服务器上做的删除操作也会在目标服务器上同步

    rsync+inotify

    rsync与传统的cp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等。
    随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足,首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因,rsync+inotify组合出现了!

    Inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件。
    在前面有讲到,rsync可以实现触发式的文件同步,但是通过crontab守护进程方式进行触发,同步的数据和实际数据会有差异,而inotify可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync同步,这样刚好解决了同步数据的实时性问题。

    部署rsync+inotify

    需求
    把源服务器上/lynk目录实时同步到目标服务器的/tmp/下

    环境

    • 源服务器:CentOS7/RedHat7-192.168.233.144
      • rsync
      • inotify-tools
      • shell脚本
    • 目标服务器:CentOS7/RedHat7-192.168.233.129
      • rsync

    配置rsync

    源服务端

    #关闭防火墙
    [root@zelda ~]# systemctl stop firewalld
    [root@zelda ~]# systemctl disable firewalld
    Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
    Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
    #修改selinux状态
    [root@zelda ~]# setenforce 0
    [root@zelda ~]# sed -ri 's/^(SELINUX=).*/1disabled/g' /etc/sysconfig/selinux
    
    #安装rsync
    [root@zelda ~]# yum -y install rsync
    
    #创建认证密码文件
    [root@zelda ~]# echo '12345' > /etc/rsync.pass
    [root@zelda ~]# chmod 600 /etc/rsync.pass
    
    #创建目录进行测试
    [root@zelda ~]# mkdir -pv /etc/test
    [root@zelda ~]# rsync -avH --port 873 --progress --delete /etc/ zelda@192.168.233.129::etc_from_client --password-file=/etc/rsync.pass
    

    配置inotify与脚本

    #检查服务器内核是否支持inotify
    [root@zelda ~]# ll /proc/sys/fs/inotify/
    总用量 0
    -rw-r--r--. 1 root root 0 2月  19 15:25 max_queued_events
    -rw-r--r--. 1 root root 0 2月  19 15:25 max_user_instances
    -rw-r--r--. 1 root root 0 2月  19 15:25 max_user_watches
    #有如上三个文件代表支持
    
    #安装inotify-tools
    [root@zelda ~]# yum -y install epel-release
    [root@zelda ~]# yum -y install make gcc gcc-c++
    [root@zelda ~]# yum -y install inotify-tools
    
    #编写同步脚本
    [root@zelda ~]# vim /scripts/inotify.sh
    

    下面是我用的脚本,不想自己写的可以直接拿来用

    #!/bin/bash
    #目标服务器的ip(目标服务器)
    host=192.168.233.129
    #在源服务器上所要监控的备份目录(此处可以自定义,但是要保证存在)
    src=/etc
    #自定义的模块名,需要与目标服务器上定义的同步名称一致
    des=etc_from_client
    #执行数据同步的密码文件
    password=/etc/rsync.pass
    #执行数据同步的用户名
    user=zelda
    inotifywait=/usr/bin/inotifywait
    
    $inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src | while read files ;do
        rsync -avzP --delete  --timeout=100 --password-file=${password} $src $user@$host::$des
        echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
    done
    
    [root@zelda ~]# chmod 755 /scripts/inotify.sh
    #令脚本在后台运行
    [root@zelda ~]# nohup bash /scripts/inotify.sh &
    [1] 11431
    [root@zelda ~]# nohup: 忽略输入并把输出追加到"nohup.out"
    

    目标服务器

    #关闭防火墙
    [root@lynk ~]# systemctl stop firewalld
    [root@lynk ~]# systemctl disable firewalld
    Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
    Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
    #修改selinux状态
    [root@lynk ~]# setenforce 0
    [root@lynk ~]# sed -ri 's/^(SELINUX=).*/1disabled/g' /etc/sysconfig/selinux
    
    #安装rsync
    [root@lynk ~]# yum -y install rsync
    
    #修改配置文件
    [root@lynk ~]# vim /etc/rsyncd.conf 
    #在最后添加如下内容:
    
    #日志文件位置,启动rsync后自动产生这个文件,无需提前创建
    log file = /var/log/rsyncd.log
    #pid文件的存放位置
    pidfile = /var/run/rsyncd.pid
    #支持max connections参数的锁文件
    lock file = /var/run/rsync.lock
    #用户认证配置文件,里面保存用户名称和密码,必须手动创建这个文件
    secrets file = /etc/rsync.pass
    
    #自定义同步名称
    [etc_from_client]
    #rsync服务端数据存放路径,客户端的数据将同步至此目录
    path = /lynk/
    comment = sync etc from client
    #设置rsync运行权限为root
    uid = root
    #设置rsync运行权限为root
    gid = root
    #默认端口
    port = 873
    #表示出现错误忽略错误
    ignore errors
    #默认为true,修改为no,增加对目录文件软连接的备份
    use chroot = no
    #设置rsync服务端为读写权限
    read only = no
    #不显示rsync服务端资源列表
    list = no
    #最大连接数
    max connections = 200
    #设置超时时间
    timeout = 600
    执行数据同步的用户名,可以设置多个,用英文状态下逗号隔开
    auth users = zelda
    #允许进行数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开
    hosts allow = 172.16.12.144
    #禁止数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开
    hosts deny = 192.168.1.1
    
    #创建用户认证文件
    [root@lynk ~]# echo 'zelda:12345' > /etc/rsync.pass
    [root@lynk ~]# chmod 600 /etc/rsync.pass
    
    #启动服务并确认
    [root@lynk ~]# systemctl start rsyncd
    [root@lynk ~]# systemctl enable rsyncd
    Created symlink from /etc/systemd/system/multi-user.target.wants/rsyncd.service to /usr/lib/systemd/system/rsyncd.service.
    [root@lynk ~]# ss -antl
    State       Recv-Q Send-Q        Local Address:Port                       Peer Address:Port              
    LISTEN      0      128                       *:22                                    *:*                  
    LISTEN      0      100               127.0.0.1:25                                    *:*                  
    LISTEN      0      5                         *:873                                   *:*                  
    LISTEN      0      128                      :::22                                   :::*                  
    LISTEN      0      100                     ::1:25                                   :::*                  
    LISTEN      0      5                        :::873                                  :::*           
    
    #测试
    [root@zelda ~]# touch /etc/aa
    [root@zelda ~]# tail /tmp/rsync.log 
    20190219 16:07 /etc/aaCREATE was rsynced
    20190219 16:07 /etc/aaATTRIB was rsynced
    #可以看到log里显示进行了同步
    
    #设置脚本开机启动
    [root@zelda ~]# chmod +x /etc/rc.d/rc.local
    [root@zelda ~]# echo 'nohup /bin/bash /scripts/inotify.sh' >> /etc/rc.d/rc.local
    [root@zelda ~]# tail /etc/rc.d/rc.local
    # to run scripts during boot instead of using this file.
    #
    # In contrast to previous versions due to parallel execution during boot
    # this script will NOT be run after all other services.
    #
    # Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
    # that this script will be executed during boot.
    
    touch /var/lock/subsys/local
    nohup /bin/bash /scripts/inotify.sh
    
    #在目标服务器上验证是否复制
    [root@lynk ~]# ll /lynk/etc |grep aa
    -rw-r--r--.  1 root root        0 2月  19 16:07 aa
    
    
  • 相关阅读:
    POJ 3970(最小公倍数LCM)
    06005_Jedis入门
    雷林鹏分享:C# 字符串(String)
    雷林鹏分享:C# 类(Class)
    雷林鹏分享:C# 枚举(Enum)
    雷林鹏分享:C# 运算符重载
    雷林鹏分享:C# 多态性
    雷林鹏分享:C# 命名空间(Namespace)
    雷林鹏分享:C# 接口(Interface)
    雷林鹏分享:C# 正则表达式
  • 原文地址:https://www.cnblogs.com/lynk/p/10401767.html
Copyright © 2011-2022 走看看