Rsync + Sersync 数据实时同步

 

实时同步方案:

一、rsync+inotify与rsync+sersync架构的区别

1、rsync+inotify (不推荐,inotify是对本地文件或目录的实时监控)
a、inotify只能记录下被监听的目录发生了变化(增,删,改)并没有把具体是哪个文件或者哪个目录发生了变化记录下来;
b、rsync在同步的时候,并不知道具体是哪个文件或目录发生了变化,每次都是对整个目录进行同步,当数据量很大时,整个目录同步非常耗时(rsync要对整个目录遍历查找对比文件),因此效率很低


2、rsync+sersync (推荐,是inotify的升级版,功能更强大,本篇篇文章就使用该方案)
a、sersync可以记录被监听目录中发生变化的(增,删,改)具体某个文件或目录的名字;
b、rsync在同步时,只同步发生变化的文件或目录(每次发生变化的数据相对整个同步目录数据来说很小,rsync在遍历查找对比文件时,速度很快),因此效率很高。
c、sersync 调用 rsync 客户端命令将更新的目录和文件增量同步到 rsync 服务器,实现数据同步;

部署环境

服务器名称 IP地址 服务包
应用服务器(客户端) 192.168.1.129 rsync、sersync
备份服务器(服务端) 192.168.1.130 rsync
[root@localhost ~]# date
2023年 06月 01日 星期四 15:55:14 CST
[root@localhost ~]# cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core)

安装rsync (客户端、服务端都要进行安装,一般系统自带)

安装rsync,我们可以分为两种方式:源码方式安装和RPM方式安装。
注意:rsync软件无论是服务器端还是客户端都是同一个软件包。
RPM方式:
直接挂载镜像使用yum进行安装
#yum安装rsync
yum install -y rsync

源码方式:
rsync官网:
https://rsync.samba.org/ftp/rsync/
https://download.samba.org/pub/rsync/src/
https://rsync.samba.org/download.html

1)、下载
wget https://download.samba.org/pub/rsync/src/rsync-3.2.3.tar.gz

2)、解压并安装
tar -xvf rsync-3.2.3.tar.gz

3)、编译安装
# 源码安装rsync时,其编译时所需要的gcc库文件尽量提前安装完毕
# 默认安装到/usr/local/目录下
./configure
make &&make install

4)、设置开机启动
echo "/usr/local/bin/rsync --daemon -config=/etc/rsyncd.conf" >>/etc/profile

服务端配置 

rsync的配置分为服务器端和客户端,使用rsync协议,需要服务端启动守护进程

#以rsync用户启动进程
uid = rsync
gid = rsync

#禁锢推送的数据至某个文件夹,不允许跳出该目录
use chroot = no  

max connections = 200        #最大连接数
transfer logging = yes    #使rsync服务器使用ftp格式的文件来记录下载和上载操作在自己单独的日志中。
pid file = /var/run/rsyncd.pid    #进程信息文件,便于获取进程号停止进程,便于判断服务是否启动,避免反复启动 
lock file = /var/run/rsyncd.lock    #锁文件
log file = /var/log/rsyncd.log    #服务运行时日志文件
timeout = 900

#无需让rsync以root身份运行,允许接收文件的完整属性
fake super = yes

port = 873    #服务默认端口号873
address = 192.168.1.130    #指定服务器ip地址
auth users = rsyncbackup  # 虚拟用户,全局配置
secrets file = /etc/rsync.passwd #密码文件,包含客户机使用定义认证用户连接服务器需要的用户和密码信息
hosts allow = 192.168.1.129  # 允许访问rsync服务器的客户端白名单 
hosts deny = *   #禁止访问rsync服务器的客户端黑名单      
read only = false    #指定备份目录的权限为可读可写
list = false    #是否可以列表
 
[129]  # 模块名称,可以定义多个
Comment = data129    # 模块注释信息
path = /data/         #定义接受备份数据目录
ignore errors    #跳过错误

创建同步用户并启动

#需要一个rsync进程运行时使用的普通用户 rsync
useradd rsync -M -s /sbin/nologin

# 服务端需要定义一个客户端连接    虚拟用户名和密码
# 密码文件形式  user:passwd
echo "rsyncbackup:123456" > /etc/rsync.passwd
chmod 600 /etc/rsync.passwd

# 准备模块定义好的目录,客户端的数据都存放在该目录下
mkdir /data/
chown -R  rsync.rsync /data/

# 启动服务
rsync --daemon --config /etc/rsyncd.conf

# 查看服务
ps aux | grep rsync
netstat -lntp|grep 873

客户端使用

# 在客户端安装完毕rsync服务后,是不需要启动rsync服务的。
# 我们只需要在客户端创建连接rsync服务器时,验证码用户所需要的密码文件即可。
# 该密码文件中的密码要与rsync服务器上的密码文件中的密码对应
# 并且也要与rsync服务器rsyncd.conf配置文件中的认证模块中的用户匹配

echo123456”>>/etc/rsync.passwd
chmod 600 /etc/rsync.passwd

配置完成后服务端与客户端防火墙设置允许rsync端口通信
firewall-cmd --permanent --zone=public --add-port=873/tcp
firewall-cmd --reload

# 查看 rsync 守护程序分配的所有 module 列表,可以执行下面命令。
# 具体写法是服务器与目标目录之间使用双冒号分隔`::`
# 地址中的module并不是实际路径名,而是 rsync 守护程序指定的模块名
rsync rsync://192.168.1.129

# 把本地的文件同步到远程服务器
# rsync [OPTION]… [SRC]… [USER@]HOST::DEST
# rsync [选项] [--port=]  [--password-file=] [本地目录] [用户名]@服务端IP::[模块名]
rsync -avz  --delete  --password-file=/etc/rsync.passwd /rsync rsyncbackup@192.168.1.130::129


# 把远程机器的文件同步到本地
# rsync [OPTION]… [USER@]HOST::SRC [DEST]
# rsync [选项] [--port=] [--password-file=] [用户名@]服务端IP::[模块名]  [本地目录]
rsync -avz  --delete  --password-file=/etc/rsync.passwd rsyncbackup@192.168.1.130::129 /rsync

rsync使用

同步模式
1.本地同步
##本地  rsync   选项       源      目标
Local:  rsync [OPTION...] SRC... [DEST]

#将/etc目录备份到/opt目录下,和cp的区别在于会自动增量备份
rsync -avz /etc /opt

2.远程同步
ssh协议
# 默认使用 SSH 进行远程登录和数据传输
# 不需要做任何配置,需要都安装rsync,操作上类似scp

#将远端文件拉(下载)到本地
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
         
#将本地文件推送(上传)到远端
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
 
#将etc推送到10.10.10.10下的自定义文件夹下
rsync -az /etc/ 10.10.10.10:/opt/etc-$(hostname)-$(date +%F)
常用参数
-v, –verbose详细模式输出。

-a, –archive归档模式,表示以递归方式传输文件,并保持所有文件属性不变。

-z, –compress对备份的文件在传输时进行压缩处理。

–delete:删除那些DST中存在而在SRC中没有的文件。

注意:
# 保持服务端于客户端上数据完全一致,服务端有则同步给客户端,服务端没有,客户端有的则从客户端删除
# –delete 选项,表示客户端上的数据要与服务器端完全一致,多则删之,少则补之
# 用的时候要小心点,最好不要把已经有重要数所据的目录,当做本地更新目录,否则会把你的数据全部删除


所有参数
-a:–archive archive mode 权限保存模式,相当于 -rlptgoD 参数,存档,递归,保持属性等。
-r:–recursive 复制所有下面的资料,递归处理。
-p:–perms 保留档案权限,文件原有属性。
-t:–times 保留时间点,文件原有时间。
-g:–group 保留原有属组。
-o:–owner 保留档案所有者(root only)。
-D:–devices 保留device资讯(root only)。
-l:–links 复制所有的连接,拷贝连接文件。
-z:–compress 压缩模式,当资料在传送到目的端进行档案压缩。
-H:–hard-links 保留硬链接文件。
-A:–acls 保留ACL属性文件,需要配合–perms。
-P:-P参数和 --partial --progress 相同,只是为了把参数简单化,表示传进度。
--version:输出rsync版本。
-v:–verbose 复杂的输出信息。
-u:–update 仅仅进行更新,也就是跳过已经存在的目标位置,并且文件时间要晚于要备份的文件,不覆盖新的文件。
--port=PORT:定义rsyncd(daemon)要运行的port(预设为tcp 873)。

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

--delete-before: 接收者在传输之前进行删除操作

--password-file=FILE :从 指定密码文件中获取密码。
--bwlimit=KBPS:限制 I/O 带宽。
--filter “-filename”:需要过滤的文件。
--exclude=filname:需要过滤的文件。
--progress:显示备份过程。

安装sersync

wget https://down.whsir.com/downloads/sersync2.5.4_64bit_binary_stable_final.tar.gz
tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz 
mv /usr/local/GNU-Linux-x86 /usr/local/sersync

#备份原来配置文件
mv /usr/local/sersync/confxml.xml /usr/local/sersync/confxml.xml.bak
#写入新配置文件
vim /usr/local/sersync/confxml.xml
    

<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
    <host hostip="localhost" port="8008"></host>
    <debug start="false"/>
    <fileSystem xfs="false"/>  <!-- 文件系统 -->
    <filter start="false">  <!-- 排除不想同步的文件 -->
    <exclude expression="(.*)\.svn"></exclude>
    <exclude expression="(.*)\.gz"></exclude>
    <exclude expression="^info/*"></exclude>
    <exclude expression="^static/*"></exclude>
    </filter>
    <inotify>  <!-- 监控的事件类型 -->
    <delete start="true"/>
    <createFolder start="true"/>
    <createFile start="true"/>
    <closeWrite start="true"/>
    <moveFrom start="true"/>
    <moveTo start="true"/>
    <attrib start="false"/>
    <modify start="false"/>
    </inotify>
 
    <sersync>
    <localpath watch="/rsync">  <!-- 监控的目录 -->
        <remote ip="192.168.1.130" name="129"/>  <!--服务端IP地址和模块-->
    </localpath>
    <rsync>
        <commonParams params="-artuz"/>  <!--开启用户认证,虚拟用户和密码文件路径-->
        <auth start="true" users="rsyncbackup" passwordfile="/etc/rsync.passwd"/>
        <userDefinedPort start="false" port="874"/><!-- port=874 -->
        <timeout start="false" time="100"/><!-- timeout=100 -->
        <ssh start="false"/>
    </rsync>
    <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once  默认配置60分钟执行一次检查-->
    <crontab start="false" schedule="600"><!--600mins-->
        <crontabfilter start="false">
        <exclude expression="*.php"></exclude>
        <exclude expression="info/*"></exclude>
        </crontabfilter>
    </crontab>
    <plugin start="false" name="command"/>
    </sersync>
 
    <plugin name="command">
    <param prefix="/bin/sh" suffix="" ignoreError="true"/>    <!--prefix /opt/tongbu/mmm.sh suffix-->
    <filter start="false">
        <include expression="(.*)\.php"/>
        <include expression="(.*)\.sh"/>
    </filter>
    </plugin>
 
    <plugin name="socket">
    <localpath watch="/opt/tongbu">
        <deshost ip="192.168.138.20" port="8009"/>
    </localpath>
    </plugin>
    <plugin name="refreshCDN">
    <localpath watch="/data0/htdocs/cms.xoyo.com/site/">
        <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>
        <sendurl base="http://pic.xoyo.com/cms"/>
        <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
    </localpath>
    </plugin>
</head>

启动服务:/usr/local/sersync/sersync2 -d -r -o /usr/local/sersync/confxml.xml

创建sersync守护脚本

vim selt-sersync.sh
##当sersync服务进程数小于1时,服务进行启动

#!/bin/bash
server_file="/usr/local/GNU-Linux-x86/sersync2"
conf_file="/usr/local/GNU-Linux-x86/confxml.xml"
options="-d -r -o"
proc_num=$(ps -ef|grep -i sersync2|grep -v "grep"|wc -l)
if [ $proc_num -lt 1 ];then
    cd $(dirname $server_file)
    nohup $server_file $options $conf_file &
else
    exit 0;
fi



chmod +x selt-sersync.sh
crontab -l 
* * * * * /bin/sh /usr/local/GNU-Linux-x86/selt-sersync.sh /dev/null 2>&1          ##每一分钟执行这个脚本

 

posted @ 2023-06-01 15:44  聆听说书人  阅读(371)  评论(0编辑  收藏  举报