Linux下rsync+inotfy/sersync实现数据实时同步

%title插图%num

导读:本文主要讲解了如何利用 rsync+inotfy/sersync 实现数据实时同步的操作过程和部分原理、参数。
本次实验采用:
虚拟机:VMware-workstation-full-12.5.7-5813279;NAT模式
镜像:centos7.4:CentOS-7-x86_64-DVD-1708.iso
内核:3.10.0-693.el7.x86_64
一、新建虚拟机及准备xy1,xy2
0.规划:主机名:IP
xy1:192.168.91.131
xy2:192.168.91.132
仅列出xy1的准备配置,xy2同xy1
hostname:xy1
2.挂载镜像/dev/sr0
%title插图%num

3.配置yum源
%title插图%num

4.设置静态ip:192.168.91.131
%title插图%num

5.下载vim
二、安装rsync (一).安装xinetd及rsync [root@xy1 ~]# yum install xinetd rsync -y
[root@xy2 ~]# yum install xinetd rsync -y
[root@xy2 ~]# rsync --daemon
[root@xy2 ~]# netstat -an | grep 873
(二).使用 rsync 备份数据
对 xy1 网站根目录的 /var/www/html 目录备份到 xy2 的 /web_bak 。
服务器:xy1: 192.168.91.131
客户端:xy2: 192.168.91.132
1.建立测试用户(两台主机都需要操作)
[root@xy1 ~]# useradd rget1 && echo “123456” | passwd —stdin rget1
[root@xy2 ~]# useradd rget1 && echo “123456” | passwd —stdin rget1
2.对目录赋予ACL权限:
[root@xy1 ~]# mkdir -p /var/www/html/
[root@xy1 ~]# setfacl -R -m user:rget1:rwx /var/www/html/
[root@xy1 ~]# setfacl -R -m default:rget1:rwx /var/www/html/
[root@xy1 ~]# getfacl /var/www/html
%title插图%num

3.创建测试数据:
[root@xy1 ~]# cp -r /boot/* /var/www/html/
复制/boot/目录下所有内容到 /var/www/html/目录下
%title插图%num

4.服务端上操作:
[root@xy2 ~]# mkdir /web_bak
[root@xy2 ~]# chown rget1:rget1 -R /web_bak/
[root@xy1 ~]# rsync -avz /var/www/html/ rget1@192.168.91.132:/web_bak/
%title插图%num

查看xy2上/web_bak/目录是否同步数据
%title插图%num

(三)使用非系统用户备份数据
使用非系统用户进入备份数据,依靠系统中的 rsync 配置文件 /etc/rsyncd.conf 进行备份数据,并创建备份账户,最终把 rsync 以 deamon 方式运行。
1.rsyncd.conf配置文件:
配置文件分为两部分:全局参数、模块参数。
全局参数:对rsync服务器生效,如果模块参数和全局参数冲突,冲突的地方模块参数最终生效。
模块参数:定义需要通过rsync输出的目录定义的参数。
2.用配置文件定义目录输出
服务器:xy2
客户端:xy1
[root@xy2 ~]# vim /etc/rsyncd.conf #文件不存在,需要手动创建。
注意: #会出现因注释不兼容的问题而导致推数据时出现报错,配置文件需取消注释或者注释进行换行处理。
%title插图%num

3.创建提示文件和用户密码
[root@xy2 ~]# echo “Welcome to Backup Server” > /etc/rsyncd.motd #编辑欢迎信息文件
[root@xy2 ~]# vim /etc/rsync.passwd #创建并编写密码文件。
rsyncuser:123456 #格式为 用户名:密码。
[root@xy2 ~]# chmod 600 /etc/rsync.passwd
密码文件权限必须是700或者600,否则的话身份验证会失效。
4.启动服务(启动rsync与xinetd服务)。
[root@xy2 ~]# systemctl start xinetd #启动xinetd服务。
[root@xy2 ~]# systemctl enable xinetd #将xinetd服务加入开机项。
[root@xy2 ~]# rsync —daemon —config=/etc/rsyncd.conf #加载配置文件rsyncd.conf启动rsync服务
[root@xy2 ~]# netstat -antup | grep 873 #查看端口
%title插图%num

*记得关防火墙或者更改规则
[root@xy2 ~]# iptables -F
[root@xy2 ~]# systemctl stop filewalld
5.测试
rsync语法: rsync 选项 目标目录 用户名@备份源服务器IP::共享模块名
[root@xy1 ~]# rsync -avz /var/www/html/ rsyncuser@192.168.91.132::wwwroot
%title插图%num

6.密码处理
新建一个文件保存好密码,然后在rsync命令中使用–password-file指定此文件即可
[root@xy1 ~]# vim /etc/rsync.passwd #创建密码文件,其中只需要指定密码即可
123456
[root@xy1 ~]# chmod 600 /etc/rsync.passwd #赋予密码文件600权限
[root@xy1~]# rsync -avz /var/www/html/ rsyncuser@192.168.91.132::wwwroot —password-file=/etc/rsync.passwd
%title插图%num

(四)脚本实现定时自动备份
[root@xy1 ~]# vim autobackup.sh #编写脚本。
#!/bin/bash
rsync -avz /var/www/html/ rsyncuser@192.168.91.132::wwwroot --password-file=/etc/rsync.passwd
[root@xy1 ~]# chmod +x autobackup.sh #赋予脚本执行权限。
[root@xy2 ~]# rm -rf /web-back/*
[root@xy1 ~]# ./autobackup.sh #测试脚本。Ojbk!
%title插图%num

定义计划任务实现定时备份:
方法一:
[root@xy1 ~]# echo “01 3 * sh /root/autobackup.sh &” >> /var/spool/cron/root
方法二:
[root@xy1 ~]# crontab -e
01 3 * sh /root/autobackup.sh &
三、rsync+inotify实现数据实时同步 1.修改参数
[root@xy1 ~]# ll /proc/sys/fs/inotify/
[root@xy1 ~]# cat /proc/sys/fs/inotify/max*
%title插图%num

[root@xy1 ~]# vim /etc/sysctl.conf
fs.inotify.max_queued_events = 32768
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 90000000
[root@xy1 ~]# sysctl -p
[root@xy1 ~]# cat /proc/sys/fs/inotify/max*
%title插图%num

2.下载:inotify-tools-3.13.tar.gz
[root@xy1 ~]# wget https://sourceforge.net/projects/inotify-tools/files/inotify-tools/3.13/inotify-tools-3.13.tar.gz
3.编译安装
[root@xy1~]# tar -zxvf inotify-tools-3.13.tar.gz
[root@xy1 ~]# cd inotify-tools-3.13
[root@xy1 inotify-tools-3.13]# ./configure
%title插图%num

预编译报错的原因是没有安装gcc
[root@xy1 inotify-tools-3.13]# yum install gcc* -y
[root@xy1 inotify-tools-3.13]# ./configure
[root@xy1 inotify-tools-3.13]# make && make install
[root@xy1 inotify-tools-3.13]# inotifywait -h
[root@xy1inotify-tools-3.13]# inotifywait -mrq -e create, move, delete, modify /var/www/html/
再打开一个 xy1 的伪终端,对 xy1 的 /var/www/html/ 目录进行操作
查看监听xy1的第一个伪终端pts1,发现报告CREATE,ISDIR dir1,证明inotify起作用了!
4.实现实时同步数据
但是发现xy2的/web_bak/目录并没有实时同步xy1下/var/www/html/的数据,这是因为我们没有执行同步操作!
因此我们执行下面的操作:
[root@xy1 ~]# ssh-keygen
[root@xy1~]#ssh-copy-id root@192.168.91.132
[root@xy1 ~]# ssh 192.168.91.132
%title插图%num

编写脚本
[root@xy1 ~]# vim b.sh
#!/bin/bash
inotifywait -mrq -e create,move,delete,modify /var/www/html/ | while read a b c
do
rsync -azP --delete /var/www/html/ root@192.168.91.132:/web_bak
done
[root@xy1 ~]# chmod +x b.sh
[root@xy1 ~]# ./b.sh
%title插图%num

%title插图%num

可以看到 xy2 的 /web_bak/ 目录与 xy1 下 /var/www/html/ 目录已经实现同步数据了!
优化脚本
[root@xy1 ~]# vim b.sh
#!/bin/bash
SRC=/var/www/html/
DST=root@192.168.91.132:/web_bak
inotifywait -mrq -e create,move,delete,modify $SRC | while read a b c
do
rsync -azP --delete $SRC $DST
done
当然我们也可以用它来实现:
rsync -avP /var/www/html/ rsyncuser@192.168.91.132::wwwroot --password-file=/etc/rsync.passwd
加入开机启动项
[root@xy1 ~]# cp b.sh /opt/inotify_rsync.sh
[root@xy1 ~]# echo ‘/opt/inotify_rsync.sh &’ >> /etc/rc.local 四、rsync+sersync 实现数据实时同步 (一)介绍及规划
一台装sersync、一台装rsync服务
sersync服务器(数据源,源机器):192.168.91.131
rsync客户端(备份端,目标机器):192.168.91.132
1.为什么要用rsync+sersync架构?
(1)sersync是基于inotify开发的,类似于inotify-tools的工具。
(2)sersync可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或者某一个目录的名字,然后使用rsync同步的时候,只同步发生变化的文件或者目录。
2.rsync+inotify-tools与rsync+sersync架构的区别?
(1)rsync+inotify-tools
1)inotify只能记录下被监听的目录发生了变化(增,删,改)并没有把具体是哪个文件或者哪个目录发生了变化记录下来。
2)rsync在同步的时候,并不知道具体是哪个文件或目录发生了变化,每次都是对整个目录进行同步,当数据量很大时,整个目录同步非常耗时(rsync要对整个目录遍历查找对比文件),因此效率很低。
(2)rsync+sersync
1)sersync可以记录被监听目录中发生变化的(增,删,改)具体某个文件或目录的名字。
2)rsync在同步时,只同步发生变化的文件或目录(每次发生变化的数据相对整个同步目录数据来说很小,rsync在遍历查找对比文件时,速度很快),因此效率很高。
3.同步过程:
(1)在同步服务器上开启sersync服务,sersync负责监控配置路径中的文件系统事件变化。
(2)调用rsync命令把更新的文件同步到目标服务器。
(3)需要在主服务器配置sersync,在同步目标服务器配置rsync server(注意:是rsync服务)。
4.同步过程和原理:
(1)用户实时的往sersync服务器上写入更新文件数据。
(2)此时需要在同步主服务器上配置sersync服务。
(3)在另一台服务器开启rsync守护进程服务,以同步拉取来自sersync服务器上的数据。
(4)在另一台服务器开启rsync守护进程服务,使sersync push文件过来。
通过rsync的守护进程服务后可以发现,实际上sersync就是监控本地的数据写入或更新事件,然后,在调用rsync客户端的命令,将写入或更新事件对应的文件通过rsync推送到目标服务器,如图所示:
%title插图%num

(二)下载并配置sersync 1.下载
在google code下载sersync的可执行文件版本,里面有配置文件与可执行文件
https://sersync.googlecode.com/files/sersync2.5.4_64bit_binary_stable_final.tar.gz(应该要xx,有时下载失败,所以要本地留存一份)
链接:https://pan.baidu.com/s/1FJtxwlX_L3OhnqVU8RaaVw
提取码:rg9y
2.上传到服务器 /opt 目录下。
[root@xy1 ~]# cd /opt/ #切换工作目录到/opt目录下。
[root@xy1 opt]# tar zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@xy1 opt]# mv GNU-Linux-x86 sersync #解压后的文件重命名为 sersync
3.配置 sersync
[root@xy1 opt]# cd sersync #切换工作目录至sersync目录下。
[root@xy1 sersync]# cp confxml.xml confxml.xml.bak #备份配置文件,便于二次修改
%title插图%num

(1)更改优化sersync配置文件:
[root@xy1 sersync]# vim confxml.xml #修改配置文件中的24–28行,如下所示。
<sersync>
<localpath watch="/var/www/html"> #本地同步数据目录。
<remote ip="192.168.91.132" name="wwwroot"/> #rsync模块名称
(2)修改31–34行,认证部分(rsync密码认证)
<rsync>
<commonParams params="-artuz"/>
<auth start="true" users="rsyncuser" passwordfile="/etc/rsync.passwd"/>
<userDefinedPort start="false" port="874"/><!-- port=874 -->
<timeout start="false" time="100"/><!-- timeout=100 -->
<ssh start="false"/>
(3)开启sersync守护进程同步数据。
[root@xy1 sersync]# /opt/sersync/sersync2 -d -r -o /opt/sersync/confxml.xml
%title插图%num

4.测试
(1)在xy1 /var/www/html/ 目录 增加、删除、或改目录文件。
(2)看xy2 /web-back 目录的变化
[root@xy2 web-back]# watch ls -l
可以发现xy2的/web_bak/目录与xy1下/var/www/html/目录的数据是实时同步的!大功告成!!!
五、总结 (一)RSYNC概述
Rsync是Linux系统下的数据镜像备份工具,使用快速增量备份工具Remote Sync可以远程同步,可以在不同主机之间进行同步,可实现全量备份与增量备份,保持链接和权限,且采用优化的同步算法,传输前执行压缩,因此非常适合用于架构集中式备份或异地备份等应用。同时Rsync支持本地复制,或者与其他SSH、rsync主机同步。
官方网站:https://rsync.samba.org/
(二)RSYNC数据备份
cp,scp,ftp等命令在拷贝文件时,会先统计文件信息,如大小等,然后再进行拷贝。这样的话在数据量较大时,统计信息可能占用较长时间,类似Windows的复制。
而rsync是边复制,边统计,边比较。
(三)Rysnc 特性和优点
(1)可以镜像保存整个目录树和文件系统。
(2)可以很容易做到保持原来文件的权限、时间、软硬链接等等。
(3)无须特殊权限即可安装。
(4)快速:第一次同步时 rsync 复制全部内容,但在下一次只传输修改过的文件。
(5)压缩传输:rsync 在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽。
(6)安全:可以使用scp、ssh等方式来传输文件。
(7)支持匿名传输,以方便进行网站镜象。
(8)选择性保持:符号连接,硬链接,文件属性,权限,时间等。
快速性:
第一次同步时 rsync 会将指定目录下全部内容复制同步,但在下一次只传输修改过的内容。
安全性:
可以使用scp、ssh等方式来传输文件,当然也可以通过直接的socket连接。
选择性保持:符号连接,硬链接,文件属性,权限,时间等。
压缩传输:
rsync 在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽。
(四)常见备份分类
(1) 完整备份:每次备份都是从备份源将所有的文件或目录备份到目的地。
(2) 差量备份:备份上次完全备份以后有变化的数据(他针对的上次的完全备份,他备份过程中不清除存档属性)。
(3) 增量备份:备份上次备份以后有变化的数据(他才不管是那种类型的备份,有变化的数据就备份,他会清除存档属性)
(五)RSYNC原理 1.运行模式和端口:
(1)采用C/S模式(客户端/服务器模式)[ 实际上是一个点到点的传输,直接使用rsync命令即可完成 ]
(2)rsync监听的端口:873
2.四个名词的解释:
发起端:负责发起rsync同步操作的客户机叫做发起端,通知服务器我要备份你的数据。
备份源:负责响应来自客户机rsync同步操作的服务器叫做备份源,需要备份的服务器。
服务端:运行rsyncd服务,一般来说,需要备份的服务器。
客户端:存放备份数据。
3.数据同步方式:
推push:一台主机负责把数据传送给其他主机,服务器开销很大,比较适合后端服务器少的情况。
拉pull:所有主机定时去找一台主机拉数据,可能就会导致数据缓慢。
推:目的主机配置为rsync服务器,源主机周期性的使用rsync命令把要同步的目录推过去(需要备份的机器是客户端,存储备份的机器是服务端)。
拉:源主机配置为rsync服务器,目的主机周期性的使用rsync命令把要同步的目录拉过来(需要备份的机器是服务端,存储备份的机器是客户端)。
两种方案,rsync都有对应的命令来实现。
rsync命令示例说明push和pull,如图 所示:
%title插图%num

push 和 pull 示意图
4.xinetd 管理 Rsync 工作原理,如图所示:
%title插图%num

使用rsync来同步是先通过xinetd监听873号端口,如果rsync进来的是873号端口,那么xinetd就会通知它所管辖的rsync服务来做回应,接下来就是rsync俩服务于之间的通讯。
5.rsync原理
rsync 是怎样知道文件是否需要备份,或者说是怎样知道目录或者文件被修改过的呢?
利用 md5sum,来检验文件的完整性
%title插图%num

此外,还会对比存档属性,时间戳等等信息。从而得知目录/文件是否被修改,需要同步!


点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注