NFS主从同步
数据的实时同步实现:
利用监控服务(inotify),监控同步数据服务器目录中信息的变化
发现目录中数据产生变化后,就利用rsync服务推送到备份服务器中
实现同步的方法:
inotify+rsync 方式实现数据同步,inotify负责监控,rsync在被触发后同步数据
sersync 金山公司周洋在inotify软件基础上进行的二次开发,功能更加强大
inotify:介绍
异步的文件系统时间监控机制,利用事件驱动机制,而无需通过类似cron等的轮询机制来获取事件,Linux内核从2.6.13起支持inotify,通过inotify可以监控文件系统中添加、删除、修改、移动等各种操作事件
centos6和7都支持
inotify软件:
inotify-tools,sersync,lrsyncd
inotify+rsync使用方式:
inotify对同步数据目录信息进行监控
rsync完成对数据的同步
利用脚本进行结合
inotify相关
查看系统是否加载了inotify功能
grep -i inotify /boot/config-3.10.0-957.el7.x86_64
CONFIG_INOTIFY_USER=y
内核参数文件
ll /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 Dec 3 19:01 max_queued_events
-rw-r--r-- 1 root root 0 Dec 3 19:01 max_user_instances
-rw-r--r-- 1 root root 0 Dec 3 19:01 max_user_watches
inotify内核参数解释
man 7 inotify
以下值都可调大,看环境
max_queued_events:inotify各种操作事件队列最大长度,如值太小会出现event queue overflow错误
默认值:16384
max_user_instances:可以监控的文件数量,单进程,默认:8192
max_user_watches:每个用户创建inotify实例最大值,默认值:128
安装:基于epel源
yum install -y inotify-tools
主要工具
/usr/bin/inotifywait:在被监控的文件或目录上等待特定文件发生的操作事件[create、delete等]发生。常用于实时同步的目录监控
/usr/bin/inotifywatch:收集被监控的文件系统使用的统计数据,指的是文件系统发生的次数统计
inotifywait命令的常见选项:
选项 | 作用 |
---|---|
-m | 始终保持监控状态 |
-d | 以守护进程方式执行,和-m相似,配置-o使用 |
-r | 递归监控目录数据信息变化 |
-q | 输出少量时间信息 |
–exclude | 可指定排除某文件或目录,使用扩展正则表达式匹配的模式实现 |
–excludei | 和exclude相似,不区分大小写 |
-o | 输出到指定文件中 |
-s | 发送错误到syslog,相当于标准错误输出 |
–timefmt | 指定时间输出格式 |
–format | 指定的输出格式,即实际监控输出内容 |
-e | 指定监听指定的事件,如果省略此项,表示所有事件都监控 |
–timefmt 的事件格式,参考man 3 strftime
此项要配合–format一起使用,format是具体输出的格式
格式 | 说明 |
---|---|
%Y | 年,包含世纪信息 |
%y | 年,不包含世纪信息 |
%m | 月,范围1~12 |
%d | 天,范围1~31 |
%H | 小时,24小时制 |
%M | 分,0~59 |
示例:–timefmt “%Y-%m-%d %H:%M”
–format :指定的输出格式,结合–timefmt使用
格式 | 说明 |
---|---|
%T | 输出–timefmt定义的时间格式信息 |
%w | 事件出现时,监控文件或目录的名称 |
%f | 事件出现时,将显示监控目录下触发事件的文件名 |
%e | 显示发生的事件信息,不同的事件默认用逗号分隔 |
%;e | 不使用默认的逗号分隔,自定义;为分隔符 |
示例:
--format “%T %w%f event:%;e”
--format ‘%T %w %f’
-e:指定监听指定的事件类型
事件类型 | 说明 |
---|---|
create | 文件或目录创建操作 |
delete | 文件或目录删除操作 |
modify | 文件或目录修改写入操作 |
attrib | 文件或目录属性改变 |
close_write | 文件或目录关闭,在写入模式打开之后关闭的 |
close_nowrite | 文件或目录关闭,在只读模式打开之后关闭的 |
close | 文件或目录关闭,不管读或写模式 |
open | 文件或目录被打开 |
moved_to | 文件或目录被移动到监控的目录中 |
moved_from | 文件或目录从监控的目录中被移动 |
move | 文件或目录不管移动或移除监控目录 |
access | 文件或目录内容被读取 |
delete_self | 文件或目录被删除,目录本身被删除 |
unmount | 取消挂在 |
示例:
-e create,delete,moved_to,close_write,attrib
练习:
#默认是占用终端,等待对目录或文件的操作,当有操作时,实时在屏幕输出
inotifywait -mrq /data/www --timefmt "%Y-%m-%d %H:%M" --format "%T %w%f event:%;e"
#可以使用-o输出到一个文件中,也是占用一个终端
inotifywait -mrq /data/www --timefmt "%Y-%m-%d %H:%M" --format "%T %w%f event:%;e" -o /tmp/inotify.log
#-e指定只有指定的动作才记录
inotifywait -mrq /data/www --timefmt "%Y-%m-%d %H:%M" --format "%T %w%f event:%;e" -e create,delete,moved_to,close_write,attrib
# 具体的输出格式如下
2019-12-03 19:53 /data/www/file1 event:ATTRIB
2019-12-03 19:54 /data/www/file1 event:DELETE
2019-12-03 19:54 /data/www/file2 event:DELETE
rsync相关
rsync本身可作为一个服务为我们提供服务
来自rsync包
端口:873
rpm -ql rsync
/etc/rsyncd.conf 配置文件
/etc/sysconfig/rsyncd
/usr/bin/rsync 命令方式
/usr/lib/systemd/system/rsyncd.service service文件,支持systemctl管理
rsync命令:
基于ssh和rsh服务实现高效率的远程系统之间的复制文件
使用安全的shell连接为传输方式
rsync -av /etc host_ip:/tmp :复制目录和目录下文件
rsync -av /etc/ host_ip:/tmp :只复制目录下文件
特性:比scp更快,而且只复制不同的文件,没有改变的文件忽略
常用选项:
选项 | 说明 |
---|---|
-a | 包含-rtplgoD |
-r | 同步目录时要加上,类似cp时的-r选项 |
-v | 同步时显示一些信息,让我们知道同步的过程 |
-l | 保留软连接 |
-L | 加上该选项后,同步软链接时会把源文件给同步 |
-p | 保持文件的权限属性 |
-o | 保持文件的属主 |
-g | 保持文件的属组 |
-D | 保持设备文件信息 |
-t | 保持文件的时间属性 |
–delete | 删除DEST中SRC没有的文件 |
–exclude | 过滤指定文件,如–exclude “logs”会把文件名包含logs的文件或者目录过滤掉,不同步 |
-P | 显示同步过程,比如速率,比-v更加详细 |
-u | 加上该选项后,如果DEST中的文件比SRC新,则不同步 |
-z | 传输时压缩 |
定义同步数据配置,修改配置文件
uid = root # 以root身份开启rsync服务
gid = root
use chroot = no # 不允许切换根
max connections = 0 # 最大的连接数,0位不限制
log file = /var/log/rsyncd.log # 日志文件路径
pid file = /var/run/rsyncd.pid # pid文件路径
lock file = /var/run/rsyncd.lock # 锁文件路径
exclude = lost+found/ # 针对此目录不监控
timeout = 900 # 超时时长
reverse lookup = no # 反向解析,将IP解析为名称,no为关闭,不解析效率会高一点
hosts allow = 192.168.40.0/24 # 允许哪个客户端网段访问rsync服务器
[backup] # 此名字代表下面所有内容,调用时只需要写这个名字
path = /backup/ # 同步到rsync服务器的备份路径
comment = backup # 描述
read only = no # no为可写
auth users = rsyncuser # 不需要向ssh输入用户和密码,使用rsync的用户和密码连接
secrets file = /etc/rsync.pass # 密码文件
ignore errors # 如果产生错误,忽略错误
以上是解释
实现步骤
40.7作为inotify监控,在40.17设备上做rsync服务器
监控40.7设备上/data/www/目录下文件的变化
1、40.7设备上只需安装inotify即可
2、40.17rsync配置文件中添加
uid = root
gid = root
use chroot = no
max connections = 0
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
exclude = lost+found/
timeout = 900
reverse lookup = no
hosts allow = 192.168.40.0/24
[backup]
path = /backup
comment = backup
read only = no
auth users = rsyncuser
secrets file = /etc/rsync.pass
ignore errors
注意:在重启后使用systemctl status rsyncd 可以看到部分报错内容,必须解决,否则客户端同步不成功
3、服务器生成验证文件
echo "rsyncuser:123123" > /etc/rsync.pass # 可生成多个用户和密码,一行一个
chmod 600 /etc/rsync.pass # 修改权限,使密码更安全
4、服务器准备存放同步数据目录
mkdir /backup
5、启动服务
centos7
systemctl start rsyncd
centos6
依赖xinetd,由xinetd管理激活rsync服务
chkconfig --list 没有xinetd就安装,然后启动
chkconfig rsyncd on
service xinetd start
6、返回到40.7在客户端生成密码文件
echo "123123" > /etc/rsync.pass # 可以和服务器设置不同名字
chmod 600 /etc/rsync.pass
7、客户端测试:
rsync -avz --password-file=/etc/rsync.pass /data/www/ [email protected]::backup
选项说明:
--password-file 指定密码文件
backup 这个backup是rsync服务器配置文件中定义的模块内容的名字,直接调用名字,就可以使用模块内定义的内容
此步骤是实现单次测试复制!!!
脚本实现死循环监控
客户端40.7创建inotify+rsync.sh 脚本
#!/bin/bash
src='/data/www/'
desc='[email protected]::backup'
inotifywait -mrq --timefmt "%Y-%m-%d %H:%M" --format '%T %w %f' -e create,delete,moved_to,close_write,attrib ${src} | while read date time dir file;do
FilePath=${dir}${file}
rsync -az --delete --password-file=/etc/rsync.pass $src $desc && echo "At $date on $time, ${dir}${file} change" >> /tmp/rsync.log
done
测试方法:
40.7会话1设备上跑脚本
40.17额外新窗口使用
watch -n1 ls -l /backup/ # 一秒查看一次backup目录的变化
40.7再开一个会话,敲命令
此时文件相同
删除或创建文件,对方都会发生变化
dd if=/dev/zero of=bigfile bs=1M count=500 # 查看40.17下/backup 目录中文件是否有变化
查看脚本定义的日志文件内容
同步完成!!让NFS数据得到进一步安全!!