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 所有权
让我们来深入剖析这个核心区别:
| NFS | Sersync | |
|---|---|---|
| 核心理念 | 集中式存储 | 分布式副本 |
| 数据状态 | 只有一份物理数据 所有客户端通过网络操作服务器上的同一份文件 | 有多份物理数据 每个节点上都存有文件的完整副本 |
| 本质关系 | 共享与访问 我给你一个访问我家里文件的权限 | 复制与分发 我把我的文件完整地复印一份送到你家里 |
深入理解这个根本区别
1. 数据存在的物理形态不同
- NFS:数据在物理上只存在于NFS服务器上。客户端看到的只是一个“视图”或“映射”,就像Windows的网络驱动器。
- Sersync:数据在物理上存在于多台服务器上,每台服务器都有完整的、独立存储的文件实体。
2. 网络依赖性的根本差异
- NFS:强依赖网络。没有网络连接,客户端就无法访问任何数据,就像断网后无法访问网上邻居一样。
- Sersync:弱依赖网络。即使网络中断,每台服务器仍然可以正常访问自己本地已经同步的数据副本。网络只影响新变化的同步。
3. 性能瓶颈的来源不同
- NFS:性能瓶颈在NFS服务器和网络带宽。所有读写操作都要经过服务器。
- Sersync:性能瓶颈主要在同步过程的网络带宽。日常的读写操作都是在本地完成,性能极高。
4. 故障影响范围不同
- NFS:单点故障。NFS服务器宕机,所有客户端都无法工作。
- Sersync:局部故障。任何一台服务器宕机,其他服务器仍可独立正常工作。
现实世界的比喻
NFS就像在公司使用同一台中央服务器:
- 所有员工都编辑服务器上的同一个Excel文件
- 服务器坏了,所有人都没法工作
- 但所有人都能看到最新的实时数据
Sersync就像团队协作时各自保管文件副本:
- 每个人电脑上都有这个Excel文件的副本
- 有人更新后,通过邮件把最新版本发给其他人
- 即使某人的电脑坏了,其他人还能继续工作
- 但可能短暂存在版本不一致的情况
总结
回到最根本的区别:
- 选择NFS的根本原因:当你需要强一致性,确保所有用户看到的数据100%实时一致,且能接受单点故障风险和网络性能开销时。
- 选择Sersync的根本原因:当你需要高性能本地访问、高可用性和容灾能力,且能接受数据的最终一致性和多副本存储开销时。
这个根本区别决定了它们适用于完全不同的场景,不存在谁替代谁的问题,而是互补共存的关系。
Comments NOTHING