linux centos7 rsync+sersync实现数据实时同步

简介: linux centos7 rsync+sersync实现数据实时同步

一、为什么要用rsync+sersync架构?

1、sersync是基于inotify开发的,类似于inotify-tools的工具

2、sersync可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或者某一个目录的名字,然后使用rsync同步的时候,只同步发生变化的文件或者目录 

二、rsync+inotify-tools与rsync+sersync架构的区别?

1、rsync+inotify-tools

a、inotify只能记录下被监听的目录发生了变化(增,删,改)并没有把具体是哪个文件或者哪个目录发生了变化记录下来;

b、rsync在同步的时候,并不知道具体是哪个文件或目录发生了变化,每次都是对整个目录进行同步,当数据量很大时,整个目录同步非常耗时(rsync要对整个目录遍历查找对比文件),因此效率很低    

2、rsync+sersync

a、sersync可以记录被监听目录中发生变化的(增,删,改)具体某个文件或目录的名字;

b、rsync在同步时,只同步发生变化的文件或目录(每次发生变化的数据相对整个同步目录数据来说很小,rsync在遍历查找对比文件时,速度很快),因此效率很高。

同步过程:

1.  在同步服务器上开启sersync服务,sersync负责监控配置路径中的文件系统事件变化;

2.  调用rsync命令把更新的文件同步到目标服务器;

3.  需要在主服务器配置sersync,在同步目标服务器配置rsync server(注意:是rsync服务)

 同步过程和原理:

1.  用户实时的往sersync服务器上写入更新文件数据;

2.  此时需要在同步主服务器上配置sersync服务;

3.  在另一台服务器开启rsync守护进程服务,以同步拉取来自sersync服务器上的数据;

通过rsync的守护进程服务后可以发现,实际上sersync就是监控本地的数据写入或更新事件;然后,在调用rsync客户端的命令,将写入或更新事件对应的文件通过rsync推送到目标服务器

三、操作

一台装sersync一台装rsync服务  对151网站根目录的/var/www/html目录备份到145的/www  (所以145上只安装rsync就可以了,这个问题绕了好长时间哈哈)

Sersync服务器(数据源【部署的项目,代码等】,源机器 ):192.168.1.151
Rsync服务器(备份端磁盘大专门用来存储数据 ,目标机器):192.168.1.145

(1)、使用rsync备份数据 系统用户

在145上安装
[root@145 ~]# yum -y install xinetd rsync
[root@145 ~]# mkdir /www                     #创建备份目录

常用的命令 –avz  --exclude=filname,需要过滤的文件

-a, --archive archive mode 权限保存模式,相当于 -rlptgoD 参数,存档,递归,保持属性等  

-z, --compress 压缩模式, 当资料在传送到目的端进行档案压缩.

--delete, 删除那些目标位置有的文件而备份源没有的文件

--password-file=FILE ,从 FILE 中得到密码

对151网站根目录的/var/www/html目录备份到145的/www

在151上安装

[root@151 ~]# yum  install   rsync -y

[root@151 ~]# rsync -avz /www/ root@192.168.1.145:/www/    这是用root用户直接同步需要输入密码

如果有端口    rsync -e 'ssh -p 22' -avl /www/www/ root@192.168.1.146:/www/www/

 

(2)、非系统用户备份数据

145上安装

[root@145 ~]# yum -y install xinetd rsync
[root@145 ~]# mkdir /www                     #创建备份目录

151安装

 [root@151 ~]# yum  install   rsync -y

原理:145 上 使用系统配置文件   vim /etc/rsyncd.conf   来备份数据,创建备份账户,最后把rsync以deamon方式运行

145创建备份模板 和备份 用户守护进程        151定时调用模板给推送

145    vim /etc/rsyncd.conf      rsyncd.conf配置文件

uid=root
gid=root
address=192.168.1.145  #写自己的ip
port=873
hosts allow=192.168.1.0/24
use chroot=yes
max connections=5
pid file=/var/run/rsyncd.pid
lock file=/var/run/rsync.lock
log file=/var/log/rsyncd.log
[wwwroot]
path=/www/
comment=used for web-data root
read only=false
list=yes
auth users=rsyncuser   #不是系统用户,不需要提前创建 只是用来同步数据
secrets file =/etc/rsync.passwd

注意注意  参数后面的空格最好都去掉

解释


uid=root

gid=root

address=192.168.1.145                 #监听IP

port=873                              #监听端口

hosts allow=192.168.0.0/24            #允许同步客户端的IP地址,或者用*表示所有 192.168.1.0/24或192.168.1.0/255.255.255.0

use chroot = yes                       #是否囚牢,锁定家目录,

max connections =5                     #最大连接数

pid file =/var/run/rsyncd.pid          #进程PID,自动生成

lock file =/var/run/rsync.lock         #指max connectios参数的锁文件

log file =/var/log/rsyncd.log          #日志文件位置

[wwwroot]                              #共享模块名称

path =/www/                      #路径

comment = used for web-data root    #描述

read only = false                                 #设置服务端文件读写权限

list = yes                                         #是否允许查看模块信息

auth users = rsyncuser                        #备份的用户,和系统用户无关

secrets file =/etc/rsync.passwd        #存放用户的密码文件,格式是  用户名:密码

exclude = .svn/ .git/  - runtime/      #不同步的文件

dont compress  #用来指定那些不进行压缩处理再传输的文件,默认值是 *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2  *.tbz

                           因为这些文件已经经过压缩咯,默认不用修改。

编辑密码 [root@145  ~]# vim /etc/rsync.passwd  

rsyncuser:123456          (这个用户是虚拟用户,不是系统用户,只是用来同步数据)

给权限     [root@145  ~]# chmod 600  /etc/rsync.passwd

启动服务测试

启动rsync与xinetd服务

[root@145  ~]# systemctl start xinetd  #启动xinetd服务

[root@145  ~]# systemctl enable xinetd  #将xinetd服务加入开机项

[root@145  ~]# rsync --daemon --config=/etc/rsyncd.conf  #加载配置文件rsyncd.conf启动rsync服务

[root@145  ~]# netstat -antup | grep :873

tcp        0      0:::873                      :::*                        LISTEN      45089/xinetd

rsync语法:   rsync 选项 用户名@备份源服务器IP::共享模块名 目标目录

[root@151 ~]# rsync -avz  /www/ rsyncuser@192.168.1.145::wwwroot

可以用这个先试一试 输入密码看是否能同步

有时候不同步,看看防火墙 在服务器上部署的时候防火墙是开的,需要添加873端口白名单需要在备份机上添加这是145

rsync -avz  /www/ --exclude "runtime*" rsyncuser@192.168.1.145::wwwroot   不同步的也可以在这加

[root@151 ~]# vim /etc/rsync.passwd

123456

[root@151 ~]# chmod 600  /etc/rsync.passwd

[root@151 ~]#rsync -avz --delete  /www/ rsyncuser@192.168.1.145::wwwroot --password-file=/etc/rsync.passwd  

这样做个定时就可以实现定时备份了

[root@151 ~]# vim autobackup.sh

#!/bin/bash

rsync -avz /www/ rsyncuser@192.168.1.145::wwwroot --password-file=/etc/rsync.passwd

[root@151 ~]# chmod +x autobackup.sh

[root@151~]# sh autobackup.sh

添加到定时

01 3 * * * sh /root/autobackup.sh

至此 定时 实现定时备份了就可以了

 

四、 rsyncd+sersync 时时同步

1、下载sersync   在151上安装下面操作都是在151上 (  从151上往145上同步 所以在151安装

在google code下载sersync的可执行文件版本,里面有配置文件与可执行文件

wget https://sersync.googlecode.com/files/sersync2.5.4_64bit_binary_stable_final.tar.gz(有时下载失败,所有要本地留存才行)这是我上传的zip的解压了一样的下载地址

上传到服务器  /usr/local/ 目录下

tar xvf sersync2.5.4_64bit_binary_stable_final.tar.gz     解压后他的文件名是 GNU-Linux-x86

mv GNU-Linux-x86 sersync    名字改成serync 里面机两个文件一个是二进制文件 一个是配置文件

2、配置sersync

修改24--28行
<sersync>
       <localpath watch="/www/">    #本地同步目录
           <remote ip="192.168.1.145" name="wwwroot"/>   #rsync模块名称
修改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开启sersync守护进程同步数据

/usr/local/sersync/sersync2  -d -r -o  /usr/local/sersync/confxml.xml

测试  在151上添加文件   看145上有没有变化 可动态查看 watch ls -l

4、设置sersync监控开机自动执行

vi /etc/rc.d/rc.local  #编辑,在最后添加一行

/usr/local/sersync/sersync2 -d -r -o  /usr/local/sersync/confxml.xml  #设置开机自动运行脚本

5、添加脚本监控sersync是否正常运行

vi  /usr/local/sersync/check_sersync.sh  #编辑,添加以下代码
#!/bin/sh
sersync="/usr/local/sersync/sersync2"
confxml="/usr/local/sersync/confxml.xml"
status=$(ps aux |grep 'sersync2'|grep -v 'grep'|wc -l)
if [ $status -eq 0 ];
then
$sersync -d -r -o $confxml &
else
exit 0;
fi
 chmod +x /usr/local/sersync/check_sersync.sh  #添加脚本执行权限  

把这个脚本加到任务计划,定期执行检测

 

 

 

补充: 多实例情况

1、配置多个confxml.xml文件(比如:www、bbs、blog....等等)

2、根据不同的需求同步对应的实例文件

/usr/local/sersync/sersync2  -d -o /usr/local/sersync/www_confxml.xml

/usr/local/sersync/sersync2  -d -o /usr/local/sersync/bbs_confxml.xml

修改配置之后需要重启

 

systemctl restart xinetd  重启 xinetd

systemctl restart rsyncd 重启 rsyncd

 

///************筛选 rsync 的传输目标*****************************/

 

筛选 rsync 的传输目标
使用 --exclude/--include 选项
可以使用 ––exclude 选项排除源目录中要传输的文件;同样地,也可以使用 ––include 选项指定要传输的文件。
例如:下面的 rsync 命令将 192.168.0.101 主机上的 /www 目录(不包含 /www/logs 和 /www/conf子目录)复制到本地的 /backup/www/ 。
# rsync -vzrtopg --delete --exclude "logs/" --exclude "conf/" --progress backup@192.168.0.101:/www/ /backup/www/
又如:下面的 rsync 命令仅复制目录结构而忽略掉目录中的文件。
# rsync -av --include '*/' --exclude '*' \
backup@192.168.0.101:/www/ /backup/www-tree/
选项 ––include 和 ––exclude 都不能使用间隔符。例如:
--exclude "logs/" --exclude "conf/"
不能写成 --exclude "logs/ conf/"
使用 --exclude-from/--include-from 选项
当 include/exclude 的规则较复杂时,可以将规则写入规则文件。使用规则文件可以灵活地选择传输哪些文件(include)以及忽略哪些文件(exclude)。
若文件/目录在剔除列表中,则忽略传输
若文件/目录在包含列表中,则传输之
若文件/目录未被提及,也传输之
在 rsync 的命令行中使用 ––exclude-from=FILE 或 ––include-from=FILE 读取规则文件。
规则文件 FILE 的书写约定:
每行书写一条规则 RULE
以 # 或 ; 开始的行为注释行
包含(include)和排除(exclude)规则的语法如下:
include PATTERN 或简写为 + PATTERN
exclude PATTERN 或简写为 - PATTERN
PATTERN 的书写规则如下:
以 / 开头:匹配被传输的根路径上的文件或目录
以 / 结尾:匹配目录而非普通文件、链接文件或设备文件
使用通配符
*:匹配非空目录或文件(遇到 / 截止)
**:匹配任何路径(包含 / )
?:匹配除了 / 的任意单个字符
[:匹配字符集中的任意一个字符,如 [a-z] 或 [[:alpha:]]
可以使用转义字符 \ 将上述通配符还原为字符本身含义
下面给出几个使用规则的例子:
例1:
# 不传输所有后缀为 .o 的文件
- *.o
# 不传输传输根目录下名为 foo 的文件或目录
- /foo
# 不传输名为 foo 的目录
- foo/
# 不传输 /foo 目录下的名为 bar 的文件或目录
- /foo/bar
例2:
# 传输所有目录和C语言源文件并禁止传输其他文件
+ */
+ *.c
- *
例3:
# 仅传输 foo 目录和其下的 bar.c 文件
+ foo/
+ foo/bar.c
- *
将规则写入规则文件之后,如何在命令行上使用它呢?下面给出一个例子:
首先将下面的规则存入名为 www-rsync-rules 的文件
# 不传输 logs 目录
- logs/
# 不传输后缀为 .tmp 的文件
- *.tmp
# 传输 Apache 虚拟主机文档目录(/*/ 匹配域名)
+ /srv/www/
+ /srv/www/*/
+ /srv/www/*/htdocs/
+ /srv/www/*/htdocs/**
# 传输每个用户的 public_html 目录(/*/ 匹配用户名)
+ /home/
+ /home/*/
+ /home/*/public_html/
+ /home/*/public_html/**
# 禁止传输其他
- *
然后即可使用类似如下的 rsync 命令:
rsync -av --delete --exclude-from=www-rsync-rules / remotehost:/dest/dir

/***************************************************/

有什么不懂的可以留言一块讨论

 

目录
相关文章
|
22天前
|
Web App开发 搜索推荐 Unix
Linux系统之MobaXterm远程连接centos的GNOME桌面环境
【10月更文挑战第21天】Linux系统之MobaXterm远程连接centos的GNOME桌面环境
185 4
Linux系统之MobaXterm远程连接centos的GNOME桌面环境
|
26天前
|
Unix Linux
Linux | Rsync 命令:16 个实际示例(下)
Linux | Rsync 命令:16 个实际示例(下)
33 3
Linux | Rsync 命令:16 个实际示例(下)
|
1月前
|
Linux 网络安全 数据安全/隐私保护
Linux系统之Centos7安装cockpit图形管理界面
【10月更文挑战第12天】Linux系统之Centos7安装cockpit图形管理界面
69 1
Linux系统之Centos7安装cockpit图形管理界面
|
1月前
|
Web App开发 网络协议 Linux
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
这篇文章是关于Linux命令的总结,涵盖了从基础操作到网络配置等多个方面的命令及其使用方法。
62 1
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
|
1月前
|
Linux Docker 容器
Centos安装docker(linux安装docker)——超详细小白可操作手把手教程,包好用!!!
本篇博客重在讲解Centos安装docker,经博主多次在不同服务器上测试,极其的稳定,尤其是阿里的服务器,一路复制命令畅通无阻。
598 4
Centos安装docker(linux安装docker)——超详细小白可操作手把手教程,包好用!!!
|
1月前
|
安全 Linux Shell
Linux | Rsync 命令:16 个实际示例(上)
Linux | Rsync 命令:16 个实际示例(上)
59 0
Linux | Rsync 命令:16 个实际示例(上)
|
1月前
|
存储 网络协议 Linux
AWS实操-EC2-创建购买linux(centos)EC2服务器
AWS实操-EC2-创建购买linux(centos)EC2服务器
|
2月前
|
NoSQL Linux Redis
linux之centos安装redis
linux之centos安装redis
|
2月前
|
Linux Python
Linux之centos安装clinkhouse以及python如何连接
Linux之centos安装clinkhouse以及python如何连接
|
2月前
|
Linux
linux之centos安装dataease数据报表工具
linux之centos安装dataease数据报表工具