在生产环境,有时会需要两台主机的特定目录实现实时同步,比如,将NFS共享目录的数据文件,自动同步到备份服务器特定目录中。
inotify+rsync方式:实现数据同步
sersync:功能更强大
要利用监控服务(inotify),监控同步数据服务器目录中信息的变化
发现目录中数据产生变化,就利用rsync服务器推送到备份服务器上
异步的文件系统事件监控机制,利用事件驱动机制,而无须通过诸如cron等的轮询机制来获取事件,linux内核从2.6.13起支持inotify,通过inotify可以监控文件系统中添加、删除、修改、移动等各种事件。
inotify-tools,sersync,lrsyncd
inotify对同步数据目录信息的监控
rsync完成对数据的同步
利用脚本进行结合
内核是否支持inotify
linux支持inotify的内核最小版本为2.6.13
可以通过命令,说明服务器内核支持inotify
- [root@Node1 ~]#:ll /proc/sys/fs/inotify/
- 总用量 0
- -rw-r--r--. 1 root root 0 7月 12 2024 max_queued_events
- -rw-r--r--. 1 root root 0 7月 12 2024 max_user_instances
- -rw-r--r--. 1 root root 0 7月 12 2024 max_user_watches
查看内核参数:
- [root@Node1 ~]#:cat /proc/sys/fs/inotify/max_queued_events
- 16384
- [root@Node1 ~]#:cat /proc/sys/fs/inotify/max_user_instances
- 128
- [root@Node1 ~]#:cat /proc/sys/fs/inotify/max_user_watches
- 8192
内核参数说明:
max_queued_events:inotify事件队列最大长度,如值太小会出现event Queue Overflow错误,默认值:16384,建议调大。
max_user_isntances:每个用户创建inotify实例最大值,默认是:128
max_user_watches:可以监视的文件的总数量,默认是:8192,建议调大
可以修改内核参数:/etc/sysctl.conf文件
安装工具需要epel源:
- [root@Node1 ~]#:yum install -y epel-release.noarch
- ......
- [root@Node1 ~]#:yum install -y inotify-tools
- ......
inotify-tools包主要工具有:inotifywait和inotifywatch。
inotifywait:在被监控的文件或目录上等待特定文件系统事件(open,close,delete等)发生,常用于实时同步的目录监控。
inotifywatch:收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计。
格式:inotifywait [选项] file [文件1] [文件2] [...]
常用的一些选项:
-m,始终保持事件监听
-d,以守护进程方式执行,和-m相似,配合-o使用
-r,递归监控目录数据信息变化
-q,输出少量事件信息
-o,打印事件到文件中,相当于标准正确输出,注意:使用绝对路径
-e,指定监听的事件,如果省略,表示所有的时间都进行监听
--timefmt,该命令的时间格式:
%y-%m-%d:年-月-日
%H:%M:%S:时:分:秒
例如:--timefmt "%y-%m-%d %H:%M:%S"
--format格式定义:
%T:输出时间格式中定义的时间格式信息。与前面的--timefmt语法格式指定时间日期
%w:监控文件或目录
%f:监控文件或目录信息
%e:显示发生的事件信息,事件默认用","分隔。但是可以使用指定的分割符。%Xe,X分割
指定的事件:-e
create,delete,moved_to,close_write,attrib
使用两个终端,一个终端监控,一个终端操作。
在文件夹中执行ls命令,监控,打开目录
-m选项,始终监听
创建了一个文件a.txt
-rm,递归
时间格式:--format输出定义的时间格式信息
inotifywait -rm /data/ --timefmt "%y-%m-%d %H-%M-%S" --format "%T %w%f event: %;e"
24-07-12 14-02-04:%T
/data/:%w目录
a.txt:%f文件
event:事件
OPEN;ISDIR:以分号为分割符,监控变更的所有事件
普通的一次性命令程序
rsync远程同步
查看软件:
- [root@Node1 data]#:rpm -q rsync
- rsync-3.1.2-6.el7_6.1.x86_64
- [root@Node1 data]#:rpm -ql rsync
- /etc/rsyncd.conf
- /etc/sysconfig/rsyncd
- /usr/bin/rsync
- /usr/lib/systemd/system/rsyncd.service
- ......
既然是远程同步,有另一台服务器端
基于SSH协议
rsync有三种工作方式:
1.本地文件系统上实现同步。命令行语法格式为上述"Local"段的格式。
2.本地主机使用远程shell和远程主机通信。命令行语法格式为上述"Access via remote shell"段的格式。
3.本地主机通过网络套接字连接远程主机上的rsync daemon。命令行语法格式为上述"Access via rsync daemon"段的格式。
前两者的本质是通过本地或远程shell,而第3种方式则是让远程主机上运行rsyncd服务,使其监听在一个端口上,等待客户端的连接。
常用选项:
-v:显示rsync过程中详细信息。
-a --archive:归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"。
-o --owner:保持owner属性(属主)。
-g --group:保持group属性(属组)。-z:传输时进行压缩提高效率
--delete:以SRC为主,对DEST进行同步。多则删之,少则补之。
-e:指定所要使用的远程shell程序,默认为ssh。
......
ssh协议:将本机目录,通过ssh协议发送给对面, 一次性命令:
rsync -av /etc/passwd root@192.168.114.20:/opt
rsync协议发给对面
将本机的/etc/passwd文件,同步到主机192.168.114.20的root用户,/opt/下
-a保留权限(所有),-v显示过程
加不加/的问题。
现在本地/data下。创建test文件夹,test文件夹里面有两个文件a.txt和b.txt
- [root@Node1 data]#:ls
- test
- [root@Node1 data]#:ls test/
- a.txt b.txt
文件夹/data/test后加不加/的问题。每次实验,都是清空文件夹后再操作的
加/:rsync -av /data/test/ root@192.168.114.20:/opt
发现,加/不会把test文件夹同步过去。
不加/:rsync -av /data/test root@192.168.114.20:/opt
test后不加/,会把test文件夹一并同步过去。
--delete的用法:我们把本地Node1的test文件夹下b.txt删除。再次同步。
如果远端有与本机多出的文件,会删除远端多于的文件,使其与本机同步。
当客户端要与服务端同步文件时,数据服务器,和备份服务器(要开启rsync服务)。
开启rsync服务,监听在873端口上。
开启:rsync --daemon
要想开启必须要有配置文件,默认已存在:/etc/rsyncd.conf
端口为873端口
开启之后去客户端使用rsync软件同步文件:
[root@Node1 data]#:rsync rsync://192.168.114.20
服务端没有设置共享目录。使用命令无法看到共享目录。
我这里用的是systemctld启动的。把873的pid使用kill -9杀掉。启动:systemctl start rsyncd
服务端Node2上设置共享目录:
vim /etc/rsyncd.conf
手动添加共享目录:
[backup]
path = /data/
再在客户端查看:
把客户端的passwd文件同步到客户端的/data/下。提示权限拒绝。
需要设置,指定可读写,默认只读
指定目录给nobody权限,默认用户以nobody访问此目录
给nobody 用户加权限
再次同步:
执行成功,查看/data/文件夹下:这样Node1的passwd文件就同步过来了。
第二种方式:rsync /etc/fstab 192.168.114.20::backup
对配置文件进行以下修改:
max connections = 0 #最大连接
exclude = lost+found/ #不同步文件
use chroot = no #限制目录,禁锢。只允许操作这个文件夹
reverse lookup = no #禁用反向解析。不需要,尽量禁用掉
auth users = rsyncuser #只能通过这个用户
必须修改权限600
使用客户端测试:
查看是否同步:
客户端设置密码
客户端配置密码文件:
[root@Node1 ~]#:echo "123456" > /etc/pass
也可以将密码赋值给环境变量RSYNC_PASSWORD变量,但是不安全
必须授权:
[root@Node1 ~]#:chmod 600 /etc/pass
非交互式查看共享目录,查看的是服务端那边的目录。
---end---