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 仓库或相关网站下载。
我已将这个软件保存到我的私有云,如果网络环境不好,可以自行领取。
下载后解压到自定义目录并重命名(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 rsync3、配置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目录下,创建用户目录,新建文件。
在目标服务器上是不是有实时同步显示。

