Linux系统下数据同步服务rsync
一、rsync概述
1.rsync的伙伴
sync同步:刷新文件系统缓存,强制将修改过的数据写入磁盘,并且更新超级块
async异步:将数据先放到缓冲区,在周期性(一般是30s)的去同步到磁盘
rsync远程同步:==remode synchronous==
数据同步过程:
sync数据同步 => 保存⽂件(⽬标)=> 强制把缓存中的数据写⼊磁盘(⽴即保存),实时性
要求⽐较⾼的场景
asyn数据异步 => 保存⽂件(⽬标)=> 将数据先放到缓冲区,再周期性(⼀般是30s)的去同
步到磁盘,适合⼤批量数据同步的场景
2.rsync特点
1)可以镜像保存整个⽬录树和⽂件系统
2)可以保留原有的权限(permission,mode),owner,group,时间(修改时间,modify time),软硬链接,⽂件acl,⽂件属性(attributes)信息等
3)传输==效率⾼==,使⽤同步算法,只⽐较变化的(增量备份)
4)⽀持匿名传输,⽅便⽹站镜像;也可以做验证,加强安全
3.rsync与scp的区别
两者都可以实现远程同步,但是相对比而言,rsync能⼒更强
① ⽀持增量备份
② 数据同步时保持⽂件的原有属性
二、rsync的使用
1.基本用法
rsync [选项] 原数据位置 目标目录位置
-v 详细模式输出
-a 归档模式,递归的方式传输文件,并保持文件的属性
-r 递归拷贝目录
-l 保留软链接
-p 保留原有权限
-t 保留原有时间(修改)
-g 保留属组权限
-o 保留属主权限
-D -devices --specials 表示⽀持b,c,s,p类型的⽂件
-R 保留相对路径
-H 保留硬链接
-A 保留ACL策略
-e 指定要执⾏的远程shell命令,ssh更改端⼝常⽤选项
-E 保留可执行的权限
-X 保留扩展属性信息
2.本地同步
rsync [选项] 原数据位置 目标目录位置
[root@tdr ~]# rsync -av folder/ /opt/ //把folder目录下的内容传到/opt/下
[root@tdr ~]# rsync -av folder /opt/ //把folder目录整个传到/opt/下
[root@tdr ~]# rsync -avR folder /opt/ //保留相对路径,folder后加不加/都一样,都是把folder目录整个传到/opt/下
[root@tdr ~]# rsync -av folder/f1/ folder/f2/
[root@tdr ~]# touch folder/f1/file5
[root@tdr ~]# tree folder/
folder/
├── f1
│ ├── file0
│ ├── file1
│ ├── file2
│ ├── file3
│ ├── file4
│ └── file5
├── f2
│ ├── file0
│ ├── file1
│ ├── file2
│ ├── file3
│ └── file4
└── f3
[root@tdr ~]# rsync -av folder/f1/ folder/f2/
[root@tdr ~]# tree folder/
folder/
├── f1
│ ├── file0
│ ├── file1
│ ├── file2
│ ├── file3
│ ├── file4
│ └── file5
├── f2
│ ├── file0
│ ├── file1
│ ├── file2
│ ├── file3
│ ├── file4
│ └── file5
└── f3
//这里看到file5已经被同步过去了
[root@tdr ~]# rm -rf folder/f1/file0
[root@tdr ~]# tree folder/
folder/
├── f1
│ ├── file1
│ ├── file2
│ ├── file3
│ ├── file4
│ └── file5
├── f2
│ ├── file0
│ ├── file1
│ ├── file2
│ ├── file3
│ ├── file4
│ └── file5
└── f3
[root@tdr ~]# rsync -av --delete folder/f1/ folder/f2/ //删除⽬标⽬录⾥多余的⽂件
[root@tdr ~]# tree folder/
folder/
├── f1
│ ├── file1
│ ├── file2
│ ├── file3
│ ├── file4
│ └── file5
├── f2
│ ├── file1
│ ├── file2
│ ├── file3
│ ├── file4
│ └── file5
└── f3
//这里看到file0已经被同步删除了
rsync可以同步文件内容的修改,文件的删除,以及文件的属性的修改
3.远程同步
rsync [选项] 原数据位置 用户@主机地址:目标目录位置
[root@tdr ~]# rsync -av folder/ root@192.168.1.125:/tmp/ //向另一台主机的/tmp/目录传,另一台也要安装rsync
[root@tds ~]# ls /tmp/
f1
f2
f3
4.rsync作为系统服务
默认情况下,rsync只是作为⼀个命令来进⾏使⽤的(ps在查询进程时,找不到对应的服务),但是rsync提供了⼀种作为系统服务的实现⽅式。
Linux系统服务的思路:对外提供服务——>端⼝监听——>==启动服务==——>启动脚本——>配置⽂件
任务解决方案
(1)准备代码文件
[root@tdr ~]# mkdir -p /app/studentweb/src/main/java/co/goho/tangtang.studentweb/
[root@tdr ~]# touch /app/studentweb/src/main/java/co/goho/tangtang.studentweb/file{0..9}.java
(2)把rsync作为系统服务运⾏
[root@tdr ~]# vim /etc/rsyncd.conf //配置rsyncd服务的配置⽂件
[app]
path=/app/studentweb/
log file=/var/log/rsync.log
[root@tdr ~]# systemctl restart rsyncd //重启服务
在本机上提供了一个针对app/下的项目rsync服务
(3)测试rsync是否可以连接到rsync服务
[root@tds ~]# rsync -a root@192.168.1.100:: //在另一台主机找这个服务,-a:获取rsync服务对应的同步⽬录标签
app
[root@tds ~]# rsync -av root@192.168.1.100::app /tmp //下载下来
[root@tds ~]# tree /tmp/src/ //树状显示目录
(4)编写计划任务 + Shell的脚本⽂件,⾃动实现代码备份
案例:自动推送拉取文件,使用计划任务每30s推送一次代码
[root@tdr ~]# which rsync //找到rsync,使⽤的完整路径 which命令
/usr/bin/rsync
[root@tdr ~]# crontab -e //编写计划任务
*/30 * * * * /usr/bin/rsync -av /app/studentweb/ root@192.168.1.125:/tmp/
[root@tds ~]# ls /tmp //另一台主机查找
src
5.为rsynsd服务添加密码
[root@tdr ~]# vim /etc/rsyncd.conf //在/etc/rsyncd.conf 文件中添加账号和密码文件的路径
auth users=tdcs
secrets file=/etc/rsync.secrets
[root@tdr ~]# vim /etc/rsync.secrets //编辑rsync账户密码
tdcs:123
[root@tdr ~]# chmod 600 /etc/rsync.secrets //为文件设置600权限
[root@tdr ~]# ls -l /etc/rsync.secrets
-rw-------. 1 root root 9 7月 18 15:19 /etc/rsync.secrets
[root@tdr ~]# systemctl restart rsyncd
去另一台主机
[root@tds ~]# rsync -av tdr@192.168.1.100::abc /tmp
Password:123
[root@tds ~]# ls /tmp
src
三、rsync集合inotify工具实现代码同步(重点)
[root@tdr ~]# yum -y install inotify-tools //下载
-m : ⼀直监控某个⽬录,create、delete、modify等⾏为
-r : 递归,不仅仅监控⽬录还要监控⽬录下的⽂件
-q : 获取操作信息,但是不输出
-e : 哪些⾏为需要被监控,modify,delete,create,attrib,move
modify: ⽂件被修改
delete: ⽂件被删除
create: ⽂件被创建
attrib: ⽂件属性被修改
move: ⽂件被移动
[root@tdr ~]# inotifywait -mr /app/ //监听这个目录
[root@tdr ~]# vim inotify.sh //编写脚本,监听指定⽬录,⼀旦⽬录发上修改,就执⾏指定的指令
#!/bin/bash
/usr/bin/inotifywait -mrq -e modify,delete,create,attrib,move /app/studentweb|while read events
do
rsync -av /app/studentweb/ root@192.168.1.125:/tmp //注意:是另一台主机的IP
done
[root@tdr ~]# chmod 700 inotify.sh //添加可执⾏权限
[root@tdr ~]# ./inotify.sh
另外打开一个本机的终端
[root@tdr ~]# touch /app/studentweb/tds //随便在监听目录下创建个文件
打开另一台主机
[root@tds ~]# ls /tmp
src tds //出现这个目录了
回到本机
[root@tdr ~]# nohup ./inotify.sh & //放入后台运行
& : 让inotify.sh在计算机后台运⾏,可以使⽤jobs命令查看,kill %编号:当我们退出
终端时,这个执⾏会⾃动结束
nohup : 让程序⼀直在后台运⾏,即使我们关闭了终端
[root@tdr ~]# jobs
[1]+ 运行中 nohup ./inotify.sh &
[root@tdr ~]# kill %1
[root@tdr ~]# jobs
[1]+ 已终止 nohup ./inotify.sh
扩展:如何查看rsync.log⽇志⽂件
[root@tdr ~]# cat /var/log/rsync.log