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 [选项] 原始位置 目标位置
如果原始位置是本地 目标位置是远端那就是个上传动作
如果原始位置是远端 目标位置是本地 那就是个下载工作
常用选项
-a :归档模式,递归并保留对象属性,等同于-rlptgoD
-v :显示同步过程的详细(verbose)信息
-z :在传输文件时进行压缩(compress)
-H :保留硬连接文件
-A :保留ACL属性信息
--delete :删除目标位置有而原始位置没有的文件
--checksum :根据对象的校验和来界定是否跳过文件
-rlptgoD={
-r :递归模式,包含目录及子目录中所有文件
-l :对于富豪链接文件任然复制为符号链接文件
-p :保留文件权限标记
-t :保留文件的时间标记
-g :保留文件属组标记 (仅超级用户使用)
-o :保留文件的属主标记 (仅超级用户使用)
-D :保留设备文件及其他特殊文件
}
开始操作
准备两台主机
rpm -q rsync
查看客户端有没有 rsync 包
这是个很基础的包 一般都有
在服务端创建点东西
比如
mkdir /dir1
生成点文件
我想让 服务端的 /dir1 里面的文件同步到客户端来
比如同步到客户端的/opt下
rsync -azv 10.1.0.1:/dir1/ /opt
我们再从 服务端 /dir/ 里面创建点文件
touch /dir1/a b c
然后再从客户端输入命令
rsync -azv 10.1.0.1:/dir1/ /opt
就会发现 增量更新了
再从客户端上/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
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
把包传过去 解包进去
./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目录下 做任何操作都会 返回给我们屏幕
比如上图
这时候我们利用 他的监控 会对屏幕进行输出
我们写一个脚本
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
read 监控的目录有变化才会输出内容
才会给read a b c 赋值
如果赋值成功就 引用这个变量$rsync_cmd他的变量是条命令
while do done 是个循环 会一直 再循环
chmod +x /script/rsync-inotify.sh
sh /script/rsync-inotify.sh &
让这个脚本后台运行
这时候 在本地的/opt 目录做任何东西
都会同步到 远端主机 /dir1 上去