rysnc远程同步

446 阅读6分钟

rysnc远程同步

是一种复制,可以实时同步,系统自带

应用场景

  • 服务器之间同步数据时候
  • 数据备份时候
  • rsync结合inotify的功能做实时数据同步

rsync的优势

  • 查看两边的内容是否一致,一致就不会复制,不一致会复制
  • 保留链接与属性
  • 快速
  • 安全:可以使用scp、ssh等进行文件传输
  • 支持匿名传输
  • 不需要特殊的权限就可以安装
  • 压缩传输:传输的过程中可以实行压缩及解压缩操作,可以使用更少的带宽

rsync复制

发起端对同步源的位置有读取权限

rsync支持本地复制,或者其他的ssh、rsync等主机同步

rsync做本地复制

  1. 首先将源文件和目的位置的文件对比,找出差异部分
  2. 根据目的位置的文件与源文件差异的部分,进行一致性同步

rsync同步方式

  • 完全备份:备份所有文件
  • 差量备份:保留属性(针对上次的完全备份,去备份改变的那部分)
  • 增量备份:清除属性(不管之前备份是啥,有变化的数据就备份)

发起端选项(常用)

选项说明
--delete删除源文件中没有的
-z在传输文件时进行压缩 (compress)。
-a归档模式,保留文件的权限、属性等信息,等同于组合选项"-rlptgoD”。
-v显示同步过程的详细 (verbose) 信息。

经常会组合使用

rsync工作原理

  1. 客户端构造FileList,FileList包含了需要与服务器同步的所有文件信息对name->id
  2. (id用来唯一表示文件例如MD5)
  3. 客户端将FileList发送到服务器。
  4. 服务器上rsync处理客户端发过来的FileList,构建新的NewFileList。其中根据MD5值比较,删除服务器上已经存在的文件信息对,只保留服务器上不存在或变化的文件。
  5. 客户端得到服务器发送过来的NewFileList,然后把NewFileList中的文件重新传输到服务器。

同步源

  • 在下行同步(下载)中,同步源负责提供文档的原始位置,发起端应对该位置有读取权限。
  • 在上行同步(上传)中,同步源负责提供文档的目标位置,发起端应对该位置具有写入权限。

实验

  • rsync的默认端口是873
  • rsync的模式是c/s模式
  • backuper是rsync的用户

image.png

环境

  • 源服务器: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

image.png image.png

image.png

image.png

image.png

image.png

发起端配置

基本格式

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


image.png image.png

image.png

免交互格式配置

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
#创建一个同步目录,修改权限

image.png

image.png

image.png

image.png

发起端调整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
#检测

image.png

image.png

image.png

发起端安装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:简化输出信息

image.png

image.png

image.png 如果没成功 image.png

发起端编写触发式同步脚本

[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/
#创建脚本中进行同步的目录

image.png

image.png

验证

客户端开启监控
[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

image.png

image.png