lsyncd基于lua语言开发,整合了rsync和notify 实现文件的实时同步
系统环境
cat /etc/issue
CentOS release 6.6 (Final)
uname -sr
Linux 2.6.32-504.el6.x86_64
服务器规划
rsync服务器: 192.168.10.241
rsync + lsyncd服务器 : 192.168.10.231
一.配置rsync服务器
1.配置xinetd来管理rsync,并编辑配置文件
yum install xinetd -y
vim /etc/xinetd.d/rsync
------------------------------------------------------------------------------------------------------------------------------
service rsync
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}
------------------------------------------------------------------------------------------------------------------------------
rpm -qa | grep rsync
rsync-3.0.6-6.el5_11
2.为rsync提供配置文件
全局选项
strict modes =yes
是否检查口令文件的权限
port = 873
默认端口873
log file = /var/log/rsyncd.log
日志记录文件
pid file = /var/run/rsyncd.pid
运行进程的ID写到哪里
[home]
path = /opt/
这里是认证的模块名,在client端需要指定
max connections = 0
客户端最大连接数,默认0(没限制)
uid = root
指定该模块传输文件时守护进程应该具有的uid
gid = root
指定该模块传输文件时守护进程应该具有的gid
ignore errors
可以忽略一些无关的IO错误
read only = no
no客户端可上传文件,yes只读
write only = no
no客户端可下载文件,yes不能下载
hosts allow = *
充许任何主机连接
hosts deny = 10.5.3.1
禁止指定的主机连接
auth users = root
认证的用户名,如果没有这行,则表明是匿名
secrets file = /etc/backserver.pas
指定认证口令文件位置
------------------------------------------------------------------------------------------------------------------------------
3.添加认证文件,并将权限修改为600# echo "root:123456" > /etc/backserver.pas# chmod 600 /etc/backserver.pas
ll /etc/backserver.pas
-rw------- 1 root root 11 Jul 27 15:22 /etc/backserver.pas
4.启动rsync服务端# /etc/init.d/xinetd start
Starting xinetd: [ OK ]
[root@localhost ~]# netstat -ntl | grep 873
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN
二.客户端配置lsyncd,基于lsyncd实现实时同步(延迟比较小)
1.1安装lsyncd
yum search lsyncd (源服务器安装) 如果找不到这个包,只能说明你没有安装centos的YUM扩展包,必须先安装扩展包
rpm -ivh
完成扩展包的安装之后,就可以安装lsyncd了
yum install lsyncd -y
1.2编译安装lsyncd
yum install lua lua-devel -y
wget -c
tar xf release-2.1.5
cd lsyncd-2.1.5
./configure
make && make install
2.提启动脚本
vim /etc/init.d/lsyncd
------------------------------------------------------------------------------------------------------------------------------
#!/bin/bash
#
# chkconfig: - 85 15
# description: Lightweight inotify based sync daemon
. /etc/init.d/functions
. /etc/sysconfig/network
[ "$NETWORKING" = "no" ] && exit 0
LSYNCD_OPTIONS="-pidfile /var/run/lsyncd.pid /etc/lsyncd.conf"
RETVAL=0
prog="lsyncd"
thelock=/var/lock/subsys/lsyncd
start() {
[ -f /etc/lsyncd.conf ] || exit 6
echo -n $"Starting $prog: "
if [ $UID -ne 0 ]; then
RETVAL=1
failure
else
daemon /usr/local/bin/lsyncd $LSYNCD_OPTIONS
RETVAL=$?
[ $RETVAL -eq 0 ] && touch $thelock
fi;
echo
return $RETVAL
}
stop() {
echo -n $"Stopping $prog: "
if [ $UID -ne 0 ]; then
RETVAL=1
failure
else
killproc lsyncd
RETVAL=$?
[ $RETVAL -eq 0 ] && rm -f $thelock
fi;
echo
return $RETVAL
}
reload(){
echo -n $"Reloading $prog: "
killproc lsyncd -HUP
RETVAL=$?
echo
return $RETVAL
}
restart(){
stop
start
}
condrestart(){
[ -e $thelock ] && restart
return 0
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
reload)
reload
;;
condrestart)
condrestart
;;
status)
status lsyncd
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|reload}"
RETVAL=1
esac
exit $RETVAL
------------------------------------------------------------------------------------------------------------------------------
3.编辑rsync客户端,提供添加密码文件,并将权限修改为600
echo "123456" > /etc/backserver.pas
chmod 600 /etc/backserver.pas
ll /etc/backserver.pas
-rw------- 1 root root 7 Jul 27 15:34 /etc/backserver.pas
4.编辑lsyncd配置文件
vim /etc/lsyncd.conf
------------------------------------------------------------------------------------------------------------------------------
settings {
logfile = "/tmp/lsyncd.log",
statusFile = "/tmp/lsyncd.status",
statusInterval = 5,
nodaemon = true,
}
本地同步
1.1 本地目录同步:direct:cp/rm/mv。 适用:500+万文件,变动不大
sync {
default.direct,
source = "/opt/src",
target = "/opt/dest",
delay = 1,
maxProcesses = 1,
}
1.2 本地目录同步rsync模式:rsync
sync{
default.rsync,
source = "/opt/",
target = "/home/mogilefs/",
delete = true,
exclude={ "test" },
rsync = {
compress = true,
verbose = true,
archive = true,
}
}
远程同步
2.1 远程同步: rsync模式 + rsyncd daemon
sync {
default.rsync,
source = "/opt/back3/",
target = "root@192.168.10.231::home",
delete = true,
exclude = { ".tmp" },
delay = 1,
rsync = {
binary = "/usr/bin/rsync",
archive = true,
compress = true,
verbose = true,
password_file = "/etc/backserver.pas",
_extra = {"--bwlimit=200"},
}
}
2.2 远程目录同步:rsync模式 + ssh shell
sync{
default.rsync,
source = "/opt/back/",
target = "root@192.168.10.241:/opt",
delete = true,
-- exclude={ "test" },
rsync = {
binary = "/usr/bin/rsync",
compress = true,
verbose = true,
archive = true,
rsh = "/usr/bin/ssh -p 22 -o StrictHostKeyChecking=no"
}
}
3 远程目录同步:rsync模式 + rsyncssh,效果与上面相同
sync {
default.rsyncssh,
source = "/opt/back2/",
host = "192.168.10.241",
targetdir = "/opt/",
-- excludeFrom = "/etc/rsyncd.d/rsync_exclude.lst",
maxDelays = 1,
delay = 1,
rsync = {
binary = "/usr/bin/rsync",
archive = true,
compress = true,
verbose = true,
_extra = {"--bwlimit=2000"},
},
ssh = {
port = 22
}
}
------------------------------------------------------------------------------------------------------------------------------
5.免密钥登陆(基于ssh同步需要在远端被同步的服务器上开启ssh无密码登录)
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.10.241
6.启动rlsyncd服务
/etc/init.d/lsyncd start
7.lsyncd的日志文件以及状态文件
tailf /tmp/lsyncd.log
Tue Jul 28 12:12:15 2015 Normal: recursive startup rsync: /opt/back3/ -> root@192.168.10.241::home/
Tue Jul 28 12:12:19 2015 Normal: Startup of "/opt/back3/" finished.
Tue Jul 28 12:13:07 2015 Normal: recursive startup rsync: /opt/back3/ -> root@192.168.10.241::home/
Tue Jul 28 12:13:12 2015 Error: Temporary or permanent failure on startup of "/opt/back3/". Terminating since "insist" is not set.
Tue Jul 28 12:13:14 2015 Normal: recursive startup rsync: /opt/back3/ -> root@192.168.10.241::home/
Tue Jul 28 12:13:18 2015 Error: Temporary or permanent failure on startup of "/opt/back3/". Terminating since "insist" is not set.
Tue Jul 28 12:13:35 2015 Normal: recursive startup rsync: /opt/back3/ -> root@192.168.10.241::home/
Tue Jul 28 12:13:38 2015 Normal: Startup of "/opt/back3/" finished.
Tue Jul 28 12:15:50 2015 Normal: recursive startup rsync: /opt/back3/ -> root@192.168.10.241::home/
Tue Jul 28 12:15:53 2015 Normal: Startup of "/opt/back3/" finished.
tailf /tmp/lsyncd.status
Sync1 source=/opt/back3/
There are 1 delays
active Init
Excluding:
nothing.
Inotify watching 1 directories
1: /opt/back3/
lsyncd.conf 主要配置选项说明:
settings配置段:
全局设置,--开头表示注释,下面是几个常用选项说明:
logfile 定义日志文件
stausFile 定义状态文件
nodaemon=true 表示不启用守护模式,默认
statusInterval 将lsyncd的状态写入上面的statusFile的间隔,默认10秒
inotifyMode 指定inotify监控的事件,默认是CloseWrite,还可以是Modify或CloseWrite or Modify
maxProcesses 同步进程的最大个数。假如同时有20个文件需要同步,而maxProcesses = 8,则最大能看到有8个rysnc进程
maxDelays 累计到多少所监控的事件激活一次同步,即使后面的delay延迟时间还未到
sync配置段:
定义同步参数,可以继续使用maxDelays来重写settings的全局变量。
一般第一个参数指定lsyncd以什么模式运行:rsync、rsyncssh、direct三种模式:
default.rsync :本地目录间同步,使用rsync,也可以达到使用ssh形式的远程rsync效果,或daemon方式连接远程rsyncd进程;
default.direct :本地目录间同步,使用cp、rm等命令完成差异文件备份;
default.rsyncssh :同步到远程主机目录,rsync的ssh模式,需要使用key来认证
source 同步的源目录,使用绝对路径。
target 定义目的地址.
三种模式的示例会在后面给出。
init 这是一个优化选项,当init = false,只同步进程启动以后发生改动事件的文件,原有的目录即使有差异也不会同步。默认是true
delay 累计事件,等待rsync同步延时时间,默认15秒(最大累计到1000个不可合并的事件)。也就是15s内监控目录下发生的改动,会累积到一次rsync同步,避免过于频繁的同步。(可合并的意思是,15s内两次修改了同一文件,最后只同步最新的文件)
excludeFrom 排除选项,后面指定排除的列表文件,如果是简单的排除,可以使用exclude = {"FILENAME"}。
这里的排除规则写法与原生rsync有点不同,更为简单:
监控路径里的任何部分匹配到一个文本,都会被排除,例如/var/web/test可以匹配规则web
如果规则以斜线/开头,则从头开始要匹配全部
如果规则以/结尾,则要匹配监控路径的末尾
?匹配任何字符,但不包括/
*匹配0或多个字符,但不包括/
**匹配0或多个字符,可以是/
delete 为了保持target与souce完全同步,Lsyncd默认会delete = true来允许同步删除。它除了false,还有startup、running值.
rsync:(提示一下,delete和exclude本来都是rsync的选项,上面是配置在sync中的,我想这样做的原因是为了减少rsync的开销)
bwlimit 限速,单位kb/s,与rsync相同(这么重要的选项在文档里竟然没有标出)
compress 压缩传输默认为true。在带宽与cpu负载之间权衡,本地目录同步可以考虑把它设为false
perms 默认保留文件权限。
其它rsync的选项
其它还有rsyncssh模式独有的配置项,如host、targetdir、rsync_path、password_file。
lsyncd.conf可以有多个sync,各自的source,各自的target,各自的模式,互不影响。
使用命令加载配置文件,启动守护进程,自动同步目录操作。
lsyncd -log Exec /usr/local/lsyncd-2.1.5/etc/lsyncd.conf
注意:1.lsyncd Version: 2.1.4版本以前 存在bug,不支持rsync的 password_file参数, lsyncd Version: 2.1.5已经修复,并且允许rsync客户端具有写权限。2.rsyncOps={"-avz","--delete"}这样的写法在2.1.*版本已经不支持。
本文出自 “Linux之旅” 博客,请务必保留此出处http://openlinuxfly.blog.51cto.com/7120723/1679279