实时同步实战
实时同步概述
什么是实时同步
实时同步是一种只要当前目录发生变化则会触发一个事件,事件触发后会将变化的目录同步至远程服务器。
为什么要实时同步
保证数据的连续性,减少人力维护成本,解决NFS单点故障。
实时同步工具选择
sersync+Rsync(√)inotify+Rsync
Inotify是一个通知接口,用来监控文件系统的各种变化,如果文件存取、删除、移动。可以非常方便地实现文件异动警告,增量备份,并针对目录或文件的变化及时做出响应。rsync+inotify可以实时触发式同步增量备份
sersync是国人基于rsync+inotify-tools开发的工具,不仅保留了优点,同时还强化了实时监控、文件过滤、简化配置等功能,帮助用户提高运行效率,节省时间和网络资源。sersync项目地址
Sersync实时同步实践
案例
实现web上传视频文件,实则是写入NFS至存储,当NFS存在新的数据则会实时的复制到备份服务器
- 1.
web上传视频至NFS存储 - 2.
web和NFS的数据都备份在备份服务器的/backup - 3.如何将
NFS数据实时同步到备份服务器的/data目录
环境准备
| 主机名 | 外网IP | 内网IP | 角色 |
|---|---|---|---|
| Web01 | 10.0.0.7 | 172.16.1.7 | Nfs客户端 |
| NFS | 10.0.0.31 | 172.16.1.31 | Nfs服务端、Rsync客户端 |
| Backup | 10.0.0.41 | 172.16.1.41 | Rsync服务端、Nfs服务端(备机) |
部署Backup服务器
### 安装Rsync
[root@backup ~]# yum -y install rsync
### 编辑配置文件
[root@backup ~]# vim /etc/rsyncd.conf
uid = www
gid = www
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
#####################################
[backup]
comment = welcome to oldboyedu backup!
path = /backup
[data]
path= /data
##### 配置文件解析
uid = www # 服务启动的用户
gid = www # 服务启动的用户组
port = 873 # 服务启动的端口号873(0~65535)
fake super = yes # 无需让rsync以root身份运行,允许接收文件的完整属性
use chroot = no # 禁锢推送的数据至某个目录,不允许跳出该目录
max connections = 200 # 最大链接数
timeout = 600 # 超时时间
ignore errors # 忽略错误信息
read only = false # 对备份文件可读写
list = false # 不允许查看模块信息
auth users = rsync_backup # 匿名用户,定义为虚拟用户,用来做链接用户
secrets file = /etc/rsync.passwd # 定义rsync服务用户链接认证密码和文件路径
log file = /var/log/rsyncd.log # rsync日志路径
#####################################
[data] # 定义模块信息
comment = welcome to oldboyedu backup! # 模块注释信息
path = /data # 定义接收备份数据目录
##### 注意:#会出现因注释不兼容的问题而导致推数据时出现报错,配置文件需取消注释或者注释进行换行处理!!!
### 创建用户
[root@backup ~]# groupadd -g 666 www
### 创建www用户,指定UID和GID,指定登录shell同时不创建家目录
[root@backup ~]# useradd -u 666 -g 666 www -s /sbin/nologin -M
### 创建备份目录
[root@backup ~]# mkdir /{backup,data}
### 授权备份目录的属主和属组为服务的启动用户
[root@backup ~]# chown -R www.www /{backup,data}
### 创建密码文件
[root@backup ~]# echo 'rsync_backup:123' > /etc/rsync.passwd
[root@backup ~]# cat /etc/rsync.passwd
rsync_backup:123
### 授权rsync的密码文件权限为600
[root@backup ~]# chmod 600 /etc/rsync.passwd
### 启动服务
[root@backup ~]# systemctl start rsyncd
### 加入开机自启
[root@backup ~]# systemctl enable rsyncd
### 检查进程
[root@backup ~]# ps -ef | grep rsync
root 7080 1 0 15:57 ? 00:00:00 /usr/bin/rsync --daemon --no-detach
部署NFS服务器
### 安装Rsync、inotify
[root@nfs ~]# yum -y install rsync inotify-tools
### 下载Sersync安装包
wget http://test.driverzeng.com/other/sersync2.5.4_64bit_binary_stable_final.tar.gz
### 创建Sersync安装目录
[root@nfs ~]# mkdir /application
### 解压Sersync安装包到/application
[root@nfs ~]# tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz -C /application/
### 更改GNU目录名字
[root@nfs ~]# mv /application/GNU-Linux-x86/ /application/sersync
### 修改配置文件
[root@nfs ~]# vim /application/sersync/confxml.xml
<fileSystem xfs="false"/> <!-- 文件系统 -->
<filter start="false"> <!-- 排除不想同步的文件-->
<exclude expression="(.*)\.svn"></exclude>
<exclude expression="(.*)\.gz"></exclude>
<exclude expression="^info/*"></exclude>
<exclude expression="^static/*"></exclude>
</filter>
# 将<inotify>下的内容修改为true
<inotify> <!-- 监控的事件类型 -->
<delete start="true"/>
<createFolder start="true"/>
<createFile start="true"/>
<closeWrite start="true"/>
<moveFrom start="true"/>
<moveTo start="true"/>
<attrib start="true"/>
<modify start="true"/>
</inotify>
# 监控目录,推送数据的目录/data
<sersync>
<localpath watch="/data"> <!-- 监控客户端的目录 -->
# rsync服务端的地址:172.16.1.41和模块名data
<remote ip="172.16.1.41" name="data"/> <!-- data的IP以及模块 -->
<!--<remote ip="192.168.8.39" name="tongbu"/>-->
<!--<remote ip="192.168.8.40" name="tongbu"/>-->
</localpath>
<rsync> <!-- rsync的选项 -->
# rsync命令执行的选项
<commonParams params="-az"/>
<auth start="true" users="rsync_backup" passwordfile="/etc/rsyncd.pass"/> <!-- true为打开认证,rsync_backup为匿名用户,passwordfile为本机的密码文件 -->
<userDefinedPort start="false" port="874"/><!-- port=874 -->
<timeout start="false" time="100"/><!-- timeout=100 -->
<ssh start="false"/>
</rsync>
### 创建密码文件
[root@backup ~]# echo '123' > /etc/rsyncd.pass
[root@backup ~]# cat /etc/rsyncd.pass
123
### 授权rsync的密码文件权限为600
[root@backup ~]# chmod 600 /etc/rsyncd.pass
### 启动Sersync服务
[root@nfs ~]# /application/sersync/sersync2 -rdo /application/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: -r rsync all the local files to the remote servers before the sersync work
option: -d run as a daemon
option: -o config xml name: /application/sersync/confxml.xml
………………省略部分输出信息………………
配置sersync详解图

启动参数
### 查看启动参数
[root@nfs sersync]# ./sersync2 -h
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
___________________________________________________
参数-d:启用守护进程模式
参数-r:在监控前,将监控目录与远程主机用rsync命令推送一遍
参数-n: 指定开启守护线程的数量,默认为10个
参数-o:指定配置文件,默认使用confxml.xml文件
参数-m:单独启用其他模块,使用 -m refreshCDN 开启刷新CDN模块
参数-m:单独启用其他模块,使用 -m socket 开启socket模块
参数-m:单独启用其他模块,使用 -m http 开启http模块
不加-m参数,则默认执行同步程序
### 启动Sersync, 如果需要同步多个目录, 那么需要配置多套环境
[root@nfs ~]# /usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml
NFS故障
如果NFS出现故障,将web客户端挂载至backup服务器上。
### nfs和backup两台服务器应该保持一样(nfs配置、nfs共享的目录、nfs的权限)
[root@backup ~]# yum install -y nfs-utils
[root@backup ~]# rsync -avz root@172.16.1.31:/etc/exports /etc/
### 创建用户
[root@backup ~]# groupadd -g 666 www
### 创建www用户,指定UID和GID,指定登录shell同时不创建家目录
[root@backup ~]# useradd -u 666 -g 666 www -s /sbin/nologin -M
### 启动nfs服务
[root@backup ~]# systemctl start rpcbind
[root@backup ~]# systemctl start nfs-server
### 修改rsync的权限
[root@backup ~]# vim /etc/rsyncd.conf
uid = www
gid = www
### 授权备份目录的属主和属组为服务的启动用户
[root@backup ~]# chown -R www.www /{backup,data}
### 重启rsync
[root@backup ~]# systemctl restart rsyncd
### 进行一次数据推送, 然后模拟nfs故障(挂起虚拟机)
### web强制卸载172.16.1.31:/data
[root@web01 ~]# umount -lf /data
### web尝试挂载172.16.1.41:/data
[root@web01 ~]# mount -t nfs 172.16.1.41:/data /data/
基于sersync海量文件实时同步:TP
lsyncd实时同步
lsyncs简介
Lysncd 是lua语言封装了 inotify 和 rsync 工具,采用了 Linux 内核(2.6.13 及以后)里的 inotify 触发机制,然后通过rsync去差异同步,达到实时的效果。
完美解决了 inotify + rsync海量文件同步带来的文件频繁发送文件列表的问题 ,通过时间延迟或累计触发事件次数实现。
配置方式简单,lua本身就是一种配置语言,可读性非常强。lsyncd也有多种工作模式可以选择,本地目录cp,本地目录rsync,远程目录rsyncssh。
实现简单高效的本地目录同步备份(网络存储挂载也当作本地目录)。
lsyncd实战
### lsyncd安装
[root@nfs ~]# yum install -y rsync lsyncd inotify-tools
### 实施监控
[root@nfs ~]# cat > /etc/lsyncd.conf << 'EOF'
settings {
logfile = "/var/log/lsyncd/lsyncd.log",
statusFile = "/var/log/lsyncd/lsyncd.status",
inotifyMode = "CloseWrite",
maxProcesses = 8,
}
sync {
default.rsync,
source = "/data",
target = "rsync_backup@172.16.1.41::data",
delete = true,
exclude = { ".*" },
delay = 1,
rsync = {
binary = "/usr/bin/rsync",
archive = true,
compress = true,
verbose = true,
password_file = "/etc/rsync.passwd",
_extra = {"--bwlimit=200"}
}
}
EOF
### 配置文件修改项
source = "/data", # 实时同步的客户端目录
target = "rsync_backup@172.16.1.41::data", # 实时同步的服务端
password_file = "/etc/rsync.passwd", # 实时同步的客户端密码文件
### 创建密码文件
[root@backup ~]# echo '123' > /etc/rsync.passwd
[root@backup ~]# cat /etc/rsync.passwd
123
### 授权,rsync要求密码文件的权限是600
[root@backup ~]# chmod 600 /etc/rsync.passwd
### 启动lsyncd服务
[root@nfs ~]# systemctl start lsyncd
### backup测试
[root@backup ~]# cd /data
[root@backup ~]# while true ;do ls |wc -l;sleep 0.1;done
### nfs测试
[root@nfs ~]# cd /data
[root@nfs ~]# for i in {1..1000};do echo "${i}"; echo "${i}" > ${i}.txt;sleep 0.1;done
配置文件解释
settings { # 全局设置
logfile = "/var/log/lsyncd/lsyncd.log", # 定义日志文件
statusFile = "/var/log/lsyncd/lsyncd.status", # 定义状态文件
inotifyMode = "CloseWrite", # 指定inotify监控的事件,还可以是Modify或CloseWrite or Modify。
maxProcesses = 8, # 最大进程数
maxDelays = 10, # 累计到多少所监控的事件激活一次同步,即使后面的delay延迟时间还未到。
nodaemon = true, # 默认不启用守护模式
statusInterval = 10, # 将lsyncd的状态写入上面的
statusFile的间隔,默认10秒。
}
sync { # 里面是定义同步参数,一般第一个参数指定lsyncd以什么模式运行,有rsync、rsyncssh、direct三种模式。
default.rsync, # 目录间同步,使用rsync命令。也可以达到使用ssh形式的远程rsync效果,或daemon方式连接远程rsyncd进程。
default.rsyncssh, # 同步到远程主机目录,rsync的ssh模式,需要使用key来认证。
default.direct, # 本地目录间同步,使用cp、rm等命令完成差异文件备份。
source = "/data", # 同步的源目录,即监控的目录。
target = "rsync_backup@172.16.1.41::data", # 同步的目标模块,用于rsync模式。
target = "rsync_backup@172.16.1.41:/data", # 同步的目标目录,可用于rsync和rsyncssh模式。
target = "/tmp", # 同步的本地目标目录,可用于direct和rsync模式。
delete = true, # 让目标目录和源目录数据保持一致。
init = true, # 当值为false,只同步进程启动以后发生改动事件的文件,原有的目录即使有差异也不会同步。
delay = 15, # 延时15秒同步,可避免过于频繁的同步。
excludeFrom = "", # 排除选项,后面指定排除的列表文件。
exclude = { ".*" }, # 排除匹配到的项,这里是排除的是隐藏文件。
rsync = {
binary = "/usr/bin/rsync", # rsync命令的绝对路径。
archive = true, # 递归,即同步子目录的内容。
compress = true, # 传输过程中压缩文件数据,相对其他压缩工具而言,它可以获得更好的压缩率,但是需要消耗CPU资源。
verbose = true, # 增加在传输过程中获得的信息量,提供有关正在传输文件的信息。
password_file = "/etc/rsync.password", # 密码文件路径
_extra = {"--bwlimit=1000"} # 传输限速,单位kb。
}
}
实时同步总结
1.为什么要使用实时同步?
1.解决nfs单点
2.大量的静态资源迁移(本地迁移云端)
2.实时同步能解决什么问题?
1.平滑的迁移
2.备份:减少人为的干预
3.实时同步工具选择?
rsync+inotify 少量文件同步,麻烦。同步大文件太慢,遍历扫描,非常影响效率。
sersync 配置简单,多线程同步,同步块。适合大量的小文件或者图片。
lsryncd
4.demo:用户上传文件-->web-->写入-->nfs存储-->inotify-->action-->rsync--->backup
用户上传文件-->web-->写入-->nfs存储(本地)--->实时的同步到-->存储(云端)
web-->卸载存储(本地)--->重新挂载存储(云端)

浙公网安备 33010602011771号