Lsyncd实时同步
1、实时同步简介
实时同步是指当存储服务器中数据新增、删除或发生改变后,立刻将变化后的数据同步至备份服务器,保持存储服务器和备份服务器之间数据的统一。
1.1 实时同步使用场景
1.解决NFS单点故障问题
2.备份NFS服务器数据,提供冗余服务
1.2 实时同步实施难点
1.什么条件下才对数据同步?
2.同步哪些文件?
3.多久同步一次?
4.使用什么工具同步?
2、Inotify实现实时同步
2.1 Inotify简介
Inotify是一个Linux特性,提供了文件系统事件监控机制;它监控文件系统操作,比如读取、写入和创建。Linux-2.6.13内核起加入inotify支持。
查看系统是否支持inotify
[root@nfs ~]# ll /proc/sys/fs/inotify/
总用量 0
-rw-r--r-- 1 root root 0 11月 25 15:00 max_queued_events
-rw-r--r-- 1 root root 0 11月 25 15:00 max_user_instances
-rw-r--r-- 1 root root 0 11月 25 15:00 max_user_watches
#状态解释
max_queued_events #设置inotify实例事件(event)队列可容纳的事件数量
max_user_instances #设置每个用户可以运行的inotify或者inotifywatch命令的进程数
max_user_watches #设置inotifywait或者inotifywatch命令可以监视的文件数量(单进程)
2.2 inotify工具安装使用
使用inotify工具监控存储服务器本地数据是否发生变化,当监控到本地数据变化,将变化之后的数据使用Rsync工具同步至备份服务器。
存储服务器安装inotify-tools工具
[root@nfs ~]# yum -y install http://www6.atomicorp.com/channels/atomic/centos/7/x86_64/RPMS/inotify-tools-3.13-2.el7.art.x86_64.rpm
inotifywait命令选项
-m #始终保持事件监听状态
-r #递归查询目录
-q #仅打印监控事件信息
--timefmt #指定时间输出格式
--format #指定事件输出格式
-e #指定事件,增、删、改等事件
-t #超时时间
-exclude #排除指定文件或目录,不区分大小写
#事件输出格式
%T #调用并显示定义好的时间格式
%w #显示发生变化的文件路径
%f #显示监控到的文件名称,和%w一起显示文件的绝对路径
%e #显示事件类型
#事件说明
access #读取文件或目录内容
modify #修改文件或目录内容
create #在监视目录下创建文件或目录
delete #删除监视目录下的文件或目录
attrib #文件或目录属性改变
close #文件被关闭
open #文件或目录被打开
move #文件或目录被移动到监视目录
umount #卸载文件系统
inotifywait监控命令测试
#创建数据存放目录/data,使用inotifywait命令监控/data目录变化
[root@nfs ~]# mkdir /data
[root@nfs ~]# inotifywait -mrq --format '%w%f' -e create,delete,modify /data/
#此时当/data目录有create,delete,modify事件时,会将触发事件的文件绝对路径打印出来
#监控多个目录,并显示时间与触发的事件信息
[root@nfs ~]# inotifywait -mrq --timefmt '%F %H:%M' --format '%T %w%f %e' -e create,delete,modify /data/ /backup/
2.3 Inotify+Rsync实现实时同步
#环境准备
NFS存储服务器:利用inotify+rsync工具撰写实时同步脚本
Backup备份服务器:Rsync服务模式,配置/backup目录为数据备份目录,模块名称为backup
#存储服务器安装Rsync,撰写实时同步脚本
[root@nfs ~]# mkdir /scripts
[root@nfs ~]# vim /scripts/inotify_rsync.sh
#!/bin/bash
#配置rsync客户端虚拟用户密码
export RSYNC_PASSWORD='passwd'
#使用监测数据目录变化,将变化的文件绝对路径通过管道符传递给while循环进行读取,进行传输
inotifywait -mrq --format '%w%f' -e create,delete,modify /data/ | while read line
do
if [ -f ${line} ];then
rsync -avz ${line} rsync_backup@10.0.0.16::backup
else
rsync -avz --delete /data/ rsync_backup@10.0.0.16::backup
fi
done
[root@nfs ~]# chmod +x /scripts/inotify_rsync.sh
[root@nfs ~]# /scripts/inotify_rsync.sh
#在存储服务器数据目录创建文件,查看备份服务器实时同步是否成功
[root@nfs /data]# touch file1
[root@nfs /data]# ls
file1
[root@backup ~]# ls /backup/
file1
注意:虽然Inotify+Rsync可以实现实时同步,但其效率低下,同步延迟较高。
3、Sersync实现实时同步
Sersync = Inotify + Rsync
Inotify有监控的功能,而Rsync有数据同步的功能,Sersync的功能就是监控某个目录,当这个目录触发事件时(插入、删除、修改等事件)就自动触发Rsync将数据变化及时的同步到备份服务器。
Sersync服务部署
#环境准备
NFS存储服务器:Rsync + inotify + Sersync
Backup备份服务器:Rsync服务模式
#存储服务器下载安装Sersync工具
[root@nfs ~]# cd /opt/
[root@nfs /opt]# wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/sersync/sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@nfs /opt]# tar -xf sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@nfs /opt]# cd GNU-Linux-x86/
[root@nfs /opt/GNU-Linux-x86]# ls
confxml.xml sersync2
[root@nfs /opt/GNU-Linux-x86]# cp confxml.xml confxml.xml.bak
#修改sersync配置文件
[root@nfs /opt/GNU-Linux-x86]# vim confxml.xml
<sersync>
<localpath watch="/data"> #监控的本地目录,需要同步的目录
<remote ip="10.0.0.16" name="backup"/> #备份服务器的IP和rsync模块名称
<!--<remote ip="192.168.8.39" name="tongbu"/>-->
<!--<remote ip="192.168.8.40" name="tongbu"/>-->
</localpath>
<rsync>
<commonParams params="-az"/> #本地rsync工具使用选项
<auth start="true" users="rsync_backup" passwordfile="/etc/rsync.pass"/> #rsync虚拟用户名和密码文件
<userDefinedPort start="false" port="874"/><!-- port=874 -->
<timeout start="false" time="100"/><!-- timeout=100 -->
<ssh start="false"/>
</rsync>
<failLog path="/tmp/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 /opt/GNU-Linux-x86]# echo 'passwd' > /etc/rsync.pass
[root@nfs /opt/GNU-Linux-x86]# chmod 600 /etc/rsync.pass
#启动sersync服务
[root@nfs /opt/GNU-Linux-x86]# ./sersync2 -rdo confxml.xml
[root@nfs /opt/GNU-Linux-x86]# ps aux | grep '[s]ersync'
root 36134 0.0 0.0 92336 756 ? Ssl 17:09 0:00 ./sersync2 -rdo confxml.xml
#在存储服务器数据目录创建文件,查看备份服务器实时同步是否成功
[root@nfs /data]# touch test1
[root@nfs /data]# ls
test1
[root@backup /backup]# ls
test1
注意:Sersync服务可以实现实时同步,但性能还是不够高,效率比较低;虽说可以通过多个配置文件启动多个Sersync服务解决效率问题,但是Sersync服务程序已经停止维护不再更新。
4、Lsyncd实现实时同步
Lysncd是lua语言封装了inotify和rsync工具,采用了Linux内核中的inotify触发机制,然后通过rsync去差异同步,达到实时的效果。它最令人称道的特性是完美解决了inotify+rsync海量文件同步带来的频繁发送文件列表的问题 (通过时间延迟或累计触发事件次数实现)。
Lsyncd服务部署
#环境准备
NFS存储服务器:lsyncd服务
Backup备份服务器:Rsync服务模式
#存储服务器配置阿里云扩展源
[root@nfs ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@nfs ~]# curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
#存储服务器安装lsyncd服务
[root@nfs ~]# yum -y install lsyncd
#修改lsyncd配置文件
settings {
logfile = "/var/log/lsyncd/lsyncd.log",
statusFile = "/var/log/lsyncd/lsyncd.status",
inotifyMode = "CloseWrite",
maxProcesses = 10,
maxDelays = 10,
nodaemon = true,
statusInterval = 10,
}
sync {
default.rsync,
source = "/data",
target = "rsync_backup@10.0.0.16::backup",
delay = 1,
delete = true,
exclude = {".*"},
rsync = {
binary = "/usr/bin/rsync",
password_file = "/etc/rsync.pass",
archive = true,
compress = true,
verbose = true,
_extra = {"--bwlimit=20"},
}
}
#配置文件解析
[root@nfs ~]# vim /etc/lsyncd.conf
settings { #全局配置
logfile = "/var/log/lsyncd/lsyncd.log", #服务日志文件存放位置
statusFile = "/var/log/lsyncd/lsyncd.status", #数据传输日志存放位置
inotifyMode = "CloseWrite", #inotify事件监控模式
maxProcesses = 10, #同步时最大进程数
maxDelays = 10, #累计多少监控事件后激活一次同步
nodaemon = true, #是否启用守护模式,默认不启用
statusInterval = 10, #数据传输日志写入间隔,默认10秒
}
sync { #定义sync同步参数
default.rsync, #同步使用rsync模式,有rsync、rsyncssh、direct三种模式
source = "/data", #源目录(监控目录),需要同步的数据存放目录
target = "rsync_backup@10.0.0.16::backup", #目标备份服务器rsync虚拟用户和目标模块
delay = 1, #延迟同步,可避免过于频繁的同步
init = true #进程启动时是否先进行一次同步
delete = true, #使得目标目录和源目录数据保持一致
exclude = {".*"}, #排除匹配到的项,可以使用通配符,这里排除隐藏文件
excludeFrom = "" #排除列表,后面指定排除的列表文件
rsync = {
binary = "/usr/bin/rsync",
password_file = "/etc/rsync.pass", #rsync虚拟用户密码文件
archive = true, #相当于rsync的-a选项
compress = true, #相当于rsync的-z选项
verbose = true, #相当于rsync的-v选项
_extra = {"--bwlimit=20"}, #扩展选项
}
}
[root@nfs ~]# echo 'passwd' > /etc/rsync.pass
[root@nfs ~]# chmod 600 /etc/rsync.pass
#启动服务并设置开机自启
[root@nfs ~]# systemctl start lsyncd.service
[root@nfs ~]# systemctl enable lsyncd.service
#在存储服务器数据目录创建文件,查看备份服务器实时同步是否成功
[root@nfs /data]# touch testfile
[root@nfs /data]# ls
testfile
[root@backup /backup]# ls
testfile
建议:lsyncd服务实现实时同步效率较高,若服务器系统支持,建议使用lsyncd服务实现数据实时同步备份。