rysnc远程同步
是一种复制,可以实时同步,系统自带
应用场景
- 服务器之间同步数据时候
- 数据备份时候
- rsync结合inotify的功能做实时数据同步
rsync的优势
- 查看两边的内容是否一致,一致就不会复制,不一致会复制
- 保留链接与属性
- 快速
- 安全:可以使用scp、ssh等进行文件传输
- 支持匿名传输
- 不需要特殊的权限就可以安装
- 压缩传输:传输的过程中可以实行压缩及解压缩操作,可以使用更少的带宽
rsync复制
发起端对同步源的位置有读取权限
rsync支持本地复制,或者其他的ssh、rsync等主机同步
rsync做本地复制
- 首先将源文件和目的位置的文件对比,找出差异部分
- 根据目的位置的文件与源文件差异的部分,进行一致性同步
rsync同步方式
- 完全备份:备份所有文件
- 差量备份:保留属性(针对上次的完全备份,去备份改变的那部分)
- 增量备份:清除属性(不管之前备份是啥,有变化的数据就备份)
发起端选项(常用)
| 选项 | 说明 |
|---|---|
| --delete | 删除源文件中没有的 |
| -z | 在传输文件时进行压缩 (compress)。 |
| -a | 归档模式,保留文件的权限、属性等信息,等同于组合选项"-rlptgoD”。 |
| -v | 显示同步过程的详细 (verbose) 信息。 |
经常会组合使用
rsync工作原理
- 客户端构造FileList,FileList包含了需要与服务器同步的所有文件信息对name->id
- (id用来唯一表示文件例如MD5)
- 客户端将FileList发送到服务器。
- 服务器上rsync处理客户端发过来的FileList,构建新的NewFileList。其中根据MD5值比较,删除服务器上已经存在的文件信息对,只保留服务器上不存在或变化的文件。
- 客户端得到服务器发送过来的NewFileList,然后把NewFileList中的文件重新传输到服务器。
同步源
- 在下行同步(下载)中,同步源负责提供文档的原始位置,发起端应对该位置有读取权限。
- 在上行同步(上传)中,同步源负责提供文档的目标位置,发起端应对该位置具有写入权限。
实验
- rsync的默认端口是873
- rsync的模式是c/s模式
- backuper是rsync的用户
环境
- 源服务器:192.168.42.12
- 客户机(发起端):192.168.42.13
systemctl stop firewalld
setenforce 0
配置源服务器
[root@yuan ~]# rpm -q rsync
#安装rsync(一般默认就安装了)
[root@yuan ~]# vim /etc/rsyncd.conf
··············
7 uid = root
8 gid = root
9 use chroot = yes
10 address = 192.168.42.12
11 port = 837
12 log file = /var/log/rsyncd.log
13 pid file = /var/run/rsyncd.pid
14 hosts allow = 192.168.42.0/24
15 dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
16
17 [wwwroot]
18 path = /var/www/html
19 comment = Document Root of www.shiyan.com
20 read only = yes
21 auth users = backuper
22 secrets file = /etc/rsyncd_users.db
解释:
7 uid = root
8 gid = root
9 use chroot = yes
#禁锢在源目录
10 address = 192.168.42.12
#监听地址
11 port = 837
#监听端口tcp/udp 873,可通过cat /etc/services | grep rsync查看
12 log file = /var/log/rsyncd.log
#日志文件位置
13 pid file = /var/run/rsyncd.pid
#存放进程ID的文件位置
14 hosts allow = 192.168.42.0/24
#允许访问的客户机地址。多个地址以空格分隔
15 dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
#同步时不再压缩的文件类型
16
17 [wwwroot]
#共享模块名称
18 path = /var/www/html
#源目录的实际路径
19 comment = Document Root of www.shiyan.com
#备注
20 read only = yes
#是否为只读。yes表示客户端只能读取目录内容,不能写入。只允许下行,不允许上行。
21 auth users = backuper
#授权账户,多个账号以空格分隔。授权用户,允许读取的用户名。
22 secrets file = /etc/rsyncd_users.db
#存放授权账户信息的数据文件
[root@yuan ~]# vim /etc/rsyncd_users.db
#为备份账户创建数据文件
shiyan:123456
##无须建立同名系统用户。backuper为用户名,abc123为密码。
[root@yuan ~]# yum install httpd -y
#安装http服务
[root@yuan ~]# systemctl start httpd
#开启服务
[root@yuan ~]# chmod 600 /etc/rsyncd_users.db
#给权限,因为这个是密码文件,所以只有所属的才可以读和写
[root@yuan ~]# chmod +r /var/www/html/
#保证所有用户对源目录/var/www/html都有读取权限
[root@yuan ~]# ls -ld /var/www/html/
[root@yuan ~]# rsync --daemon
#开启服务
[root@yuan ~]# netstat -anpt | grep rsync
#查看服务是否开启
#关闭rsync 服务
kill $(cat /var/run/rsyncd.pid)
rm -rf /var/run/rsyncd.pid
发起端配置
基本格式
rsync [选项] 原始位置 目标位置
[root@faqi ~]# rsync -avz zly@192.168.42.13::wwwroot /mnt/
同步源上写入:
[root@localhost html]# vim index.html
[root@localhost html]# cat index.html
发起源同步:
[root@faqi ~]# rsync -avz zly@192.168.42.12::wwwroot /opt/
#将同步源的数据备份到发起端的opt目录下
[root@faqi ~]# cd /opt/
[root@faqi opt]# cat index.html
免交互格式配置
cd /opt
rm -rf index.html
echo "123" > /etc/server.pass
chmod 600 /etc/server.pass
# 免交互同步
/usr/bin/rsync -avz --delete --password-file=/etc/server.pass mcl@192.168.42.12::wwwroot /opt/
ls /opt/ #查看是否同步成功
cat /opt/index.html #查看文件内容是否同步成功
inotify+rsync实时同步
为什么使用inotify+rsync实时同步
- 执行备份的时间固定,延迟明显、实时性差
- 当同步源长期不变化时,密集的定期任务是不必要的
实时同步的优势
- 一旦同步源出现变化,立即启动备份
- 只要同步源无变化,则不执行备份
使用实时同步的好处
从版本2.6.13开始提供实时同步
- 可以监控文件系统的变动情况,并做出通知响应
- 辅助软件:inotify-tools
发起端配置inotify+rsync
- 使用inotify通知接口,可以用来监控文件系统的各种变化情况,如文件存取、删除、移动、修改等。利用这一机制,可以非常方便地实现文件异动告警、增量备份,并针对目录或文件的变化及时作出响应。
- 将inotify机制与rsync工具相结合,可以实现触发式备份(实时同步),即只要原始位置的文档发生变化,则立即启动增量备份操作;否则处于静默等待状态。
- 因为 inotify 通知机制由 Linux 内核提供,因此主要做本机监控,在触发式备份中应用时更适合上行同步。
修改源服务器配置文件
[root@yuan ~]# vim /etc/rsyncd.conf
#编辑配置文件,修改
read only = no
#关闭只读,上行同步需要可以写
#重启服务,需要先删除之前开启创建的文件,在开启服务
[root@yuan ~]# kill $(cat /var/run/rsyncd.pid)
[root@yuan ~]# rm -rf /var/run/rsyncd.pid
[root@yuan ~]# rsync --daemon
[root@yuan ~]# netstat -anpt | grep rsync
[root@yuan ~]# mkdir /data
[root@yuan ~]# chmod 777 /data
#创建一个同步目录,修改权限
发起端调整inotifi内核参数
在Linux内核中,默认的inotify机制提供了三个调控参数:
- max_queue_events ( 监控事件队列,默认值为16384)、
- max_user_instances (最多监控实例数,默认值为128)、
- max_user_watches (每个实例最多监控文件数,默认值为8192)。
当要监控的目录、文件数量较多或者变化较频繁时,建议加大这三个参数的值。
[root@faqi ~]# cat /proc/sys/fs/inotify/max_queued_events
[root@faqi ~]# cat /proc/sys/fs/inotify/max_user_instances
[root@faqi ~]# cat /proc/sys/fs/inotify/max_user_watches
#查看三个调控参数
[root@faqi ~]# vim /etc/sysctl.conf
#内核参数都在文件中修改,将查找的参数加大只有添加到数据后面
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
[root@faqi ~]# sysctl -p
#检测
发起端安装inotify-tools
用inotify 机制还需要安装inotify-tools, 以便提供inotifywait、 inotifywatch 辅助工具程序,用来监控、汇总改动情况。
- inotifywait:可监控modify (修改)、create (创建)、move (移动)、delete (删除)、attrib ( 属性更改)等各种事件,一有变动立即输出结果。
- inotifywatch:可用来收集文件系统变动情况,并在运行结束后输出汇总的变化情况。
下载inotify-tools的安装包到opt目录下
[root@faqi opt]# tar zxvf inotify-tools-3.14.tar.gz
#解压
[root@faqi opt]# cd inotify-tools-3.14/
[root@faqi inotify-tools-3.14]# ./configure
#检测环境是否可以安装
[root@faqi inotify-tools-3.14]# make && make install
#编译并且安装
如果安装没成功,就需要在安装之前,安装依赖包:
[root@faqi opt]# yum install gcc gcc-c++ make -y
源服务端
[root@faqi inotify-tools-3.14]# inotifywait -mrq -e modify,create,move,delete /data
#先执行“inotifywait”命令,然后另外再开启一个新终端向 /data 目录下添加文件、移动文件,在原来的终端中跟踪屏幕输出结果。
#-e:用来指定要监控哪些事件
#-m:表示持续监控
#-r:表示递归整个目录
#-q:简化输出信息
如果没成功
发起端编写触发式同步脚本
[root@faqi ~]# vim /opt/inotify.sh
#编写脚本
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e modify,create,attrib,move,delete /var/www/html/" #持续监控
RSYNC_CMD="rsync -apzH --delete --password-file=/etc/server.pass /var/www/html/ zly@192.168.42.12::wwwroot/"
#进行同步
$INOTIFY_CMD #输出监控内容
$INOTIFY_CMD | while read DIRECTORY EVENT FILE #遍历
##while判断是否接收到监控记录
do
if [ $(pgrep rsync | wc -l) -le 0 ] ; then #判断是否正在执行同步
$RSYNC_CMD
[root@faqi ~]# chmod +x /opt/inotify.sh
[root@faqi ~]# chmod +x /etc/rc.d/rc.local
#给出权限
[root@faqi ~]# echo '/opt/inotify.sh' >> /etc/rc.d/rc.local
#将脚本加入开启自动执行中
[root@faqi ~]# mkdir -p /var/www/html/
#创建脚本中进行同步的目录
验证
客户端开启监控
[root@faqi ~]# cd /opt/
[root@faqi opt]# ./inotify.sh &
#后台运行脚本
客户端的同步的目录下创建文件
[root@faqi opt]# cd /var/www/html/
[root@faqi html]# touch 1.txt
服务端查看
[root@yuan ~]# cd /opt/
[root@yuan opt]# ls