既然rsync可以实现服务器间的文件同步,为何还需要lsyncd?
- rsync无法知道“什么时候同步”,因为rsync只有执行同步命令的时候,才会去扫描文件判断哪些文件被修改了,只能建立一个定时任务,每隔一定的时间(比如5分钟,10分钟等等)去执行一次同步,这样虽然能同步,但却“不实时”。
- lsyncd就可以监听文件的修改,换句话说,某个文件修改了,lsyncd会得到通知(原理是使用linux系统的inotify/fsevents功能),得到通知之后,再去调用rsync把修改的文件进行同步(即组装一句rsync同步语句并执行),达到“实时同步”的效果。
A(192.168.123.100):Rsync客户端+lsyncd
B(192.168.123.200):Rsync服务端(daemon模式)
需求:
当A服务器中的文件发生变化(新增、修改、删除),实时推动到B服务器
实现思路:
A中部署Rsync客户端+lsyncd,lsyncd通过内核的inotify触发机制监控文件的动向,并将改动发送给Rsync,由Rsync同步到服务器B;服务器B以守护进程的方式部署Rsync服务端,接收A发来的文件同步请求,并将文件同步!
一、安装Rsync
yum install -y rsync
二、安装lsyncd
CentOS 7自带的yum无法安装lsyncd。可以通过安装EPEL存储库的方式再用yum安装lsyncd,命令如下:
yum install -y epel-release
yum -y install lsyncd
lsyncd 只需要在A服务器上安装,B服务器无需安装
三、配置Rsync(B端)
A服务器为Rsync客户端,安装完成即可,B服务器以daemon方式运行,所以只需要对B服务器的Rsync进行配置
1、修改配置文件:
vim /etc/rsyncd.conf
uid = rsync
gid = rsync
use chroot = no
max connections = 200
pid file = /var/run/rsyncd.pid
# exclude = lost+found/
# transfer logging = yes
log file = /var/log/rsyncd.log
timeout = 900
ignore nonreadable = yes
# dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
# 无需rsync以root身份运行,允许接受数据
fake super = yes
[project]
path = /data/project/project_file
comment = 项目文件
ignore errors
read only = false
list = false
auth users = rsync
secrets file = /etc/rsyncd.pwd
2、创建用户组和用户
groupadd rsync
useradd -s /sbin/nologin -M -g rsync rsync
3、创建同步目录并授予权限
mkdir /data/project_file
chown -R rsync:rsync /data/project_file
4、创建认证用户和密码文件并修改权限
Rsync进行同步需要一个同步的虚拟用户,这个用户的用户名已经在配置文件里指定,下面创建这个用户名的用户密码文件
由于是用户名和密码文件所以必须要将其修改为600权限,不然后期会报错无法认证
echo "rsync:rsync" >/etc/rsyncd.pwd
chmod 600 /etc/rsyncd.pwd
5、启动Rsync
systemctl start rsyncd
6、验证Rsync是否启动
我们可以通过查看Rsync监听端口(Rsync默认监听873端口),或者查看日志文件以确定Rsync是否以daemon模式成功启动
netstat -anlpt | grep rsync
或者
cat /var/log/rsyncd.log
7、测试Rsync
echo "rsync" > /etc/rsyncd.pwd #由于我们要在同步命令里指定用户名,所以这里就不再指定用户名
chmod 600 /etc/rsyncd.pwd
由于服务端路径存在权限问题,所以同步源(Rsync客户端)也需要进行相同权限设置
groupadd rsync
useradd -s /sbin/nologin -M -g rsync rsync
# 创建需要同步的目录
mkdir /data
systemctl stop firewalld
# vi /etc/selinux/config
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加
# setenforce 0 #立即生效
下面进行测试
rsync -avz /data/ rsync@192.168.123.200::project --password-file=/etc/rsyncd.pwd
注:
8、检测传输
查看B服务器的/data/project_file目录,看下文件是否已经同步过来了
四、配置lsyncd
1、修改配置文件
vim /etc/lsyncd.conf
settings {
logfile = "/var/log/lsyncd/lsyncd.log",
statusFile = "/var/log/lsyncd/lsyncd.status",
inotifyMode = "CloseWrite",
maxProcesses = 8,
maxDelays = 1,
nodaemon = false,
}
sync {
default.rsync,
source = "/data/", --监控目录
target = "rsync@192.168.123.200::project", --rsync的认证用户名、IP、模块
delete = true,
delay = 15,
init = false,
rsync = {
binary = "/usr/bin/rsync", --rsync可执行文件路径,必须为绝对路径
password_file = "/etc/rsyncd.pwd", --密码认证文件
archive = true,
compress = false,
verbose = false,
_extra = {"--bwlimit=200", "--omit-link-times"}
}
}
--如果有多台服务器需要同步,依次往下配置多个sync即可
2、启动lsyncd
systemctl start lsyncd
3、测试
修改/data 目录下的任意文件,保存,查看B服务器是否同步
五、常见问题
1. 启动lsyncd报错
Error: in Lua: /builddir/build/BUILD/lsyncd-release-2.2.2/lsyncd.lua:2659: attempt to call field 'init' (a boolean value)
Error: Backtrace 1 :/builddir/build/BUILD/lsyncd-release-2.2.2/lsyncd.lua:2659
Error: Backtrace 2 :/builddir/build/BUILD/lsyncd-release-2.2.2/lsyncd.lua:4374
主要是因为lsyncd2.2版本bug引起,如需使用init=true功能,配置文件中请不要直接写init=true来开启功能,如需init=true请将init=true注释或删除(因为默认init=true)来解决报错。
原文地址:https://blog.csdn.net/u013147325/article/details/130331238
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_18743.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!