网络文件共享
1、存储类型
- 直连式存储:Direct-Attached Storage,简称DAS,本机使用,不支持远程,可管理块设备,适用于数据量不大,对磁盘访问速度要求较高的环境
- 网络附加存储:Network-Attached Storage,简称NAS,跨网络形式,可管理块设备,分配使用空间,适用于文件服务器,存储非结构化数据
- 存储区域网络:Storage Area Network,简称SAN,跨网络形式,可使用文件,不占用本机空间,共享使用空间,大型应用或数据库系统
2、NFS网络共享服务
C/S形式
配置文件
/etc/exports
/etc/exports.d/*.exports #自定义,后缀需指定
2.1、nfs-utils工具
实现共享文件夹
环境:两台主机服务器端10.0.0.8 , 客户端10.0.0.7
##在服务器端下载工具
yum -y install nfs-utils
systemctl enable --now nfs-server
#创建所需共享文件夹
mkdir /data/nfs -p
#更改配置文件
vim /etc/exports #更改配置文件,把谁共享出去,希望谁能访问(且访问后能做什么操作,可不写,默认是ro只读)
/data/nfs *(rw,ro)
#/data/test1 *(rw,no_root_squash) #不压榨远程root用户
#/data/test1 *(rw,all_squash) #所有远程用户都压榨成nobody
/data/nfs *(rw,all_squash,anonuid=666,anongid=666) #所有远程用户都压榨成uid=666的用户和gid=666的组
#/data/test1 *(rw,all_squash,anonuid=666,anongid=666) 10.0.0.17(ro) #针对17主机设为只读权限
#对NFS服务来说,远程客户端的root访问时默认会被压榨成nobody用户,普通用户不会被压榨而是映射成服务器端uid相同的用户,如没有会显示远程普通用户的uid
#重新加载配置文件
exportfs -r #或者重启服务
exportfs -v #可显示当前共享的资源
exportfs -au #暂停共享
exportfs -a #恢复共享
##在客户端
yum -y install nfs-utils
#ubuntu使用apt install nfs-common,ubuntu敲所需要的命令可找到软件包所在
root@ubuntu2004:~# showmount
Command 'showmount' not found, but can be installed with:
apt install nfs-common
#查看是否有可连接共享文件夹
showmount -e 10.0.0.8
#创建挂载目录,便于管理,名称没要求
mkdir /data/nfs1 -p
#挂载
mount 10.0.0.8:/data/nfs /data/nfs1
#永久挂载 _netdev选项可以判断网络通时可以挂载,网络不通就不挂载
vim /etc/fstab
10.0.0.8:/data/nfs /data/nfs1 nfs defaults,_netdev 0 0
mount -a
#df查看挂载
2.2、inotify-tools工具
通过Inotify可以监控文件系统中添加、删除、修改、移动等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况
yum -y install inotify-tools
inotifywait #常用选项,可以监控文件属性变化,有新的读写操作会在屏幕上显示
inotifywatch
2.2.1、inotifywait常用选项
默认一次性
[root@rocky8 ~]#inotifywait /data/
Setting up watches.
Watches established.
-m, --monitor #始终保持事件监听
-d, --daemon #以守护进程方式执行,和-m相似,配合-o使用
-r, --recursive #递归监控目录数据信息变化
-q, --quiet #输出少量事件信息,静默
--exclude <pattern> #指定排除文件或目录,使用扩展的正则表达式匹配的模式实现
--excludei <pattern> #和exclude相似,不区分大小写
-o, --outfile <file> #打印事件到文件中,相当于标准正确输出,注意:使用绝对路径
-s, --syslogOutput #发送错误到syslog相当于标准错误输出
--timefmt <fmt> #指定时间输出格式
--format <fmt> #指定的输出格式;即实际监控输出内容
-e #指定监听指定的事件,如果省略,表示所有事件都进行监听
2.2.2、输出格式定义
%T #输出时间格式中定义的时间格式信息,通过 --timefmt option 语法格式指定时间信息
%w #事件出现时,监控文件或目录的名称信息,相当于dirname
%f #事件出现时,将显示监控目录下触发事件的文件或目录信息,否则为空,相当于basename
%e #显示发生的事件信息,不同的事件默认用逗号分隔
%Xe #显示发生的事件信息,不同的事件指定用X进行分隔
--format "%T %w%f event: %;e"
--format '%T %w %f'
#传统时间格式
%Y #年份信息,包含世纪信息
%y #年份信息,不包括世纪信息
%m #显示月份,范围 01-12
%d #每月的第几天,范围是 01-31
%H #小时信息,使用 24小时制,范围 00-23
%M #分钟,范围 00-59
%S #秒,范例 0-60
--timefmt "%Y-%m-%d %H:%M:%S"
#-e选项指定事件
create #文件或目录创建
delete #文件或目录被删除
modify #文件或目录内容被写入
attrib #文件或目录属性改变
close_write #文件或目录关闭,在写入模式打开之后关闭的
close_nowrite #文件或目录关闭,在只读模式打开之后关闭的
close #文件或目录关闭,不管读或是写模式
open #文件或目录被打开
lsdir #浏览目录内容
moved_to #文件或目录被移动到监控的目录中
moved_from #文件或目录从监控的目录中被移动
move #文件或目录不管移动到或是移出监控目录都触发事件
access #文件或目录内容被读取
delete_self #文件或目录被删除,目录本身被删除
unmount #取消挂载
2.2.3、范例
#持续后台监控,并记录日志
inotifywait -o /root/inotify.log -drq /data/www --timefmt "%Y-%m-%d %H:%M:%S" --format "%T %w%f event: %e"
#持续前台监控特定事件
inotifywait -mrq /data/www --timefmt "%F %H:%M:%S" --format "%T %w%f event: %;e" -e create,delete,moved_to,close_write,attrib
2.2.4、rsync用法
rsync rsync://root@10.0.0.8/backup . #下载共享文件夹里的文件到本机
rsync /etc/shells rsync://root@10.0.0.8/backup #将文件上传到共享目录
rsync /etc/shells 10.0.0.8::backup #将文件上传到共享目录
rsync --password-file=/etc/rsync.pas rsync://rsyncuser@10.0.0.8::backup #非交互式访问rsync服务器
2.2.5、inotify+rsync+shell 脚本实现实时数据同步
两台主机,搭建好rsyncd的备份服务器,创建监控脚本,触发多次rsync,效率稍低,占据资源
10.0.0.7客户端 inotify监控文件变化,主存储设备
10.0.0.8rsyncd服务器 共享出文件夹,用于同步接收客户端所发送的文件,备份存储设备
##10.0.0.8上
#搭建rsyncd服务器
yum -y install rsync-daemon
mkdir -p /data/backup/
vim /etc/rsyncd.conf
uid = root
gid = root
max connections = 0
ignore errors
exclude = lost+found/
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
reverse lookup = no
[backup]
path = /data/backup/
comment = backup dir
read only = no
auth users = rsyncuser
secrets file = /etc/rsync.pas
#可每0.5秒监控一次/data/backup/目录下的文件属性变化
watch -n 0.5 ls -l /data/backup/
##在10.0.0.7上脚本实现监控文件属性变化并同步
[root@10.0.0.7 ~]#vim inotify_rsync.sh
#!/bin/bash
SRC='/data/www/' #注意最后的/,指定监控哪个文件夹
DEST='rsyncuser@10.0.0.8::backup' #将所监控文件备份到远程rsyncd主机
rpm -q rsync &> /dev/null || yum -y install rsync
rpm -q inotify-tools &> /dev/null || yum -y install inotify-tools
inotifywait -mrq --exclude=".*\.swp" --timefmt '%Y-%m-%d %H:%M:%S' --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.pas $SRC $DEST && echo
"At ${TIME} on ${DATE}, file $FILEPATH was backuped up via rsync" >> /var/log/changelist.log
done
bash inotify_rsync.sh #生产中建议后台执行该脚本,nohup
2.3、sersync 实现实时数据同步
基于rsync协议
2.3.1、环境准备
官方下载地址,需科学上网
wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/sersync/sersync2.5.4_64bit_binary_stable_final.tar.gz
tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz -C /usr/local/
#用户密码文件
useradd rsyncuser
echo "rsyncuser:123456" > /etc/rsync.pas
chmod 600 /etc/rsync.pas
2.3.2、更改配置文件
修改##位置即可
[root@rocky ~]#vim /usr/local/GNU-Linux-x86/confxml.xml
......
<moveTo start="true"/>
<attrib start="true"/> ##修改此行为true,文件属性变化后也会同步
<modify start="false"/>
</inotify>
<sersync> #rsync命令的配置段
<localpath watch="/data/www"> ##修改此行,需要同步的源目录或文件,建议同步目录
<remote ip="备份服务器IP" name="backup"/> ##修改此行,指定备份服务器地址和rsync daemon的模块名,如果下面开启了ssh start,此时name为远程shell方式运行时的目标目录
......
<commonParams params="-artuz"/> #指定rsync选项,账号验证
<auth start="true" users="rsyncuser" passwordfile="/etc/rsync.pas"/> ##修改此行,为true,指定备份服务器的rsync配置的用户和密码文件
<userDefinedPort start="false" port="874"/><!-- port=874 --> #指定rsync的非标准端口号
......
2.3.3、sersync使用
[root@centos8 ~]#cd /usr/local/GNU-Linux-x86/
[root@centos8 ~]#./sersync2 -h #查看帮助
set the system param
execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
parse the command param
_______________________________________________________
参数-d:启用守护进程模式,后台执行
参数-r:在监控前,将监控目录与远程主机用rsync命令推送一遍,先同步一次
c参数-n: 指定开启守护线程的数量,默认为10个
参数-o:指定配置文件,默认使用当前工作目录下的confxml.xml文件
参数-m:单独启用其他模块,使用 -m refreshCDN 开启刷新CDN模块
参数-m:单独启用其他模块,使用 -m socket 开启socket模块
参数-m:单独启用其他模块,使用 -m http 开启http模块
不加-m参数,则默认执行同步程序
./sersync2 -dro /usr/local/GNU-Linux-x86/confxml.xml
2.3.4、基于ssh协议使用sersync
#更改配置文件
[root@rocky ~]#vim /usr/local/GNU-Linux-x86/confxml.xml
<attrib start="true"/>
<localpath watch="/data/www">
<remote ip="备份服务器IP" name="/databackup"/> #注意写完整路径
<auth start="false" users="rsyncuser" passwordfile="/etc/rsync.pas"/>
<ssh start="true"/> #更改为true
#运行程序
./sersync2 -dro /usr/local/GNU-Linux-x86/confxml.xml