• Rsync+Inotify 实现数据同步


    Rsync (remote sync)是UNIX及类UNIX-Like平台下一款强大的数据镜像备份软件,它不像FTP或其他文件传输服务那样需要进行全备份,Rsync 可以根据数据的变化进行差异备份,从而减少数据流量,提高工作效率.你可以使用它进行本地数据或远程数据的复制,Rsync可以使用 SSH 安全隧道进行加密数据传输,Rsync 服务器端定义源数据,Rsync客户端仅在源数据发生改变后才会从服务器上实际复制数据至本地,如果源数据在服务器端被删除,则客户端数据也会被删除,以确保主机之间的数据是同步的.Rsync 使用 TCP-873 端口.


    ♥ 文章声明 ♥
    该系列文章部分文字描述,整理于以下文献,化繁为简.
    《鸟哥的Linux私房菜 (基础学习篇 第三版)》 - 作者:鸟哥
    《Linux就该这么学》 - 作者:刘遄
    《linux运维之道》- 作者:丁明一


    Inotify 是一个Linux特性,它监控文件系统操作,比如读取、写入和创建 Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多,本章学习如何将 inotify 集成到您的应用程序中,并发现一组可用来进一步自动化系统治理的命令行工具.



    Rsync 文件同步

    ◆Rsync服务端配置◆

    1.服务端首先安装Rsync软件包,并创建一个/common目录拷贝进去一些配置文件用于测试.

    [root@localhost ~]# yum install -y rsync
    [root@localhost ~]# mkdir -p /common
    [root@localhost ~]# cp -a /etc/* /common
    

    2.编辑Rsync的主配置文件覆盖写入以下内容,这里指定了我们需要共享的文件与目录.

    [root@localhost ~]# vim /etc/rsyncd.conf
    
    use chroot=yes                        #禁锢用户主目录
    address=127.0.0.1                     #指定本机的IP地址
    port=873                              #指定默认端口
    log file=/var/log/rsync.log           #指定日志文件保存位置
    pid file=/var/syncd.pid               #指定PID文件保存位置
    
    [pub]                                 #声明目录名(也就是下面的共享名)
    comment=hello lyshark                 #说明信息
    path=/common                          #要同步的目录
    read only=yes                         #只读
    dont compress=*.gz *.tgz *.bz2        #指定这些文件不压缩
    auth users=lyshark                    #使用sync的用户名密码
    secrets file=/etc/rsyncd_users.db     #存放虚拟用户的密码文件
    

    3.创建密码文件,在上面的配置中我们指定了密码配置文件位置为/etc/rsyncd_users.db,编辑这个配置文件并写入以下内容.

    [root@localhost ~]# vim /etc/rsyncd_users.db
    
    lyshark:123123   #格式:用户名:密码
    admin:123123
    

    4.给服务端密码文件给予最低运行权限,并开启rsync守护进程.

    [root@localhost ~]# chmod 600 /etc/rsyncd_users.db              #给予权限,保证安全
    [root@localhost ~]# rsync --daemon                              #开启服务
    [root@localhost ~]# netstat -antp |grep ":873"                  #查看端口,是否开启成功
    

    ◆Rsync客户端配置◆

    1.首先我们应该创建客户接收位置,用于接收传输文件,这里我就和服务器保持一致了.

    [root@localhost ~]# mkdir -p /common
    

    2.声明一个全局变量,Rsync验证时先搜索变量在输入密码,这里将其写入配置文件实现开机自启动.

    [root@localhost ~]# export  RSYNC_PASSWORD=123123                         #设置验证密码
    [root@localhost ~]# echo "export  RSYNC_PASSWORD=123123" >> /etc/profile  #写入配置文件
    

    3.上面的步骤全部完成以后我们就可以使用一下命令进行验证同步了.

    [root@localhost ~]# rsync -avz 虚拟用户名@IP地址::共享名 数据保存位置                   #从服务器同步到本机
    [root@localhost ~]# rsync -avz --delete 虚拟用户名@服务器IP地址::共享名 数据保存位置    #从服务器同步到本机并且完全与服务器保持数据一致
    
    [root@localhost ~]# rsync -avz 本地文件 root@服务器IP:/保存位置                        #把我的文件发送给对方
    [root@localhost ~]# rsync -avz root@服务器IP:/对方文件位置 /保存位置                   #把对方的文件下载给我
    [root@localhost ~]# rsync -avz lyshark@192.168.1.12::pub /client/rsync
    

    每次同步数据都需要手动输入命令是非常麻烦的一件事,作为一名运维人员,我们需要更智能化的处理机制,这可以考虑使用Shell脚本来解决这样的问题,下面的这个rsync_back.sh脚本可以实现数据的同步任务,我们可以将他加入到计划任务里实现自动同步数据之用.

    #!/bin/bash
    
    export RSYNC_PASSWORD=123123
    src=common
    dest=/common
    server=192.168.1.10
    user=lyshark
    
    [! -d $dest ] && mkdir $dest
    rsync -avz --delete ${user}@${server}::$src $dest/${date +%Y%m%d}
    

    Rsync+Inotify 双向同步

    Rsync+Inotify可实现一台服务器数据更新另一台马上同步,实现基础的单向热备份这里有个,前置条件主服务器对从服务器建立SSH密钥对验证,并且下面的几个步骤主从服务器都需要做一遍.

    1.下载Inotify工具,并编译安装inotify-tools

    [root@localhost ~]# wget https://jaist.dl.sourceforge.net/project/inotify-tools/inotify-tools/3.13/inotify-tools-3.13.tar.gz
    [root@localhost ~]# tar -xzvf inotify-tools-3.13.tar.gz
    [root@localhost ~]# cd inotify-tools-3.13/
    [root@localhost ~]# ./configure
    [root@localhost ~]# make && make install
    

    2.优化内核参数(可选)

    [root@localhost ~]# vim /etc/sysctl.conf
    
    fs.inotify.max_queued_events = 16384
    fs.inotify.max_user_instances = 1024
    fs.inotify.max_user_watches = 1048576
    
    [root@localhost ~]# sysctl -p
    

    3开启监控模块(测试)

    [root@localhost ~]# inotifywait -mrq -e create,delete /tmp       #tmp为被监控目录
    

    4.监控脚本,实现如果服务端数据更新,自动使用Rsync命令同步数据到客户端

    #!/bin/bash
    
    date="inotifywait -mrq -e create,delete /本地目录"
    sync="rsync -avz --delete /本地目录/ 对方用户名@对方IP:/同步到对方哪个目录"
    
    $date | while read DIRECTORY EVENIS FILE
    do
            $sync
    done
    

    Unison+Inotify 实时双向同步

    Unison+Inotify可以实现,无论客户端还是服务器,只有发生变化全部进行同步,前置条件,两台服务器必须互相建立SSH密钥对验证,其次服务器和客户端必须同时安装以下软件,做相同的配置。

    1.安装Inotify

    [root@localhost ~]# wget https://jaist.dl.sourceforge.net/project/inotify-tools/inotify-tools/3.13/inotify-tools-3.13.tar.gz
    [root@localhost ~]# tar -xzvf inotify-tools-3.13.tar.gz
    [root@localhost ~]# cd inotify-tools-3.13/
    [root@localhost ~]# ./configure
    [root@localhost ~]# make && make install
    

    2.配置内核优化

    [root@localhost ~]# vim /etc/sysctl.conf
    
    fs.inotify.max_queued_events = 16384
    fs.inotify.max_user_instances = 1024
    fs.inotify.max_user_watches = 1048576
    
    [root@localhost ~]# sysctl -p
    

    3.安装Unison

    a)安装依赖

    [root@localhost ~]# wget http://caml.inria.fr/pub/distrib/ocaml-4.06/ocaml-4.06.0.tar.gz
    [root@localhost ~]# tar -xzvf ocaml-4.06.0.tar.gz
    [root@localhost ~]# cd ocaml-4.06.0/
    [root@localhost ~]# ./configure
    [root@localhost ~]# make  world opt && make  install
    

    b)安装Unison

    [root@localhost ~]# wget https://codeload.github.com/bcpierce00/unison/tar.gz/v2.51.2
    [root@localhost ~]# tar -xzvf unison-2.51.2.tar.gz
    [root@localhost ~]# cd unison-2.51.2/
    [root@localhost ~]# make UISTYLE=text THREADS=true static=true
    [root@localhost ~]# cp -a src/unison /usr/local/bin/						#只需要此主程序
    [root@localhost ~]# chmod 755 /usr/local/bin/unison							#赋予执行权限
    

    3.服务器和客户端同时运行脚本

    #!/bin/bash
    
    date="inotifywait -mrq -e create,delete /本地目录"
    sync="/usr/local/bin/unison -batch /本地目录/ ssh://root@远程同步IP//同步到远程目录"
    
    $date | while read DIRECTORY EVENIS FILE
    do
            $sync
    done
    

    版权声明: 本博客,文章与代码均为学习时整理的笔记,博客中除去明确标注有参考文献的文章,其他文章【均为原创】作品,转载请务必【添加出处】,您添加出处是我创作的动力!

    警告:如果您恶意转载本人文章,则您的整站文章,将会变为我的原创作品,请相互尊重!
  • 相关阅读:
    20160729noip模拟赛zld
    20160728noip模拟赛zld
    20160727noip模拟赛zld
    20160725noip模拟赛“Paodekuai” alexandrali
    20160723数据结构节alexandrali
    20160722noip模拟赛alexandrali
    洛谷 [P2594] 染色游戏
    洛谷 [P3480] KAM-Pebbles
    UVA 1378 A Funny Stone Game
    SPOJ 4060 A game with probability
  • 原文地址:https://www.cnblogs.com/LyShark/p/11827453.html
Copyright © 2020-2023  润新知