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

191 阅读7分钟

一、为什么要同步:

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

二、什么是实时同步

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

三、实时同步工具有哪些

sersync+rsync

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

  • rsyncrsync 是一个开源的、快速的、多功能的、可实现增量数据传输的命令行工具。它可以在本地或远程主机之间同步文件和目录,支持复制链接、所有权保持、权限保持、时间戳保持等功能。rsync 可以通过 SSH 进行加密传输,也可以作为服务运行,通过 rsync 守护进程进行数据同步。
  • sersyncsersync 是一个基于 inotify 机制的开源工具,它可以监控指定目录中的文件变化(如文件的创建、删除、修改等),并触发 rsync 命令来同步这些变化到目标服务器。sersync 的目的是为了补充 rsync 的实时同步功能,因为 rsync 本身是基于周期性轮询的,而 sersync 可以在文件发生变化时立即响应。

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

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

四、如何配置sersync和rsync

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

五、实例拓扑图

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

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

1、关掉防火墙

systemctl stop firewalld
systemctl disable firewalld

2、安装安装 sersync

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

tar -xzvf sersync2.5.4_64bit_binary_stable_final.tar.gz
mv GNU-Linux-x86/ /usr/local/sersync
ln -s /usr/local/sersync/sersync2 /usr/bin/sersync2

3、查看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:~# vi /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:
max_user_watches 是 Linux 内核中的 inotify 监控机制的另一个参数。这个参数限制了每个用户可以监视的文件系统数量。
在 inotify 中,每个文件或目录的监视都是通过一个 “watch” 来实现的。
max_user_watches 参数设置了单个用户可以同时设置的 watch 的最大数量。如果超过这个限制,尝试添加新的 watch 将会失败。

这个限制是为了防止单个用户占用过多的系统资源,因为每个 watch 都会消耗一些内存资源。如果系统中有很多用户都在使用 inotify,
那么这个限制可以确保公平地分配资源。
查看同步目录,使用:find /data/ -type d | wc -l 统计,必须确保max_user_watches值大于统计结果

root@ubuntu:~# find /data/ -type d | wc -l
5831

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

这个限制是为了防止系统资源被过度消耗,因为每个 inotify 实例都会占用一定的内存和其他系统资源。
通过限制实例数量,系统可以控制资源的分配,确保所有用户之间资源的公平使用

4、配置**sersync**

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

<sersync>
        <localpath watch="/home">
            <remote ip="192.168.14.212" name="home"/>
        </localpath>
        <rsync>
            <commonParams params="-artuz"/>
            <auth start="true" users="user" passwordfile="/etc/rsyncd.secrets"/>
            <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-->
        <crontab start="false" schedule="600"><!--600mins-->
            <crontabfilter start="false">
                <exclude expression="*.php"></exclude>
                <exclude expression="info/*"></exclude>
            </crontabfilter>

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

4、启动**sersync**

配置完成后,您可以启动sersync服务,执行

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

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

1、关掉防火墙

systemctl stop firewalld
systemctl disable firewalld

2、安装**rsync**

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

yum install rsync 

3、配置rsync

如果您使用的是rsync服务器模式,您需要编辑/etc/rsyncd.conf或创建一个新的配置文件,定义模块和同步选项。

 [home]
        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 = user
        secrets file = /etc/rsyncd.secrets
        strict modes = yes
#允许源服务器连接
        hosts allow = 192.168.14.211
#       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、创建密码文件

创建一个密码文件/etc/rsyncd.secrets,其中包含auth users定义的用户的密码。

user:password

确保密码文件的权限非常严格,例如600,只有所有者可以读写。

chmod 600 /etc/rsyncd.secrets

5、启动rsync守护进程

在目标服务器上启动rsync守护进程。在 CentOS 上,这通常通过systemctl命令完成。

systemctl start rsyncd

完成这些步骤后,sersync将监控源服务器上的指定目录,并在检测到文件变化时使用rsync将这些变化同步到目标服务器上。

八、测试同步

请确保您测试同步功能以确保一切正常工作

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

useradd -m finemeng.com
cd finemeng.com
touch 1.txt

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