实时备份工具

1. 常用实时同步工具

1.1 sersync

sersync是一个基于inotifyrsync的文件同步工具,设计用于实时监控指定目录或文件的变化,并在变化发生时自动触发同步操作,确保数据的实时一致性。

Sersync适用于需要进行实时数据同步的场景,如服务器同步、Web镜像备份等,其性能和可靠性得到了广泛认可。作为一个开源项目,Sersync拥有活跃的社区支持,用户可以从社区获得帮助和资源‌

官网 https://sersync.sourceforge.net/

1.2 inotify-tools

‌inotify-tools‌是一个用于监控文件系统变化的工具,它基于Linux内核的inotify子系统,提供了灵活的监控选项和输出格式。这个工具集包括两个主要的命令行工具:‌inotifywait‌和‌inotifywatch

Inotify 是一个 Linux特性,它监控文件系统操作,比如读取、写入和创建。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。学习如何将 inotify 集成到您的应用程序中,并发现一组可用来进一步自动化系统治理的命令行工具。

官网 https://inotify.aiken.cz/

1.3 ‌lsync‌

‌lsync‌是一个基于inotifyrsync的实时文件同步工具,设计用于高效地同步大量数据。它通过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 常用实时同步工具对比

工具说明优缺点
inotifyinotify本身是用来监控文件系统操作,能够检查目录/文件变化,一般通过和rsync组合,来做实时同步性能较差
sersync内置了inotifyrsync,通过配置文件控制同步目录性能较好,基本不更新
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-01192.168.202.131CentOS Linux release 7.9.2009 (Core)web服务器nginx
nfs-svr-01192.168.202.130CentOS Linux release 7.9.2009 (Core)网络存储服务器nfs-utils、rpcbind、sersync2
backup-svr-01192.168.202.128CentOS 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

本次搭建基本到达预期

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值