rsync

rsync 通过ssh 协议 对远端主机进行客户端的复制

rsync 和scp sftp 的不同 可是实现增量的更新

我有两个服务器

一个服务器有多个文件  其中一个有一部分文件

如果我想复制的时候 我想把这个目录同步到另一个服务器上去

如果用命令的话 scp也好  sftp 也好

最终 是把这个目录里的东西完整的copy 一份过来

本地的要么覆盖 要么跳过 一般都是覆盖

每次都做这种工作 他的工作量就非常大

数据量很大

如果用rsync 的话 他会看一下那些文件是已经有的

一样的就不复制了  把不一样的复制过来

哪怕是其中一个文件的  没有会下载

如果内容不同  权限不一样 他也会实现下载

rsync 可以实现增量更新   避免重复性的备份下载传输

生产环境下 服务器 在进行同步备份的时候 用的很多

开始操作:

实现rsync 有两种方式

1 服务端运行的ssh服务 客户端执行rsync 命令 就可以实现rsync同步了

更多的针对客户端说的

2 不同ssh  我服务器端去安装rysnc  软件  装完以后去更改他的配置文件

实现服务端的配置  客户端任然使用rsync 我这次找的时候不去找ssh啦

去找rsync 同样可以实现 rsync 远程同步  rsync 命令是一样的 服务器端

服务程序不一样

去找ssh的我们称为ssh源

去找服务器端的rsync程序 我们称为rsync 源

服务端运行中的两种程序都可以实现 rsync 命令的上传下载工作

ssh 不用做任何配置 直接执行ssh 命令就可以了

rsync 源需要配置rsync 命令装包 去修改配置文件做相关的修改 权限设置

最后rsync 客户端才能用 麻烦 但是好处多 安全

rsync远程同步_rsync

rsync 命令用法
rsync [选项] 原始位置 目标位置
如果原始位置是本地 目标位置是远端那就是个上传动作
如果原始位置是远端 目标位置是本地 那就是个下载工作
常用选项
-a :归档模式,递归并保留对象属性,等同于-rlptgoD
-v :显示同步过程的详细(verbose)信息
-z :在传输文件时进行压缩(compress)
-H :保留硬连接文件
-A :保留ACL属性信息
--delete :删除目标位置有而原始位置没有的文件
--checksum :根据对象的校验和来界定是否跳过文件
-rlptgoD={
-r :递归模式,包含目录及子目录中所有文件
-l :对于富豪链接文件任然复制为符号链接文件
-p :保留文件权限标记
-t :保留文件的时间标记
-g :保留文件属组标记 (仅超级用户使用)
-o :保留文件的属主标记 (仅超级用户使用)
-D :保留设备文件及其他特殊文件
}

开始操作

准备两台主机

rsync远程同步_rsync_02

rpm -q rsync

查看客户端有没有 rsync 包

这是个很基础的包 一般都有

在服务端创建点东西

比如

mkdir /dir1

生成点文件

rsync远程同步_rsync_03

我想让 服务端的 /dir1 里面的文件同步到客户端来

比如同步到客户端的/opt下

rsync -azv 10.1.0.1:/dir1/ /opt

rsync远程同步_rsync_04

我们再从 服务端 /dir/ 里面创建点文件

touch /dir1/a b c

然后再从客户端输入命令

rsync -azv 10.1.0.1:/dir1/ /opt

rsync远程同步_rsync_05

就会发现 增量更新了

再从客户端上/opt 里面创建几个文件

touch /opt/file1 file2 file3

注意! 这三个文件 服务器是没有的

然后加上 --delete

rsync --delete -azv 10.1.0.1:/dir1/ /opt

就会发现 会删除掉再客户端有而 服务端没有的文件

注意:

在同步的时候  /dir1 和/dir1/ 是不一样的

/dir1/ 是把/dir1/里面的文件同步过来

而/dir1 是把/dir1 这个目录同步过来

rsync 不光可以下载 还可以上传

rsync -azv /opt/ 10.1.0.1: /dir1/

这是将 本地的/opt/里面的文件 上传到 10.1.0.1主机 /dir1/目录里面

如果我们频繁的同步 我们把他设置计划任务里面

让他自动同步

但是有个问题  我们每次使用rsync 的时候 都需要输入密码 才可以

我们得需要做一个免密登录

生成密钥对

并把公钥传到对应主机上去

ssh-keygen

生成密钥对

ssh-copy-id 10.1.0.1

把本地的公钥传到 10.1.0.1 主机上去

这样就可以免密登录了

做计划任务的时候 需要输入命令的路径 先试用which 查询下命令的路径

which rsync

rsync远程同步_rsync_06

crontab -e
0 * * * * /usr/bin/rsync -arv 10.1.0.1:/dir1/ /opt

每小时  下载远端主机10.1.0.1 /dir1 下的文件到本地/opt 下

0 * * * * /usr/bin/rsync -arv /opt/ 10.1.0.1:/dir1/

每小时 上传本地/opt/ 下的文件 到远端主机10.1.0.1 的/dir1上

以上是定时任务

我们需要做一个 实时同步

我这一有变化 我就上传到服务器主机

Linux内核的inotify机制

对文件本地的文件系统 进行监控 可以监控目录 可以监控文件

一旦发出变化就发出提醒

我们利用他的提醒 来写个脚本触发 rsync命令 让他去同步

这样就达到了实时同步的效果

内核功能有了 如果去设置 去监控那些文件的变化  需要去装一个包

inotify-tools

包在 centos包里

如果监控的文件特别多 就需要去更改 inotify 内核 参数

vim /etc/sysctl.conf

rsync远程同步_rsync_07

把包传过去 解包进去

./configure && make && make install

直接配置编译安装

安装完后可以直接使用

命令

inotifywait 用于持续监控  实时输出效果  

inotifywatch 用于短期监控弄个任务完成后再出结果

initifywait -mrq -e modify,create,move,delete,attrib 完成目录

-m 持续进行监控

-r 递归监控所有子对象

-q 简化输出信息

-e 指定要监控的那些时间类型

这个只能监控本地 端的  如果想监控远端主机 那么就得从远端主机上安装这个应用

并且 远端主机 被监控目录出现改变 同步到 本地来

现在我们是监控本地的某个目录 如果出现变化 让他同步到远端主机

inotifywait -mrq -e create,delete,move,modify,attrib /opt&

监控 本机的/opt/目录如果出现 创建 删除 改变文件权限 &是放到后台运行

开启后 这时候如果我们在opt目录下 做任何操作都会 返回给我们屏幕

rsync远程同步_rsync_08

比如上图

这时候我们利用 他的监控 会对屏幕进行输出

我们写一个脚本

mkdir /script

vim /script/rsync-inotify.sh
#!/bin/bash
inotify_cmd="inotifywait -mrq -e create,delete,move,modify,attrib /opt"
rsync_cmd="rsync -az --delete /opt/ 10.1.0.1:/dir1/"
$inotify_cmd | while read a b c
do
        $rsync_cmd
done

解释:inotify_cmd 和rsync_cmd 是定义两串命令

$inotify_cmd | while read a b c

是 执行 inotify_cmd 这个命令 执行过程中如果有输出就输出给 | 后面read 这个命令

给 a b c 赋值

inotifywait输出正好是三列  正好是 输出 可以给 a b c

rsync远程同步_rsync_09

read 监控的目录有变化才会输出内容

才会给read a b c  赋值  

如果赋值成功就 引用这个变量$rsync_cmd他的变量是条命令

while do done  是个循环  会一直 再循环

chmod +x /script/rsync-inotify.sh
sh /script/rsync-inotify.sh &

让这个脚本后台运行

这时候 在本地的/opt 目录做任何东西

都会同步到 远端主机 /dir1 上去