实时同步工具
1. 常用实时同步工具
1.1 sersync
sersync
是一个基于inotify
和rsync
的文件同步工具,设计用于实时监控指定目录或文件的变化,并在变化发生时自动触发同步操作,确保数据的实时一致性。
Sersync适用于需要进行实时数据同步的场景,如服务器同步、Web镜像备份等,其性能和可靠性得到了广泛认可。作为一个开源项目,Sersync拥有活跃的社区支持,用户可以从社区获得帮助和资源
1.2 inotify-tools
inotify-tools
是一个用于监控文件系统变化的工具,它基于Linux内核的inotify
子系统,提供了灵活的监控选项和输出格式。这个工具集包括两个主要的命令行工具:inotifywait
和inotifywatch
Inotify 是一个 Linux特性,它监控文件系统操作,比如读取、写入和创建。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。学习如何将 inotify 集成到您的应用程序中,并发现一组可用来进一步自动化系统治理的命令行工具。
1.3 lsync
lsync
是一个基于inotify
和rsync
的实时文件同步工具,设计用于高效地同步大量数据。它通过Linux内核2.6.13及以后版本中的inotify触发机制,利用rsync进行差异同步,达到实时同步的效果。
lsync的主要特点和优势包括:
- 实时同步:通过inotify机制监控文件系统的变化,当文件或目录发生变化时,立即通过rsync进行差异同步,确保数据的一致性。
- 高效传输:lsync能够高效地传输海量数据,通过优化算法减少不必要的数据传输,节省带宽和计算资源。
- 简单配置:lsync的配置使用Lua语言编写,配置灵活且易于理解,支持多种工作模式,如本地目录cp、本地目录rsync、远程目录rsyncssh等。
- 解决频繁发送文件列表问题:通过时间延迟或累计触发事件次数,lsync解决了inotify+rsync在处理海量文件同步时可能遇到的频繁发送文件列表的问题。
- 适用于多种场景:无论是本地到本地的同步,还是本地到远程的同步,lsync都能提供快速且高效的解决方案。
此外,lsync还支持通过Zabbix进行监控,提供分布式系统监视以及网络监视功能,确保服务器系统的安全运营,并通过灵活的通知机制快速定位和解决问题。这使得lsync成为企业级应用中一个重要的组成部分,特别是在需要实时监控和数据同步的场景中
官网 https://github.com/axkibe/lsyncd
2. 工具对比
2.1 常用实时同步工具对比
工具 | 说明 | 优缺点 |
---|---|---|
inotify | inotify本身是用来监控文件系统操作,能够检查目录/文件变化,一般通过和rsync 组合,来做实时同步 | 性能较差 |
sersync | 内置了inotify 和rsync ,通过配置文件控制同步目录 | 性能较好,基本不更新 |
lsync | 通过配置实现实时同步 | 性能较好 |
drbd | 同步基于磁盘分区级别(block),通常给数据库做高可用 | 一般为主备模式,主节点正常运行,则备节点一直不可用 |
2.2 sersync和lsyncd对比
sersync和lsyncd都是用于实时同步文件的工具,但它们在设计、功能和使用场景上有所不同。
- sersync:
sersync是一个国内开发者开源的工具,使用C++编写,采用多线程方式进行同步,具有失败重传机制和对临时文件的过滤功能。它自带crontab定时同步功能,支持配置文件管理,但自2011年后没有更新,文档和社区支持可能相对有限。
sersync的性能优化主要体现在对大文件的同步异常处理上,通过多线程和重传机制提高同步的稳定性和可靠性。它的设计初衷是为了解决inotify+rsync在大文件同步时可能出现的问题,尽管它提供了较高的性能,但在功能和配置的灵活性方面可能不如lsyncd。 - lsyncd:
lsyncd实际上是用Lua语言封装了inotify和rsync工具,利用Linux内核的inotify触发机制,通过rsync进行差异同步,达到实时效果。它的特点是配置简单,可读性强,支持多种工作模式,包括本地目录cp、本地目录rsync、远程目录rsyncssh等。
lsyncd的优势在于解决了inotify+rsync在处理大量文件同步时频繁发送文件列表的问题,通过时间延迟或累计触发事件次数实现优化。它的配置方式简单直观,非常适合需要简单实时同步的场景。
综上所述,sersync和lsyncd各有优势。sersync在性能和稳定性方面表现更优,适合对性能要求较高和对大文件同步有特殊需求的场景;而lsyncd则在配置灵活性和易用性方面更胜一筹,适合需要简单实时同步的场景。
3. 实践
3.1 sersync
我们将使用nfs
+rsync
+sersync
搭建全网备份及实时备份
1. 简易架构
说明:
- web服务器们把
/upload
挂载到NFS服务器/webupload
,共享存储用户上传的数据,图片,视频等等。这部分数据可能会频繁更改,也相对来说比较重要,所以进行实时备份。在NFS服务器安装sersync
,实时检测/webupload
变化,并同步到备份服务器的/Realtime_backup
目录中。 - web服务器上的其他数据
/data
,可能包括:网页文件,配置文件,程序等,变化频率不会很频繁,所以进行日备份或定时备份。这部分内容直接备份到备份服务器的/backup
目录中 - 数据库文件备份不在本文的实践范围中,后面会单独整理一个篇幅进行实践
2. 服务器
服务器 | ip | 系统版本 | 说明 | 安装软件 |
---|---|---|---|---|
web-svr-01 | 192.168.202.131 | CentOS Linux release 7.9.2009 (Core) | web服务器 | nginx |
nfs-svr-01 | 192.168.202.130 | CentOS Linux release 7.9.2009 (Core) | 网络存储服务器 | nfs-utils、rpcbind、sersync2 |
backup-svr-01 | 192.168.202.128 | CentOS Linux release 7.9.2009 (Core) | 备份服务器 | rsync |
3. 搭建简易web服务器
yum install -y nginx
[root@web-svr-01 html]# cat /etc/nginx/nginx.conf
...
http {
...
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root /data/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /data/html;
}
...
修改网页文件路径,当然这不是必须的,为了演示整体备份效果而已
[root@web-svr-01 html]# curl 127.0.0.1
hello, this is test rsync
[root@web-svr-01 html]# curl 127.0.0.1/page
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
创建模拟用户上传数据路径/upload
[root@web-svr-01 html]# mkdir /upload
4. 配置NFS服务器
安装nfs
及依赖rpcbind
yum install -y nfs-utils rpcbind
配置nfs
[root@nfs-svr-01 ~]# mkdir /webupload
[root@nfs-svr-01 ~]# chown nfsnobody.nfsnobody /webupload/
[root@nfs-svr-01 ~]# cat /etc/exports
/webupload 192.168.202.1/24(rw,all_squash)
[root@nfs-svr-01 ~]# systemctl restart nfs
[root@nfs-svr-01 ~]# showmount -e 192.168.202.130
Export list for 192.168.202.130:
/webupload 192.168.202.1/24
web服务器挂载nfs存储目录
[root@web-svr-01 html]# showmount -e 192.168.202.130
Export list for 192.168.202.130:
/webupload 192.168.202.1/24
[root@web-svr-01 html]# mount -t nfs 192.168.202.130:/webupload /upload
[root@web-svr-01 html]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 894M 0 894M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 22M 889M 3% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/mapper/centos-root 17G 15G 2.1G 89% /
/dev/sdb1 4.8G 321M 4.3G 7% /mnt/sdb
/dev/sda1 1014M 168M 847M 17% /boot
tmpfs 182M 0 182M 0% /run/user/0
192.168.202.130:/webupload 17G 16G 1.8G 90% /upload
测试
[root@web-svr-01 html]# touch /upload/123
[root@web-svr-01 html]# ll /upload/
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Sep 5 14:09 123
[root@nfs-svr-01 ~]# ll /webupload/
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Sep 5 14:40 123
5. 配置备份服务器
安装rysnc
[root@backup-svr-01 share]# yum install -y rsync
配置rsync
可以参考https://blog.csdn.net/u010230019/article/details/141682071,这里笔者在此基础上进行修改
[root@backup-svr-01 ~]# useradd -s /sbin/nologin -M rsync
[root@backup-svr-01 ~]# id rsync
uid=1003(rsync) gid=1004(rsync) groups=1004(rsync)
[root@backup-svr-01 ~]# chown rsync.rsync /backup/
[root@backup-svr-01 ~]# ll /backup/ -d
drwxr-xr-x 2 rsync rsync 6 Aug 29 16:39 /backup/
[root@backup-svr-01 ~]# echo "rsync_bak_01:rsync" > /etc/rsync.passwd
[root@backup-svr-01 ~]# cat /etc/rsync.passwd
rsync_bak_01:rsync
[root@backup-svr-01 ~]# chmod 400 /etc/rsync.passwd
[root@backup-svr-01 ~]# ll /etc/rsync.passwd
-r-------- 1 root root 19 Aug 29 16:51 /etc/rsync.passwd
修改配置文件
[root@backup-svr-01 share]# cat /etc/rsyncd.conf
# /etc/rsyncd: configuration file for rsync daemon mode
uid = rsync
gid = rsync
use chroot = no
max connections = 4
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
# exclude = lost+found/
# transfer logging = yes
timeout = 900
# ignore nonreadable = yes
# dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
fake super = yes
[backup]
path = /backup/
ignore errors
read only = false
list = true
hosts allow = 192.168.202.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_bak_01
secrets file = /etc/rsync.passwd
[Realtime_backup]
path = /Realtime_backup/
ignore errors
read only = false
list = true
hosts allow = 192.168.202.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_bak_01
secrets file = /etc/rsync.passwd
配置客户端(即NFS存储服务器)
[root@nfs-svr-01 html]# cat /etc/rsync.passwd
rsync
验证
[root@nfs-svr-01 html]# rsync -avz /etc/hostname rsync_bak_01@192.168.202.128::backup --password-file=/etc/rsync.passwd
sending incremental file list
hostname
sent 106 bytes received 43 bytes 14.19 bytes/sec
total size is 11 speedup is 0.07
[root@backup-svr-01 ~]# cat /backup/hostname
web-svr-01
到这里,常规的备份内容基本结束了,剩下的定时任务和打包数据等可以参考以前的文章
6. 实时同步部分
在NFS服务器安装sersync,通过inotify监控
/webupload
(即web服务器的upload
)目录内文件变化,并进行推送到备份服务器
sersync 官网为我们提供了二进制安装包,下载并上传到本地。笔者下载的是
sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@nfs-svr-01 share]# tar -zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz
GNU-Linux-x86/
GNU-Linux-x86/sersync2
GNU-Linux-x86/confxml.xml
可以看到sersync
提供的工具包中,只包括一个执行文件和一个配置文件
首先,我们修改配置文件
[root@nfs-svr-01 share]# cat sersync/confxml.xml
...
<sersync>
#修改本地同步目录,实时监测
<localpath watch="/webupload">
#配置远程服务器IP及模块名,推送数据
<remote ip="192.168.202.128" name="Realtime_backup"/>
<!--<remote ip="192.168.8.39" name="tongbu"/>-->
<!--<remote ip="192.168.8.40" name="tongbu"/>-->
</localpath>
<rsync>
<commonParams params="-artuz"/>
#配置rsync的用户及密码
<auth start="true" users="rsync_bak_01" passwordfile="/etc/rsync.passwd"/>
<userDefinedPort start="false" port="874"/><!-- port=874 -->
<timeout start="false" time="100"/><!-- timeout=100 -->
<ssh start="false"/>
</rsync>
#faillog更换路径,并且每60分钟对失败的log进行重新同步
<failLog path="/usr/local/share/sersync/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>
...
创建连接
[root@nfs-svr-01 share]# mv GNU-Linux-x86 sersync
[root@nfs-svr-01 share]# ln -s /usr/local/share/sersync/sersync2 /usr/bin/sersync2
开启守护进程
[root@nfs-svr-01 sersync]# sersync2 -dro /usr/local/share/sersync/confxml.xml
set the system param
execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
parse the command param
option: -d run as a daemon
option: -r rsync all the local files to the remote servers before the sersync work
option: -o config xml name: /usr/local/share/sersync/confxml.xml
daemon thread num: 10
parse xml config file
host ip : localhost host port: 8008
daemon start,sersync run behind the console
use rsync password-file :
user is rsync_bak_01
passwordfile is /etc/rsync.passwd
config xml parse success
please set /etc/rsyncd.conf max connections=0 Manually
sersync working thread 12 = 1(primary thread) + 1(fail retry thread) + 10(daemon sub threads)
Max threads numbers is: 22 = 12(Thread pool nums) + 10(Sub threads)
please according your cpu ,use -n param to adjust the cpu rate
------------------------------------------
rsync the directory recursivly to the remote servers once
working please wait...
execute command: cd /webupload && rsync -artuz -R --delete ./ rsync_bak_01@192.168.202.128::Realtime_backup --password-file=/etc/rsync.passwd >/dev/null 2>&1
run the sersync:
watch path is: /webupload
7. 验证
搭建完成实时备份后,加上前面web服务器使用的NFS网络存储系统,理论上,我们在web服务器的/upload
目录中新增文件,在NFS服务器/webupload
和备份服务器/Realtime_backup
目录中,几乎也会同时新增相同文件,下面让我们看看是不是这样的:
web服务器
[root@web-svr-01 upload]# touch "this is a test file"
[root@web-svr-01 upload]# ll
total 0
-rw-r--r-- 1 root root 0 Sep 5 16:05 123
-rw-r--r-- 1 nfsnobody nfsnobody 0 Sep 5 16:38 123456
-rw-r--r-- 1 nfsnobody nfsnobody 0 Sep 5 16:48 this is a test file
NFS服务器
[root@nfs-svr-01 sersync]# ll /webupload/
total 0
-rw-r--r-- 1 root root 0 Sep 5 16:05 123
-rw-r--r-- 1 nfsnobody nfsnobody 0 Sep 5 16:38 123456
-rw-r--r-- 1 nfsnobody nfsnobody 0 Sep 5 16:48 this is a test file
备份服务器
[root@backup-svr-01 share]# ll /Realtime_backup/
total 0
-rw-r--r-- 1 rsync rsync 0 Sep 5 16:05 123
-rw-r--r-- 1 rsync rsync 0 Sep 5 16:38 123456
-rw-r--r-- 1 rsync rsync 0 Sep 5 16:48 this is a test file
本次搭建基本到达预期