一、需求
当C(client)服务器中的文件发生变化(新增、修改、删除),实时推动到S(server)服务器,S服务器作为备份服务器。通知可配置当删除时,备份服务服务器不需要同步删除。
二、解决方案
rsync+lsyncd 的解决方案,rsync实现同步,lsyncd 监听文件变化,去触发rsync进行同步。
1、rsync简介
rsync(remote synchronize)是 Liunx/Unix 下的一个远程数据同步工具,它可通过 LAN/WAN 快速同步多台主机间的文件和目录。rsync 通过比较两边文件是否相同,不相同才进行更新。
但是rsync无法知道“什么时候同步”,因为rsync只有执行同步命令的时候,才会去扫描文件判断哪些文件被修改了,只能建立一个定时任务,每隔一定的时间(比如5分钟,10分钟等等)去执行一次同步,这样虽然能同步,但却“不实时”。
2、lsyncd简介
lsyncd实际上是lua语言封装了 inotify 和 rsync 工具,采用了 Linux 内核(2.6.13 及以后)里的 inotify 触发机制,然后通过rsync去差异同步,达到实时的效果。我认为它最令人称道的特性是,完美解决了 inotify + rsync海量文件同步带来的文件频繁发送文件列表的问题 -通过时间延迟或累计触发事件次数实现。另外,它的配置方式很简单
三、实验环境
这里使用3个Linux服务器节点进行演示,其中两个属于客户C端分别为web程序和数据库,一台备份程序和数据的服务器S端。2个节点都为CentOS 7.6 最小化安装。
C1(web程序): 10.51.1.15。
C2(数据库): 10.51.1.16。
S1(备份节点)10.51.1.107。
C为需要同步数据的节点,需要部署rsync和lsyncd。
S为接收同步数据的节点,只需要部署rsync(daemon模式)。
四、S端部署(rsync)
1、安装rsync
yum install -y rsync
2、 配置rsyncd.conf
vim /etc/rsyncd.conf
将配置文件,因为有2个client,因为配置了2个模块,代码如下:
uid = nobody
gid = nobody
use chroot = yes
max connections = 20
strict mode=yes
pid file = /var/run/rsyncd.pid
lock file=/var/run/rsync.lock
log file=/var/log/rsyncd.log
[backup_prod_app] #模块名称,有多个客户端时就复制整个模块
path = /home/fastdfs/prod-backup/app/
comment = backup app files
ignore errrors
read only=no
write only=no
hosts allow=*
hosts deny=*
list=false
uid=root
gid=root
auth users=rsync-user #同步用户名
secrets file=/etc/rsync.password
[backup_prod_db] #模块名称,有多个客户端时就复制整个模块
path = /home/fastdfs/prod-backup/db/
comment = backup db files
ignore errrors
read only=no
write only=no
hosts allow=*
hosts deny=*
list=false
uid=root
gid=root
auth users=rsync_user #同步用户名
secrets file=/etc/rsync.password
3、创建用户和组
groupadd rsync
useradd -s /sbin/nologin -M -g rsync rsync_user #组名在前,用户名在后
4、 创建认证用户和密码文件并修改权限
Rsync进行同步需要一个同步的虚拟用户,这个用户的用户名已经在配置文件里指定,下面创建这个用户名的用户密码文件。
由于是用户名和密码文件所以必须要将其修改为600权限,不然后期会报错无法认证
echo "rsync_user:123456" >/etc/rsyncd.pwd #录入用户名和密码创建密码文件
chmod 600 /etc/rsyncd.pwd #修改权限
5、创建同步目录并授予权限
创建2个目录来存放2个客户端的备份文件并授权
mkdir /home/fastdfs/prod-backup/app/
mkdir /home/fastdfs/prod-backup/db/
chown -R rsync_user:rsync /home/fastdfs/prod-backup/app/ #用户名在前,组名在后
chown -R rsync_user:rsync /home/fastdfs/prod-backup/db/ #用户名在前,组名在后
6、开放873端口:
firewall-cmd --add-port=873/tcp --permanent --zone=public
firewall-cmd --reload
7、启动rsync
systemctl start rsyncd
# systemctl restart rsyncd
systemctl enable rsyncd #开机启动
验证rsync是否启动
我们可以通过查看Rsync监听端口(Rsync默认监听873端口),或者查看日志文件以确定Rsync是否以daemon模式成功启动
netstat -anlpt | grep rsync
或者查看日志
cat /var/log/rsyncd.log
至此S端配置完成!
五、C端安装
1、安装配置rsync
1、安装rsync
C端也需要安装rsync,单向备份不需要启动rsync,安装好配制好就行,lsyncd需要用到rsync命令去同步。
yum install -y rsync
2、 创建用户(组)
由于服务端路径存在权限问题,所以同步源(Rsync客户端)也需要进行相同权限设置
下面进行创建用户(组)目录、创建测试文件并赋予其权限
groupadd rsync
useradd -s /sbin/nologin -M -g rsync rsync_user #组在前,名在后
# cat /etc/passwd #查看用户列表
# cat /etc/group #查看用户组列表
# usermod -G rsync rsync_user
3、配置密码文件(注意和S端一致)
相应的密码认证文件用于用户自动认证,由于也是密码文件,所以也需要将文件权限修改为600
echo "123456" >/etc/rsyncd.pwd #由于我们要在同步命令里指定用户名,所以这里不指定用户名,指定密码就行,密码注意和上面的密码要一致
chmod 600 /etc/rsyncd.pwd
4、 创建要同步的目录
mkdir /home/data-backup/prod
六、关闭防火墙及手动同步测试
1、 关闭两台服务器的防火墙
systemctl stop firewalld
2、关闭两台服务器的selinux
# vi /etc/selinux/config
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加
关闭selinux立即生效
setenforce 0 #立即生效
3、手动同步测试
rsync -avz /home/data-backup/prod/ rsync_user@10.51.1.107::backup_prod_db --password-file=/etc/rsyncd.pwd
#注:
# /home/data-backup/prod/ Client端要同步的数据源路径
# rsync_user@10.51.1.107 认证用户名@服务器S端IP
# 10.51.1.107::backup_prod_db,必须两个冒号,冒号后是服务端对应的模块名称
查看Server的/home/fastdfs/prod-backup/db/目录,看下文件是否已经同步过来了;
成功日志打印如下:
[root@localhost ~]# rsync -avz /home/lims-backup/prod/ tgs@10.51.1.107::backup_prod_app --password-file=/etc/rsyncd.pwd
sending incremental file list
./
test.lims.txt
sent 111 bytes received 38 bytes 7.27 bytes/sec
total size is 0 speedup is 0.00
如果提的文件夹权限问题,那么多半是selinux未关闭或者防火墙问题。
七、安装配置lsyncd(仅C端)
1、 安装lsyncd
CentOS 7自带的yum无法安装lsyncd。可以通过安装EPEL存储库的方式再用yum安装lsyncd
yum install -y epel-release
yum -y install lsyncd
2. 配置lsyncd.conf
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 = "/home/data-backup/prod/", --监控目录
target = "rsync_user @10.51.1.107::backup_prod_app", --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即可
3.创建日志文件
touch /var/log/lsyncd/lsyncd.log
touch /var/log/lsyncd/lsyncd.status
chmod 600 /var/log/lsyncd/lsyncd.log
chmod 600 /var/log/lsyncd/lsyncd.status
4、 启动lsyncd
启动&开启启动
systemctl start lsyncd
# systemctl restart rsyncd
systemctl enable lsyncd#开机启动
5、 查看日志
cat /var/log/lsyncd/lsyncd.log
如果打印出如下日志则成功启动了
启动成功的打印
Sat Aug 5 22:01:07 2023 Normal: --- Startup
# 新增文件后的打印
Sat Aug 5 22:01:24 2023 Normal: Calling rsync with filter-list of new/modified files/dirs
/123456.txt
/
Sat Aug 5 22:01:25 2023 Normal: Finished a list after exitcode: 0
八、同步测试
- Client端新增文件
- Client端编辑文件
- Client端删除文件
九、双向同步
双向同步其实就是把Clinet端也当做一个server,按照Server的进行配置;然后Server也是一个Client,需要按照并配置lsyncd
全文结束!!