既然rsync可以实现服务器间的文件同步,为何还需要lsyncd?
- rsync无法知道“什么时候同步”,因为rsync只有执行同步命令的时候,才会去扫描文件判断哪些文件被修改了,只能建立一个定时任务,每隔一定的时间(比如5分钟,10分钟等等)去执行一次同步,这样虽然能同步,但却“不实时”。
- lsyncd就可以监听文件的修改,换句话说,某个文件修改了,lsyncd会得到通知(原理是使用linux系统的inotify/fsevents功能),得到通知之后,再去调用rsync把修改的文件进行同步(即组装一句rsync同步语句并执行),达到“实时同步”的效果。
实验环境:
CentOS 7.6 最小化安装
需求及网络拓扑图如下
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
在A服务和B服务器执行以下命令安装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
至此,服务器B端的操作,已经结束
7、测试Rsync
服务器A需要创建相应的密码认证文件用于用户自动认证
由于也是密码文件,所以也需要将文件权限修改为600
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
关闭两台服务器的selinux
# vi /etc/selinux/config
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加
# setenforce 0 #立即生效
下面进行测试
将A服务器/data/ 目录下的文件同步到B服务器
rsync -avz /data/ rsync@192.168.123.200::project --password-file=/etc/rsyncd.pwd
注:
- 两个冒号
- /data 服务器A的数据源路径
- project是模块名称,配置文件里已写明
- rsync@192.168.123.200 认证用户名@被同步的服务器IP,这里是B服务器的IP
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即可
注:lsyncd的配置文件是lua语法,注释方式为:“--”
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。