Linux下rsync+sersync实现数据远程实时同步

AI摘要:使用rsync和sersync实现Linux下数据实时同步,可防止数据丢失,提高数据一致性。sersync监控文件变化,rsync同步至远程服务器。配置需在源服务器安装sersync,目标服务器安装rsync,并配置相关参数。

Powered by AISummary.

一、为什么要同步

防止数据丢失,确保数据有备份,并且实时备。

二、什么是实时同步

实时同步是当前目录发生变化则会触发一个事件,事件触发后会将变化的目录同步至远程服务器。实时同步可以保证数据的连续性,减少数据的连续性,减少人力维护成本。

三、工具选择

sersync和rsync是两种用于文件同步的工具,它们通常一起使用来实现实时的文件同步和备份。

rsync 是一个开源的、快速的、多功能的、可实现增量数据传输的命令行工具。它可以在本地或远程主机之间同步文件和目录,支持复制链接、所有权保持、权限保持、时间戳保持等功能。rsync 可以通过 SSH 进行加密传输,也可以作为服务运行,通过 rsync 守护进程进行数据同步。


sersync 是一个基于 inotify 机制的开源工具,它可以监控指定目录中的文件变化(如文件的创建、删除、修改等),并触发 rsync 命令来同步这些变化到目标服务器。sersync 的目的是为了补充 rsync 的实时同步功能,因为 rsync 本身是基于周期性轮询的,而 sersync 可以在文件发生变化时立即响应。


将 sersync 和 rsync 结合使用可以实现高效的实时数据同步解决方案。例如,您可以在一个服务器上使用 sersync 监控重要的数据目录,当检测到文件变化时,它会自动调用 rsync 将变化同步到远程服务器或备份服务器上。

这种组合特别适合需要实时备份或同步大量数据的环境,因为它可以减少不必要的数据传输,并且能够在文件发生变化后立即同步,从而提高数据一致性和安全性。

四、如何配置sersync和rsync

要配置sersync和rsync实现文件同步,您需要分别在两台服务器上进行设置:一台作为sersync主机(通常是要监控的源服务器),另一台作为rsync目标服务器(备份服务器)。

五、实例拓扑图

六、在源服务器上安装和配置 sersync

1、安装 sersync

sersync 可能不在官方软件仓库中,您可能需要从源代码或预编译的二进制文件安装。可以从 sersync 的 GitHub 仓库或相关网站下载。

github下载地址

我已将这个软件保存到我的私有云,如果网络环境不好,可以自行领取。

我的网盘下载地址

下载后解压到自定义目录并重命名(sersync)即可(比如/usr/local)

2、查看notify参数并修改(默认值小)

root@ubuntu:~# sysctl -a | grep max_queued_events
fs.inotify.max_queued_events = 327679"
root@ubuntu:~# sysctl -a | grep max_user_instances
fs.inotify.max_user_instances = 128
root@ubuntu:~# sysctl -a | grep max_user_watches 
fs.epoll.max_user_watches = 3357081
fs.inotify.max_user_watches = 50000000
修改参数:
root@ubuntu:~# sysctl -w fs.inotify.max_queued_events="99999999"
fs.inotify.max_queued_events = 99999999
root@ubuntu:~# sysctl -w fs.inotify.max_user_watches="99999999"
fs.inotify.max_user_watches = 99999999
root@ubuntu:~# sysctl -w fs.inotify.max_user_instances="65535"
fs.inotify.max_user_instances = 65535
root@ubuntu:~# 
root@ubuntu:~# nano /etc/sysctl.conf      #最后一行增加以下三行参数
fs.inotify.max_queued_events=99999999
fs.inotify.max_user_watches=99999999
fs.inotify.max_user_instances=65535

三行参数说明:

max_queued_events:inotify:参数用于设置 inotify 实例事件队列的最大长度。换句话说,它指定了当 inotify 实例被监视的文件或目录产生事件时,可以排队等待处理的最大事件数。如果超过这个数值,新的事件可能会被丢弃,或者更准确地说,不会添加到队列中,导致监控者无法接收到这些事件的通知。这个参数对于调节 inotify 实例的行为是很重要的,因为它可以帮助用户平衡事件处理的效率和资源的使用。如果设置得太小,可能会丢失事件;如果设置得太大,可能会消耗过多的内存资源简单的说:实例事件队列最大长度,值太小,少了事件,会出现" Event Queue Overflow "错误,导致监控文件不准确。

max_user_watches:是 Linux 内核中的 inotify 监控机制的另一个参数。这个参数限制了每个用户可以监视的文件系统数量。在 inotify 中,每个文件或目录的监视都是通过一个 “watch” 来实现的。

max_user_watches:参数设置了单个用户可以同时设置的 watch 的最大数量。如果超过这个限制,尝试添加新的 watch 将会失败。这个限制是为了防止单个用户占用过多的系统资源,因为每个 watch 都会消耗一些内存资源。如果系统中有很多用户都在使用 inotify,那么这个限制可以确保公平地分配资源。

查看同步目录,使用:find /data/ -type d | wc -l 统计,必须确保max_user_watches值大于统计结果

max_user_instances:在 inotify 中,每个实例都是一个独立的监控机制,它可以包含多个 watch(即对文件或目录的监控)。max_user_instances 参数决定了单个用户可以同时运行的 inotify 实例的数量。如果一个用户尝试创建的实例数量超过了这个限制,那么创建新实例的尝试将会失败。

这个限制是为了防止系统资源被过度消耗,因为每个 inotify 实例都会占用一定的内存和其他系统资源。

通过限制实例数量,系统可以控制资源的分配,确保所有用户之间资源的公平使用。

3、配置sersync

编辑sersync的confxml.xml配置文件,位于/usr/local/sersync目录下。设置要监控的目录、rsync目标服务器信息、以及同步选项。

<?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="false"/> #需结合 <moveTo> 使用(可能引发冗余同步)
    <moveTo start="false"/> #需结合 <moveFrom> 使用(建议用 delete + create 替代移动操作)
    <attrib start="false"/>  #忽略属性变更(一般不需要开启)
    <modify start="true"/> #监控内容修改(必须启用)
    </inotify>

    <sersync>
    <localpath watch="/home"> #监控的源目录
        <remote ip="18.8.8.8" name="home"/>  #这里的ip为目标服务器ip或域名,name为rsync模块,这个名字要和目标服务器rsync配置文件对应
       
    </localpath>
    <rsync>
        <commonParams params="-artuz"/>
        <auth start="true" users="username" passwordfile="/etc/rsync.pas"/> #这里的username为自定义用户名,/etc/rsync.pas这个文件一会儿要创建
        <userDefinedPort start="false" port="873"/><!-- port=873 --> # rsync端口,必须在目标服务器端放行
        <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-->
    <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>
</head>

在这个配置中,是要监控的本地目录/home,remote部分指定了目标服务器的 IP 和远程rsync模块名称。rsync部分定义了rsync的通用参数和用户参数,以及要排除的文件。

4、创建密码文件

分别在源服务器和目标服务器上创建/etc/rsync.pas文件

重要的事情说3遍:一定要设置/etc/rsync.pas权限为600,一定要设置/etc/rsync.pas权限为600,一定要设置/etc/rsync.pas权限为600

源服务器rsync.pas内容为自定义密码,如:

123456

目标服务器rsync.pas内容为自定义用户名和同样的密码,如:

username:123456 #username为sersync的配置文件confxml.xml内设置的用户名

5、启动sersync服务

创建sersync服务

sudo nano /etc/systemd/system/sersync.service

填入如下代码:

[Unit]
Description=sersync2 File Synchronization
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/sersync/sersync2 -d -o /usr/local/sersync/confxml.xml
Restart=on-failure

[Install]
WantedBy=multi-user.target

启动sersync服务

sudo systemctl daemon-reload
sudo systemctl enable sersync
sudo systemctl start sersync

七、在目标服务器上安装和配置 rsync

1、关掉防火墙或者直接放行873端口

sudo systemctl stop firewalld
sudo systemctl disable firewalld

家宽需要端口映射

2、安装rsync

在大多数 Linux 发行版中,rsync已经预装了。如果没有,您可以通过包管理器安装它

sudo apt install rsync

3、配置rsync

创建配置文件/etc/rsyncd.conf,定义模块和同步选项。

 [home] #模块名称,要与sersync的配置文件confxml.xml内的模块名称一致
     path = /home #需要同步的目录
     use chroot = no
     max connections=20
     lock file = /var/lock/rsyncd
     log file = /var/log/rsync.log
     read only = no
     list = yes
     uid = root
     gid = root
     auth users = username #必须与`/etc/rsync.pas`内的username一致
     secrets file = /etc/rsync.pas #这个上一步已经创建了
     strict modes = yes
#允许源服务器连接
     hosts allow = *  #设置为`*`表示允许所有ip访问,也可以指定ip
#    hosts deny =
     ignore errors = no
     ignore nonreadable = yes
     transfer logging = no
#    log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes.
     timeout = 600
     refuse options = checksum dry-run
     dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz

在这个配置中,[remote_directory]是模块名,path是远程目录的路径,auth users是允许访问的用户,secrets file是包含密码的文件,hosts allow允许连接的客户端主机。

4、启动rsync守护进程

在目标服务器上启动rsync服务。

创建rsync服务

sudo nano /etc/systemd/system/rsync.service

填入如下代码:

[Unit]
Description=fast remote file copy program daemon
After=network.target

[Service]
Type=forking
ExecStart=/usr/bin/rsync --daemon --config=/etc/rsyncd.conf
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

启动rsync服务

sudo systemctl daemon-reload
sudo systemctl enable rsync
sudo systemctl start rsync

八、测试同步

在源服务器的/home目录下,创建用户目录,新建文件。

在目标服务器上是不是有实时同步显示。

无标签
打赏
评论区
头像
文章目录

本站已运行: