问题背景
使用lsyncd rsyncssh模式进行数据同步,目录大小约为25G,lsyncd版本2.2.2,rsync版本3.1.2,源端、目标端网络带宽大小均为1G,lsyncd配置如下:
# 需配置源端到目标端的SSH免密登录
# /etc/lsyncd.conf
settings {
logfile = "/data/lsyncd/lsyncd.log",
statusFile = "/data/lsyncd/lsyncd.status",
pidfile = "/data/lsyncd/lsyncd.pid",
inotifyMode = "CloseWrite or Modify",
}
sync {
default.rsyncssh,
source="/data/source",
host="1.1.1.1",
targetdir="/data/target",
rsync = {
archive = true,
compress = false,
whole_file = false
},
ssh = {
port = 2323
}
}
启动同步命令:
lsyncd -log Exec /etc/lsyncd.conf
问题现象
同步初始化时总是中断,一般在传输4G左右暂停,重启lsyncd后传输一段时间再次中断。日志报错:
packet_write_wait: Connection to 1.1.1.1 port 2323: Broken pipe
rsync: [sender] write error: Broken pipe (32)
rsync error: unexplained error (code 255) at io.c(820) [sender=3.1.2]
Mon Aug 15 16:09:42 2022 Error: Temporary or permanent failure on startup of "/data/source". Terminating since "insist" is not set.
问题原因
同步开始时进行正常,说明配置正确。中途"Broken pipe",检查源端与目标端之间的防火墙等安全设备配置,发现配置有DDOS防护,DDOS相关告警也佐证了传输中断的原因为数据同步因流量过大被判定为DDOS攻击,因此被拦截。
解决办法
方法一:关闭DDOS防护
方法二:对rsync进行限速,增加bwlimit参数,例如限速5MB/s,配置如下:
settings {
logfile = "/data/lsyncd/lsyncd.log",
statusFile = "/data/lsyncd/lsyncd.status",
pidfile = "/data/lsyncd/lsyncd.pid",
inotifyMode = "CloseWrite or Modify",
}
sync {
default.rsyncssh,
source="/data/source",
host="1.1.1.1",
targetdir="/data/target",
rsync = {
archive = true,
compress = false,
whole_file = false,
_extra = {"--bwlimit=5000"}
},
ssh = {
port = 2323
}
}
另外,如果不希望lsyncd在初始化失败后退出,可以在启动时增加参数-insist,这样如果初始化失败,lsyncd会继续不断尝试同步直至恢复正常,生产环境建议添加该参数启动:
lsyncd -insist -log Exec /etc/lsyncd.conf