一、linux系统下数据同步服务RSYNC
1、什么是rsync
rsync的好姐妹
sync同步:刷新文件系统缓存,强制将修改过的数据块写入磁盘,并且更新超级块。
■ async异步:将数据先放到缓冲区,再周期性(一般是30s)的去同步到磁盘。
■ rsync远程同步 :== remote synchronous ==
数据同步过程
sync数据同步=>保存文件(目标)=>强制把缓存中的数据写入磁盘(立即保存),实
时性要求比较高的场景asyn数据异步=>保存文件(目标)=>将数据先放到缓冲区,再周期性(一般是30s)的
去同步到磁盘,适合大批量数据同步的场景
2、rsync特点
■ 可以镜像保存整个目录树和文件系统|
■ 可以保留原有的权限(permission,mode),owner,group,时间(修改时间,modify time),
软硬链接,文件acl,文件属性(attributes)信息等■ 传输 == 效率高 == ,使用同步算法,只比较变化的(增量备份)
file1.txt file2.txt file3.txt(A服务器)rsync实现数据同步 =>只同步file3.txt=>增量备份
file1.txt file2.txt(B服务器)
■支持匿名传输,方便网站镜像;也可以做验证,加强安全
3、rsync与scp的区别
两者都可以实现远程同步,但是相对比而言,rsync能力更强
1支持增量备份
2数据同步时保持文件的原有属性
二、RSYNC的使用
1、安装rsync
[root@b ~]# rpm -aq | grep rsync
[root@b ~]# yum list | grep rsync
[root@b ~]# ls /etc/yum.repos.d/
[root@b ~]# yum -y install rsync 安装rsync
2、基本语法
语法:rsync [选项] 原数据位置 想同步的目录位置
选项 说明 -v 详细模式输出 -a 归档模式,递归的方式传输,并保持文件的属性 -r 递归拷贝文件 -l 保留软链接 -p 保留原有权限
-t 保留原有时间(修改) -g 保留属组权限 -o 保留属主权限 -D 等于--decives --specials 表示支持b,c,s,p类型的文件 -R 保留相对路径 -H 保留硬链接 -A 保留ACL策略 -e 指定要执行的远程shell命令,ssh更改端口常用选项 -E 保留可执行权限 -X 保留扩展属性信息 a属性 PUSH:推,相当于上传, PULL:拉相当于下载
3、本地文件同步
(1)在家目录中创建文件,将这些文件同步到opt下
[root@b ~]# mkdir folder
[root@b ~]# mkdir folder/f{1..3}
[root@b ~]# tree folder/
folder/
├── f1
├── f2
└── f3
[root@b ~]# touch folder/f1/file{0..4}
[root@b ~]# tree folder/
folder/
├── f1
│ ├── file0
│ ├── file1
│ ├── file2
│ ├── file3
│ └── file4
├── f2
└── f3
(2)folder目录下的文件传到opt下
[root@b ~]# rsync -av folder/ /opt/ #加/ 只同步目录下的文件
[root@b ~]# tree /opt/
├── f1
│ ├── file0
│ ├── file1
│ ├── file2
│ ├── file3
│ └── file4
├── f2
├── f3[root@b ~]# rsync -av folder /opt/ #不加/将目录整体同步
[root@b ~]# tree /opt/
├── folder
│ ├── f1
│ │ ├── file0
│ │ ├── file1
│ │ ├── file2
│ │ ├── file3
│ │ └── file4
│ ├── f2
│ └── f3[root@b ~]# rsync -avR folder/ /opt/ #-R保留相对路径
[root@b ~]# tree /opt/
|── folder
├── f1
│ ├── file0
│ ├── file1
│ ├── file2
│ ├── file3
│ └── file4
├── f2
└── f3
(3)现在不同步到opt,就在本地几个目录传
[root@b ~]# rsync -av folder/f1/ folder/f2/ #将f1目录下文件同步到f2目录下
[root@b ~]# touch folder/f1/file5 #新建file5文件 文件的增加会同步
[root@b ~]# rsync -av folder/f1/ folder/f2/ #再次同步
[root@b ~]# rm -rf folder/f1/file0 #删除folder/f1/file0
[root@b ~]# rsync -av folder/f1/ folder/f2/ #删除之后没有同步[root@b ~]# rsync -av --delete folder/f1/ folder/f2/ #加--delete之后同步
(4)同步文件内容的修改,文件删除,以及文件得到属性的修改
[root@b ~]# touch folder/f1/file0 -m -d "2024-7-14 00:00" //修改时间
[root@b ~]# rsync -av --delete folder/f1/ folder/f2/-rw-r--r-- 1 root root 0 7月 14 00:00 folder/f1/file0
[root@b ~]# chmod g+w folder/f1/file0 //修改权限
-rw-rw-r-- 1 root root 0 7月 14 00:00 folder/f1/file0
[root@b ~]# rsync -av --delete folder/f1/ folder/f2/
4、远程同步
两台主机都支持rsync的服务
rsync-ac 源用户@主机地址
获取数据pull拉取,发送数据push推送数据
(1)向qqq主机 /tmp目录下同步数据
要求对面主机也要安装rsync
[root@qqq ~]# yum -y install rsync
[root@b ~]# rsync -av folder/ root@192.168.8.142:/tmp/
(2)在qqq主机新建文件,将这个文件同步到b主机的/tmp目录下
[root@ qqq~]# dd if=/dev/zero of=/tmp/lajiwenjain bs=300M count=1
[root@ qqq ~]# ls /tmp/ -lh
[root@qqq ~]# dd if=/dev/zero of=/tmp/lajiwenjain bs=300M count=1
将qqq主机中的内容同步到b主机
[root@b ~]# rsync -av root@192.168.8.142:/tmp/lajiwenjain /tmp/
[root@qqq ~]# ls /tmp/
lajiwenjain
[root@qqq ~]# systemctl status rsyncd #查看rsync服务状态
[root@qqq ~]# systemctl start rsyncd #启动rsync服务
[root@qqq ~]# netstat -lntup | grep rsync #查看使用的端口
5、rsync作为系统服务
(1)找到服务的配置文件
[root@b ~]# vim /etc/rsyncd.conf
# uid = nobody 用户编号
# gid = nobody 所属组编号
# use chroot = yes 是否禁锢目录
# max connections = 4 最大连接数
# pid file = /var/run/rsyncd.pid 进程文件,每个服务都有一个PID编号,其来源就是PID文件
# exclude = lost+found/ 传输文件时,忽略lost+fiund/目录
# transfer logging = yes 传输日志是否需要写入日志文件,yes表示写入
# timeout = 900 传输超时时间,默认15分钟
# ignore nonreadable = yes 是否忽略不可读文件
# dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 以下格式文件不压缩
(2)新建目录
[root@b ~]# mkdir -p /app/studentweb/src/main/java/co/goho/yuanyu.studentweb/
[root@b ~]# touch /app/studentweb/src/main/java/co/goho/yuanyu.studentweb/File{0..9}.java
(3)把rsync作为系统服务运行
在b主机提供了一个针对app/下的项目的rsync服务,下次访问直接找服务
[root@b ~]# cd /app/studentweb/
[root@b studentweb]# vim /etc/rsyncd.conf
[app]
path=/app/studentweb/
log file=/var/log/rsync.log
[root@b studentweb]# systemctl restart rsyncd[root@qqq ~]# rsync -a root@192.168.8.141::
app[root@qqq ~]# rsync -ac root@192.168.8.141::app /tmp/ #下载文件到本地
(4)自动化推送拉取文件
设置每30秒推送一次代码,编写计划任务,找到rsync的which地址
[root@b ~]# crontab -e
[root@b ~]# which rsync
/usr/bin/rsync
*/1 * * * * /usr/bin/rsync -av /app/studentweb/ root@192.168.8.142:/tmp/
三、课程扩展
1、给rsyncd服务添加密码
(1)在/etc/rsyncd.conf文件添加账户和密码文件的路径
[root@b ~]# vim /etc/rsyncd.conf
(2)创建编辑免密 账户:密码
[root@b ~]# vim /etc/rsync.secrets
(3)给/etc/rsync.secrets添加权限
[root@b ~]# chmod 600 /etc/rsync.secrets
(4)重启rsyncd服务
[root@b ~]# systemctl restart rsyncd
(5)拉取数据
[root@b ~]#rsync -av zhangsan@192.168.8.142::app /tmp/
2、rsync集合inotify工具实现代码实时同步(重点)
(1)安装inotify-tools
监听指定目录,一旦目录发生修改,就执行指令命令
[root@b ~]# yum -y install inotify-tools
(2)inotify 监听
安装完后,就会产生下面两个命令
/usr/bin/inotifywait 等待
/usr/bin/inotifywatch 看守
[root@b ~]# touch /app/studentweb/nihaowoshiqinshihua.txt #重新开终端创建文件
[root@b ~]# inotifywait -mr /app/ # 会检测到改变
Setting up watches. Beware: since -r was given, this may take a while!
Watches established.
/app/studentweb/ CREATE nihaowoshiqinshihua.txt
/app/studentweb/ OPEN nihaowoshiqinshihua.txt
/app/studentweb/ ATTRIB nihaowoshiqinshihua.txt
/app/studentweb/ CLOSE_WRITE,CLOSE nihaowoshiqinshihua.txt
一旦inotifywait监听到目录中的改变就直接推送
(3)编写脚本
[root@b ~]# vim initifytest.sh
选项 说明 -m 一直监听某个目录,create,delete,modify等行为 -r 递归,不仅仅监控目录还要监控目录下的文件 -q 获取操作信息,但是不输出 -e 哪些行为需要被监控,modify,delete,create,attrib,move modify 文件被修改 delete 文件被删除 create 文件被创建 attrib 文件属性被修改 move 文件被移动
(4)添加可执行权限
[root@b ~]# chmod 700 initifytest.sh #添加可执行权限
[root@b ~]# touch /app/studentweb/今天星期四 #另一个终端创建文件
[root@b ~]# ./initifytest.sh #执行脚本,会监听到
(4)让 intifytest.sh文件一直执行下去
[root@b ~]# nohup ./initifytest.sh &
&:让inotify.sh在计算机后台运行,可以使用jobs命令查看,kill %编号结束,当我们退出终端时,这个执行会自动结束
nohup:让程序一直在后台运行,即使我们关闭了终端
(5) 查看rsync.log日志文件
[root@b ~]# cat /var/log/rsync.log