机房冷风吹-lsync实现目录实时同步

需求

192.168.13.52(A)服务器/test
实时同步到
192.168.13.53(B)服务器/test
(单向)
Lsyncd 实际上是lua语言封装了 inotify 和 rsync 工具,采用了 Linux 内核(2.6.13 及以后)里的 inotify 触发机制,然后通过rsync去差异同步,达到实时的效果。
所以A服务器安装lsync和rsync,监控本地文件,然后通过rsync连接到B去实现同步。
B服务器安装rsync充当server端,当A发过来请求时及时处理。

环境

环境默认关闭防火墙,关闭selinux
A服务器有文件

[root@sibalaxi01 test]# ll -h
总用量 460M
-rw-r--r-- 1 root root 200M 929 16:17 file
-rw-r--r-- 1 root root 200M 929 16:17 file1
-rw-r--r-- 1 root root 200M 929 16:17 file2
-rw-r--r-- 1 root root  20M 929 16:17 file3
-rw-r--r-- 1 root root  20M 929 16:17 file4
-rw-r--r-- 1 root root  20M 929 16:17 file5

测试时生成大文件
dd if=/dev/zero of=/test bs=10M count=20

安装服务

yum源

#两台都做
#配置阿里yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache 

A服务器

#lsync软件包在epel源
yum -y install epel-release
yum -y install lua lua-devel rsync lsyncd

B服务器

yum -y install rsync 

A服务器连接数配置

vi /etc/sysctl.conf
fs.inotify.max_user_watches=99999999
fs.inotify.max_queued_events=1638400
参数说明:
这里都是inotify会用到的参数
max_queued_events:
inotify队列最大长度,如果值太小,会导致监控文件不准确
max_user_watches:
要同步的文件包含多少目录,可以用:find /test -type d | wc -l 统计,必须保证max_user_watches值大于统计结果
#重载
sysctl -p

A服务器配置

vi /etc/lsyncd.conf
settings {	logfile ="/var/log/lsyncd/lsyncd.log",
			statusFile ="/var/log/lsyncd/lsyncd.status",
			inotifyMode="CloseWrite",
			maxProcesses=8,}
sync {
	default.rsync,
	source = "/test",
-- test是模块名,不是目录,是在B服务器配置的
	target = "root@192.168.13.53::test",
	delete = true,
	delay = 20,
	rsync = {
		binary = "/usr/bin/rsync",
		archive = true,
		compress = true,
		verbose = true,
		password_file = "/etc/rsyncd.pwd",
	}
}

生成密码文件

echo zzx >/etc/rsyncd.pwd
chmod 600 /etc/rsyncd.pwd

启动命令

systemctl restart lsyncd.service

B服务器配置

vi /etc/rsyncd.conf
uid = root
gid = root
use chroot = yes 
#若为 true,则 rsync 在传输文件之前首先 chroot 到 path 参数所指定的目录下。这样做的原因是实现额外的安全防护
read only = no
# 设定白名单,可以指定IP段,各个Ip段用空格分开
hosts allow = *
hosts deny = *
max connections = 30
pid file = /var/run/rsyncd.pid
transfer logging = yes
# 日志文件格式
log format = %t %a %m %f %b
# 指定日志文件
log file = /var/log/rsync.log
# 剔除某些文件或目录,不同步
exclude = lost+found/
# 设置超时时间
timeout = 600
ignore nonreadable = yes
# 设置不需要压缩的文件
dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
#这是模块名,服务端那边要配置的是模块名
[test]
# 模块的根目录,同步目录,要注意权限
path = /test
list = no
ignore errors
comment = test
auth users = root
secrets file = /etc/rsyncd.secrets
exclude = lost+found/ conf/ man/

密码文件

echo root:zzx > /etc/rsyncd.secrets
chmod 600 /etc/rsyncd.secrets

启动命令

systemctl restart rsyncd.service

查看日志

A服务器

vi /var/log/lsyncd/lsyncd.log 
Fri Sep 30 15:41:37 2022 Normal: --- Startup ---
Fri Sep 30 15:41:37 2022 Normal: recursive startup rsync: /test/ -> root@192.168.13.53::test/
Fri Sep 30 15:52:31 2022 Normal: Startup of /test/ -> root@192.168.13.53::test/ finished.
Fri Sep 30 15:53:45 2022 Normal: Calling rsync with filter-list of new/modified files/dirs
/file2
/
Fri Sep 30 15:53:45 2022 Normal: Finished a list after exitcode: 0

B服务器

tail -f /var/log/rsync.log 
2022/09/30 15:41:30 [41267] rsyncd version 3.1.2 starting, listening on port 873
2022/09/30 15:41:37 [41269] params.c:Parameter() - Ignoring badly formed line in config file: ignore errors
2022/09/30 15:41:37 [41269] name lookup failed for 192.168.13.52: Name or service not known
2022/09/30 15:41:37 [41269] connect from UNKNOWN (192.168.13.52)
2022/09/30 07:41:37 [41269] rsync to test/ from root@UNKNOWN (192.168.13.52)
2022/09/30 07:41:38 [41269] receiving file list
2022/09/30 07:41:38 [41269] ./
2022/09/30 07:43:43 [41269] 2022/09/30 07:43:43 192.168.13.52 test file 203975
2022/09/30 07:49:17 [41269] 2022/09/30 07:48:54 192.168.13.52 test file1 203975
2022/09/30 07:52:19 [41269] 2022/09/30 07:52:13 192.168.13.52 test file2 203975
2022/09/30 07:52:19 [41269] 2022/09/30 07:52:19 192.168.13.52 test file3 20431
2022/09/30 07:52:29 [41269] 2022/09/30 07:52:26 192.168.13.52 test file4 20431
2022/09/30 07:52:30 [41269] 2022/09/30 07:52:30 192.168.13.52 test file5 20431
2022/09/30 07:52:31 [41269] sent 154 bytes  received 673452 bytes  total size 692060160
2022/09/30 15:53:45 [41396] params.c:Parameter() - Ignoring badly formed line in config file: ignore errors
2022/09/30 15:53:45 [41396] name lookup failed for 192.168.13.52: Name or service not known
2022/09/30 15:53:45 [41396] connect from UNKNOWN (192.168.13.52)
2022/09/30 07:53:45 [41396] rsync to test/ from root@UNKNOWN (192.168.13.52)
2022/09/30 07:53:45 [41396] receiving file list
2022/09/30 07:53:45 [41396] ./
2022/09/30 07:53:45 [41396] deleting file2
2022/09/30 07:53:45 [41396] sent 37 bytes  received 85 bytes  total size 0

能看到中间删除了一个文件,到了20s之后就会自动同步

命令

如想利用rsync命令进行同步,可用:

rsync --delete -r 192.168.13.56:/test/ /test2

-v:显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。
-P:显示文件传输的进度信息。(实际上"-P"=“–partial --progress”,其中的"–progress"才是显示进度信息的)。
-n --dry-run :仅测试传输,而不实际传输。常和"-vvvv"配合使用来查看rsync是如何工作的。
-a --archive :归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"。
-r --recursive:递归到目录中去。
-t --times:保持mtime属性。强烈建议任何时候都加上"-t",否则目标文件mtime会设置为系统时间,导致下次更新 检查出mtime不同从而导致增量传输无效。
-o --owner:保持owner属性(属主)。
-g --group:保持group属性(属组)。
-p --perms:保持perms属性(权限,不包括特殊权限)。
-D :是"–device --specials"选项的组合,即也拷贝设备文件和特殊文件。
-l --links:如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象。
-z :传输时进行压缩提高效率。
-R --relative:使用相对路径。意味着将命令行中指定的全路径而非路径最尾部的文件名发送给服务端,包括它们的属性。用法见下文示例。
–size-only :默认算法是检查文件大小和mtime不同的文件,使用此选项将只检查文件大小。
-u --update :仅在源mtime比目标已存在文件的mtime新时才拷贝。注意,该选项是接收端判断的,不会影响删除行为。
-d --dirs :以不递归的方式拷贝目录本身。默认递归时,如果源为"dir1/file1",则不会拷贝dir1目录,使用该选项将拷贝dir1但不拷贝file1。
–max-size :限制rsync传输的最大文件大小。可以使用单位后缀,还可以是一个小数值(例如:“–max-size=1.5m”)
–min-size :限制rsync传输的最小文件大小。这可以用于禁止传输小文件或那些垃圾文件。
–exclude :指定排除规则来排除不需要传输的文件。
–delete :以SRC为主,对DEST进行同步。多则删之,少则补之。注意"–delete"是在接收端执行的,所以它是在 exclude/include规则生效之后才执行的。
-b --backup :对目标上已存在的文件做一个备份,备份的文件名后默认使用"~"做后缀。
–backup-dir:指定备份文件的保存路径。不指定时默认和待备份文件保存在同一目录下。
-e :指定所要使用的远程shell程序,默认为ssh。
–port :连接daemon时使用的端口号,默认为873端口。
–password-file:daemon模式时的密码文件,可以从中读取密码实现非交互式。注意,这不是远程shell认证的密码,而是rsync模块认证的密码。
-W --whole-file:rsync将不再使用增量传输,而是全量传输。在网络带宽高于磁盘带宽时,该选项比增量传输更高效。
–existing :要求只更新目标端已存在的文件,目标端还不存在的文件不传输。注意,使用相对路径时如果上层目录不存在也不会传输。
–ignore-existing:要求只更新目标端不存在的文件。
–remove-source-files:要求删除源端已经成功传输的文件。

报错

同步大文件时可能会有报错

Message from syslogd@sibalaxi01 at Sep 30 15:46:23 ...
 kernel:NMI watchdog: BUG: soft lockup - CPU#0 stuck for 24s! [rsync:47214]

这是内核软死锁,想解决需要修改内核参数
kernel watchdog 是用来检测 lockup 的,所谓 lockup,是指某段内核代码占着 CPU 不放,lookup 严重的时候会导致整个系统失去响应。
soft lockup 是指 CPU 被内核代码占据,以至于无法执行其它进程。
解决方法如下:

1.将 watchlog_thresh 临时设置为 30
sysctl -w kernel.watchdog_thresh=30
2.将 watchlog_thresh 永久设置为 30
echo 30 > /proc/sys/kernel/watchdog_thresh
3.将 watchlog_thresh 写入启动文件
kernel.watchdog_thresh=30 >> /etc/sysctl.conf

上面可能是我用的虚拟机的宿主机太垃圾了,但是我看在同步大文件的时候的确cpu占用会很高,注意刚同步的时候监控一下。

参考大哥们的文章

lsync官网
lsyncd配置文件详细说明
rsync原理

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值