linux中级_Sersync实时同步服务

TJCcc 发布于 2025-11-26 26 次阅读


Sersync 实时同步服务详细笔记

1. Sersync 基本概念

1.1 什么是 Sersync

Sersync 是基于 Inotify 和 Rsync 的实时同步解决方案,主要用于服务器之间的文件实时同步。

1.2 个人理解

在架构中的应用场景

  • 当NFS服务器成为单点故障或性能瓶颈时,可以使用Sersync构建分布式存储
  • 比如:web01 作为主服务器,使用Sersync将数据实时同步到web02(备份服务器)
  • 这样即使主服务器故障,备份服务器可以立即接管服务
  • 特别适合图片、视频等需要高可用的静态文件同步

2. Sersync 工作原理

2.1 核心组件

  • Inotify:Linux内核的文件系统监控机制
  • Rsync:远程数据同步工具
  • Sersync:监控文件变化并触发Rsync同步

2.2 工作流程

文件变化 → Inotify监控 → Sersync处理 → Rsync同步 → 目标服务器

3. Sersync 安装部署

3.1 环境准备

# 检查内核支持Inotify
ls /proc/sys/fs/inotify/
# 应该看到:max_queued_events max_user_instances max_user_watches

# 安装依赖
yum install rsync inotify-tools -y
# 或
apt-get install rsync inotify-tools -y

3.2 安装 Sersync

# 下载Sersync(以64位为例)
wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/sersync/sersync2.5.4_64bit_binary_stable_final.tar.gz

# 解压安装
tar -zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz
mv GNU-Linux-x86 /usr/local/sersync
ln -s /usr/local/sersync/sersync2 /usr/bin/sersync

# 设置执行权限
chmod +x /usr/local/sersync/sersync2
chmod +x /usr/bin/sersync

4. Sersync 配置详解

4.1 主配置文件 confxml.xml

<?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="true">
        <exclude expression="(.*)\.svn"></exclude>
        <exclude expression="(.*)\.gz"></exclude>
        <exclude expression="^info/*"></exclude>
        <exclude expression="^static/*"></exclude>
        <exclude expression="\.tmp$"></exclude>
    </filter>

    <!-- Inotify监控设置 -->
    <inotify>
        <delete start="true"/>
        <createFolder start="true"/>
        <createFile start="true"/>
        <closeWrite start="true"/>
        <moveFrom start="true"/>
        <moveTo start="true"/>
        <attrib start="false"/>
        <modify start="false"/>
    </inotify>

    <!-- 主同步服务器配置 -->
    <sersync>
        <!-- 本地监控目录 -->
        <localpath watch="/oldboy/images">
            <!-- 远程目标服务器 -->
            <remote ip="172.16.1.201" name="images"/>
            <!-- 可以配置多个目标服务器 -->
            <!-- <remote ip="172.16.1.202" name="images"/> -->
        </localpath>

        <!-- Rsync配置 -->
        <rsync>
            <commonParams params="-az"/>
            <auth start="true" users="rsync_user" passwordfile="/etc/rsync.pass"/>
            <userDefinedPort start="false" port="874"/>
            <timeout start="false" time="100"/>
            <ssh start="false"/>
        </rsync>

        <!-- 失败日志记录 -->
        <failLog path="/var/log/sersync_fail.log" timeToExecute="60"/>

        <!-- 定时完整同步 -->
        <crontab start="true" schedule="600">
            <crontabfilter start="true">
                <exclude expression="*.php"></exclude>
                <exclude expression="info/*"></exclude>
            </crontabfilter>
        </crontab>

        <!-- 插件设置 -->
        <plugin start="false" name="command"/>
    </sersync>

    <!-- 插件配置 -->
    <plugin name="command">
        <param prefix="/bin/sh" suffix="" ignoreError="true"/>
        <filter start="false">
            <include expression="(.*)\.php"/>
            <include expression="(.*)\.sh"/>
        </filter>
    </plugin>
</head>

4.2 配置文件关键参数说明

监控设置

  • localpath watch:指定要监控的本地目录
  • remote ip:目标服务器IP和模块名

同步触发事件

  • createFile:创建文件
  • createFolder:创建目录
  • delete:删除文件或目录
  • closeWrite:文件写入完成(重要)
  • moveFrom/moveTo:移动操作

Rsync参数

  • commonParams:rsync命令参数
  • auth:认证信息
  • userDefinedPort:自定义rsync端口

5. 目标服务器 Rsync 配置

5.1 安装配置 Rsync 服务端

# 安装rsync
yum install rsync -y

# 创建配置目录
mkdir /etc/rsync

5.2 Rsync 服务端配置 /etc/rsyncd.conf

# /etc/rsyncd.conf
uid = root
gid = root
use chroot = no
max connections = 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log

# 模块配置

[images]

path = /oldboy/images comment = Web Images Directory ignore errors = yes read only = no write only = no list = no auth users = rsync_user secrets file = /etc/rsync.pass hosts allow = 172.16.1.0/24 hosts deny = *

5.3 创建认证文件

# 创建密码文件
echo "rsync_user:123456" > /etc/rsync.pass
chmod 600 /etc/rsync.pass

# 启动rsync服务(守护进程模式)
rsync --daemon --config=/etc/rsyncd.conf

# 检查服务
netstat -tlnp | grep rsync

6. Sersync 服务管理

6.1 启动 Sersync

# 前台启动(测试用)
sersync -r -d -o /usr/local/sersync/confxml.xml

# 后台启动
sersync -d -o /usr/local/sersync/confxml.xml

# 参数说明:
# -d: 守护进程模式
# -r: 先执行全量同步
# -o: 指定配置文件

6.2 多目录监控配置

如果需要监控多个目录,可以创建多个配置文件:

# 创建图片同步配置
cp /usr/local/sersync/confxml.xml /usr/local/sersync/confxml_images.xml

# 创建视频同步配置  
cp /usr/local/sersync/confxml.xml /usr/local/sersync/confxml_videos.xml

# 分别启动
sersync -d -o /usr/local/sersync/confxml_images.xml
sersync -d -o /usr/local/sersync/confxml_videos.xml

6.3 服务管理脚本

创建管理脚本 /etc/init.d/sersync

#!/bin/bash
# chkconfig: 2345 90 10
# description: Sersync Real-time Sync Service

CONFIG_FILE="/usr/local/sersync/confxml.xml"
PROG="/usr/bin/sersync"

start() {
    echo "Starting sersync..."
    $PROG -d -o $CONFIG_FILE
    echo "Sersync started."
}

stop() {
    echo "Stopping sersync..."
    killall sersync2
    echo "Sersync stopped."
}

status() {
    pid=$(pgrep sersync2)
    if [ -n "$pid" ]; then
        echo "Sersync is running (PID: $pid)"
    else
        echo "Sersync is stopped"
    fi
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        sleep 2
        start
        ;;
    status)
        status
        ;;
    *)
        echo "Usage: $0 {start|stop|restart|status}"
        exit 1
esac

设置执行权限:

chmod +x /etc/init.d/sersync
chkconfig --add sersync

7. 实时同步测试

7.1 测试同步功能

# 在主服务器创建测试文件
touch /oldboy/images/test.jpg
echo "test content" > /oldboy/images/test.txt

# 在目标服务器检查
ls -la /oldboy/images/
cat /oldboy/images/test.txt

# 测试文件修改
echo "modified content" >> /oldboy/images/test.txt

# 测试文件删除
rm -f /oldboy/images/test.jpg

7.2 监控同步日志

# 查看实时同步日志
tail -f /var/log/sersync_fail.log

# 查看rsync日志
tail -f /var/log/rsyncd.log

8. 高级配置与优化

8.1 性能优化配置

<!-- 优化版本的confxml.xml -->
<inotify>
    <delete start="true"/>
    <createFolder start="true"/>
    <createFile start="false"/>  <!-- 关闭创建监控,由closeWrite处理 -->
    <closeWrite start="true"/>
    <moveFrom start="true"/>
    <moveTo start="true"/>
    <attrib start="false"/>      <!-- 关闭属性变化监控 -->
    <modify start="false"/>      <!-- 关闭修改监控 -->
</inotify>

<sersync>
    <localpath watch="/oldboy/images">
        <remote ip="172.16.1.201" name="images"/>
    </localpath>
    <rsync>
        <commonParams params="-az --bwlimit=10240"/>  <!-- 限制带宽10MB -->
        <auth start="true" users="rsync_user" passwordfile="/etc/rsync.pass"/>
        <timeout start="true" time="30"/>  <!-- 设置超时 -->
    </rsync>
</sersync>

8.2 多目标同步架构

<!-- 一对多同步配置 -->
<localpath watch="/oldboy/images">
    <remote ip="172.16.1.201" name="images"/>
    <remote ip="172.16.1.202" name="images"/>
    <remote ip="172.16.1.203" name="images"/>
</localpath>

8.3 故障转移配置

#!/bin/bash
# 故障转移监控脚本

PRIMARY_SYNC="172.16.1.201"
BACKUP_SYNC="172.16.1.202"

check_sync_target() {
    ping -c 3 $1 > /dev/null 2>&1
    return $?
}

# 监控主同步目标
if ! check_sync_target $PRIMARY_SYNC; then
    echo "Primary sync target failed, switching to backup"
    # 修改配置文件,指向备份服务器
    sed -i "s/$PRIMARY_SYNC/$BACKUP_SYNC/g" /usr/local/sersync/confxml.xml
    # 重启sersync服务
    killall sersync2
    sleep 2
    sersync -d -o /usr/local/sersync/confxml.xml
fi

9. 故障排查

9.1 常见问题解决

# 1. 检查inotify限制
cat /proc/sys/fs/inotify/max_user_watches
# 如果太小,可以调整:
echo "819200" > /proc/sys/fs/inotify/max_user_watches

# 2. 检查rsync连接
rsync -az --list-only rsync://rsync_user@172.16.1.201/images

# 3. 检查密码文件权限
ls -l /etc/rsync.pass
# 应该是600权限

# 4. 手动测试rsync同步
rsync -az /oldboy/images/test.jpg rsync_user@172.16.1.201::images/

9.2 日志分析

# 查看同步失败日志
tail -f /var/log/sersync_fail.log

# 查看系统日志
tail -f /var/log/messages | grep sersync

# 调试模式启动
sersync -d -o /usr/local/sersync/confxml.xml --debug

10. 生产环境部署建议

10.1 架构设计

主服务器 (web01) → Sersync → 备份服务器 (web02)
                         ↘
                           → 备份服务器 (web03)

10.2 监控方案

#!/bin/bash
# Sersync监控脚本

# 检查sersync进程
if ! pgrep sersync2 > /dev/null; then
    echo "Sersync is not running, restarting..."
    /usr/bin/sersync -d -o /usr/local/sersync/confxml.xml
fi

# 检查同步延迟
LAST_SYNC=$(stat -c %Y /var/log/sersync_fail.log)
CURRENT_TIME=$(date +%s)
DELAY=$((CURRENT_TIME - LAST_SYNC))

if [ $DELAY -gt 300 ]; then
    echo "Sersync may be delayed: $DELAY seconds"
    # 发送告警
fi

11.提问

nfs和sersync的区别是什么,作用不是一样的吗。

说到最根本的区别,我们可以用一句话来概括:

NFS是让多台机器“访问”同一份数据,而Sersync是让多台机器“拥有”同一份数据。


最根本的区别:访问权 vs 所有权

让我们来深入剖析这个核心区别:

NFSSersync
核心理念集中式存储分布式副本
数据状态只有一份物理数据
所有客户端通过网络操作服务器上的同一份文件
有多份物理数据
每个节点上都存有文件的完整副本
本质关系共享与访问
我给你一个访问我家里文件的权限
复制与分发
我把我的文件完整地复印一份送到你家里

深入理解这个根本区别

1. 数据存在的物理形态不同

  • NFS:数据在物理上只存在于NFS服务器上。客户端看到的只是一个“视图”或“映射”,就像Windows的网络驱动器。
  • Sersync:数据在物理上存在于多台服务器上,每台服务器都有完整的、独立存储的文件实体。

2. 网络依赖性的根本差异

  • NFS强依赖网络。没有网络连接,客户端就无法访问任何数据,就像断网后无法访问网上邻居一样。
  • Sersync弱依赖网络。即使网络中断,每台服务器仍然可以正常访问自己本地已经同步的数据副本。网络只影响新变化的同步。

3. 性能瓶颈的来源不同

  • NFS:性能瓶颈在NFS服务器网络带宽。所有读写操作都要经过服务器。
  • Sersync:性能瓶颈主要在同步过程的网络带宽。日常的读写操作都是在本地完成,性能极高。

4. 故障影响范围不同

  • NFS单点故障。NFS服务器宕机,所有客户端都无法工作。
  • Sersync局部故障。任何一台服务器宕机,其他服务器仍可独立正常工作。

现实世界的比喻

NFS就像在公司使用同一台中央服务器:

  • 所有员工都编辑服务器上的同一个Excel文件
  • 服务器坏了,所有人都没法工作
  • 但所有人都能看到最新的实时数据

Sersync就像团队协作时各自保管文件副本:

  • 每个人电脑上都有这个Excel文件的副本
  • 有人更新后,通过邮件把最新版本发给其他人
  • 即使某人的电脑坏了,其他人还能继续工作
  • 但可能短暂存在版本不一致的情况

总结

回到最根本的区别:

  • 选择NFS的根本原因:当你需要强一致性,确保所有用户看到的数据100%实时一致,且能接受单点故障风险和网络性能开销时。
  • 选择Sersync的根本原因:当你需要高性能本地访问高可用性容灾能力,且能接受数据的最终一致性和多副本存储开销时。

这个根本区别决定了它们适用于完全不同的场景,不存在谁替代谁的问题,而是互补共存的关系。