实时同步实战

实时同步概述

什么是实时同步

​ 实时同步是一种只要当前目录发生变化则会触发一个事件,事件触发后会将变化的目录同步至远程服务器。

为什么要实时同步

​ 保证数据的连续性,减少人力维护成本,解决NFS单点故障。

实时同步工具选择

  • sersync+Rsync(√)
  • inotify+Rsync

Inotify是一个通知接口,用来监控文件系统的各种变化,如果文件存取、删除、移动。可以非常方便地实现文件异动警告,增量备份,并针对目录或文件的变化及时做出响应。rsync+inotify可以实时触发式同步增量备份

sersync是国人基于rsync+inotify-tools开发的工具,不仅保留了优点,同时还强化了实时监控、文件过滤、简化配置等功能,帮助用户提高运行效率,节省时间和网络资源。sersync项目地址

Sersync实时同步实践

案例

​ 实现web上传视频文件,实则是写入NFS至存储,当NFS存在新的数据则会实时的复制到备份服务器

  • 1.web上传视频至NFS存储
  • 2.webNFS的数据都备份在备份服务器的/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-->卸载存储(本地)--->重新挂载存储(云端)
posted @ 2023-05-21 09:41  KKKDexter  阅读(74)  评论(0)    收藏  举报