配置rsync+ inotify 实现实时同步
    同步项目实战之rsync篇
    1.多种备份方式的介绍
    2.rsync实现目录备份
    3.配置企业级无交互备份实战
    4.配置rsync企业服务器实现实时同步
备份方式;
        完整备份
 

wKioL1h92dfh4EZOAAAhUB6dpUo843.png-wh_50

    rsync 远程同步: rsync(Remote sync)  ==> 做数据备份
rsync 客户端好处:
优点:支持增量备份
       选择性保存:符号链接,硬链接,文件属性,权限及时间等不变。
       传输的执行压缩,适用于异地备份,镜像服务器等应用。
官网:技术留言,官方文档。社区庞大。
        http://rsync.samba.org
首先认识同步数据的方式:
    推:一台主机负责把数据传给其它主机,服务器开销大,适合后端服务较少。
    拉:所有主机定时去找一主机拉数据,可能会导致数据同步缓慢,好处,节省服务器开销。
        交互式  :需要用户名和密码
     无交互式:  不需要密码的输入
优化 sshd:  #vim /etc/ssh/sshd_config   下面编辑   UseDNS no       GSSAPIAuthentication no
**********************
通常情况下我们在连接 OpenSSH服务器的时候假如 UseDNS选项是打开的话,服务器会先根据客户端的 IP地址进行 DNS PTR反向查询出客户端的主机名,然后根据查询出的客户端主机名进行DNS正向A记录查询,并验证是否与原始 IP地址一致,通过此种措施来防止客户端欺骗。平时我们都是动态 IP不会有PTR记录,所以打开此选项也没有太多作用。我们可以通过关闭此功能来提高连接 OpenSSH 服务器的速度。*******

***GSSAPI是公共安全事务应用程序接口(GSS-API)
公共安全事务应用程序接口以一种统一的模式为使用者提供安全事务,由于它支持最基本的机制和技术,所以保证不同的应用环境下的可移植性.
该规范定义了GSS-API事务和基本元素,并独立于基本的机制和程序设计语言环境,并借助于其它相关的文档规范实现。
        如果我们在服务端打开GSSAPIAuthentication配置项  
        在客户端登录服务端会用gssapi-keyex,gssapi-with-mic进行身份校验
        (前提是服务器和客户端都开启这个功能)
**************************   
sshd 的配置
    生成密钥对: ssh-keygen
    查看密钥对: /root/.ssh/   这个目录下
    拷贝密钥: ssh-copy-id root@ip
密钥的操作详细过程:
    如果你的系统里面安装了ssh
    [root@www ~]# ssh (连续敲击2次tab 可以实现命令搜索(一般用于命令补全)
    ssh     ssh-add      ssh-agent    ssh-copy-id  sshd         ssh-keygen   ssh-keyscan
    这里我用到的命令是  ssh-keygen ==>生成密钥对    ssh-copy-id  ===>给对方发送认真密钥
    1.生成密钥:
        [root@www ~]# ssh-keygen
            Generating public/private rsa key pair.
            Enter file in which to save the key (/root/.ssh/id_rsa):
            /root/.ssh/id_rsa already exists.
            Overwrite (y/n)? y       #####这里会出现这个是因为我之前练习过。需要覆盖。
            Enter passphrase (empty for no passphrase):
            Enter same passphrase again:
            Your identification has been saved in /root/.ssh/id_rsa.
            Your public key has been saved in /root/.ssh/id_rsa.pub.
            The key fingerprint is:
            97:17:1f:7e:d9:c1:a7:71:49:e1:e7:0f:ca:f7:60:4c root@www
            The key's randomart p_w_picpath is:
            +--[ RSA 2048]----+
            |               o.|
            |              + .|
            |            . o=+|
            |           . + **|
            |        S o . E.+|
            |         . o + o.|
            |            o = .|
            |             o o |
            |                .|
            +-----------------+
    2.查看  执行情况
            [root@www ~]# ls /root/.ssh
            id_rsa  id_rsa.pub  known_hosts
            当然也可以通过这个查看
            [root@www ~]# echo $?
            0
            通过检查命令执行的返回结果查看。如果是0正常。非0,则需要好好查看排错。
    3.传递密钥,并且查看结果
        [root@www ~]# ssh-copy-id root@192.168.1.151
        root@192.168.1.151's password:
        Now try logging into the machine, with "ssh 'root@192.168.1.151'", and check in:
          .ssh/authorized_keys
        to make sure we haven't added extra keys that you weren't expecting.
        给出的信息大概意思是:试试  "ssh 'root@192.168.1.151'" 。看authorized_keys是否生效。
        看下是不是很意外:不输入密码也可以登录。

        [root@www ~]# ssh root@192.168.1.151
        Last login: Fri Jan 13 08:13:55 2017 from 192.168.1.123
        [root@jf6 ~]#
    结果:测试成功。又补习了一下ssh 的知识。
    

实战:使用rsync进行数据同步
    命令意思 参数 作用 局限性
    格式: rsync  【选项】 源文件  目标文件
    常见的选项:
        -a  --archive (存档)归档模式,表示以递归的方式传输文件,并且保持文件属相,等同于
                加了参数  - r l p t g o D             ******************
        -r  --recursive 对子目录以递归模式处理。
        -l  --link表示拷贝链接文件
        -p  --perm  表示 保持文件原有权限
        -t  --times 表示保持文件原有时间
        -g  --group 表示保持文件原有用户组
        -o  --owner 表示保持文件原有属主
        -D  --devices 表示块设备文件信息
        -z  --compress 表示压缩传输
        -H  表示硬链接文件
        -A  保留ACL属性信息
        -P  显示传输进度                                              **************
    (增量备份)    --delete  删除哪些目标位置有而原始位置没有的文件。**************
无交互备份模拟;备份 oldboy  /var/www/html 目录到 jf 的/web-back
     # rsync -azP /var/www/html  user@ip:/
操作实例:(ssh的密码交互在前面已经做好了)
        [root@www ~]# mkdir -p /var/www/html
        [root@www ~]# cp -r /boot/* /var/www/html/  (不加-r 不拷贝目录)如果不想重复输入/var/www/html(可以按esc+.重复上次命令最后参数)
        [root@www ~]# ssh 192.168.1.151
        Last login: Fri Jan 13 08:30:06 2017 from 192.168.1.123
        [root@jf6 ~]# ls /web-back
        ls: cannot access /web-back: No such file or directory
        [root@www ~]# rsync -azP --delete /var/www/html/* root@192.168.1.151:/web-back
        sending incremental file list
        created directory /web-back
        。。。。。。由于加了P 选项所以显示进度这里略去。。。。。。。
        sent 54299622 bytes  received 529 bytes  5715805.37 bytes/sec
        total size is 59172855  speedup is 1.09
        [root@www ~]# ssh root@192.168.1.151
        Last login: Fri Jan 13 08:51:58 2017 from 192.168.1.123
        [root@jf6 ~]# ls /web-back/
        config-2.6.32-504.el6.x86_64              symvers-2.6.32-504.el6.x86_64.gz
        config-2.6.32-642.11.1.el6.x86_64         symvers-2.6.32-642.11.1.el6.x86_64.gz
        efi                                       System.map-2.6.32-504.el6.x86_64
        grub                                      System.map-2.6.32-642.11.1.el6.x86_64
        initramfs-2.6.32-504.el6.x86_64.img       vmlinuz-2.6.32-504.el6.x86_64
        initramfs-2.6.32-642.11.1.el6.x86_64.img  vmlinuz-2.6.32-642.11.1.el6.x86_64
        lost+found
测试结果:实现了无交互式备份。

 
实现实时自动备份。(不用输入用户名和密码)
    步骤:
        1. 在服务器上生成密钥对
        2. 将公钥上传到目标服务器
        3. 执行备份命令 rsync 实现无交互备份
配置rsync+Inotify 实现实时同步
    Inotify概述:
        linux内核从2.6.13开始提供了Inotify通知接口,用来监控文件系统的各种变化情况,如文件存取,
        删除,移动等,利用这一机制,可以非常方便的实现文件异动告警,增量备份,并针对目录或文件
        的变化及时做出响应。
    使用rsync工具与Inotify机制相结合,可以实现触发式备份(实时同步),只要原始位置的文档发生变化,则立即启动增量备份操作,否则处于静态等待状态,这样一来,就避免了按固定周期备份而存在的延迟性,周期过密等问题。
    Inotify 下载地址:http://sourceforge.net/projects/inotify-tools/
    # make -j 4  #make编译.将源代码编译成二进制,可执行文件。-j 4使用4个进程同时编译,
    使用: inotifywait -h
    常用参数;
    -e 用来指定要监控哪些事件。
        这些事件包括 create  move delete  modify  attri
    -m  表示持续监控
    -r 表示递归整个目录
    -q 表示简化输出信息
    # inotifywait -mrq -e create,move,delete,modify /var/www/html/

创建脚本;
    #!/bin/bash
    inotifywait -mrq -e create,move,delete,modify /var/www/html |while read a b c
    do
    rsync -azP --delete /var/www/html/ root@ip:/web-back
    done
运行脚本: sh  x.sh