nfs
network file system 网络文件系统
nfs实现的原理
本地文件操作方式
1.当用户执行mkdir命令,BashShell无法完成该命令操作,会将其翻译给内核。
2.Kernel内核解析完成后会驱动对应的磁盘设备,完成创建目录的操作。
NFS实现原理(需要先了解[程序|进程|线程])
1.NFS客户端执行增、删等操作,客户端会使用不同的函数对该操作进行封装。
2.NFS客户端会通过TCP/IP的方式传递给NFS服务端。
3.NFS服务端接收到请求后,会先调用portmap进程进行端口映射。
4.nfsd进程用于判断NFS客户端是否拥有权限连接NFS服务端。
5.Rpc.mount进程判断客户端是否有对应的权限进行验证。
6.idmap进程实现用户映射和压缩。
7.最后NFS服务端会将客户端的函数转换为本地能执行的命令,然后将命令传递至内核,由内核驱动硬件。
注意: rpc是一个远程过程调用,那么使用nfs必须有rpc服务
安装、配置、nfs服务
安装
[root@nfs01 ~]# yum install nfs-utils -y
配置
1.要共享什么 /data
2.共享给谁 172.16.1.0 网段
3.共享的权限
[root@nfs01 ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
根据配置创建目录
[root@nfs01 ~]# mkdir /data
[root@nfs01 ~]# chown -R nfsnobody.nfsnobody /data/
启动
[root@nfs01 ~]# systemctl start nfs
[root@nfs01 ~]# systemctl enable nfs
客户端测试
[root@web01 ~]# yum install nfs-utils -y
[root@web01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /mnt
nfs 参数
rw* 读写权限
ro 只读权限
root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的匿名用户(不常用)
no_root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员(不常用)
no_all_squash 无论NFS客户端使用什么账户访问,都不进行压缩 (云计算)
sync* 同时将数据写入到内存与硬盘中,保证不丢失数据
async 优先将数据保存到内存,然后再写入硬盘;这样效率更高,但可能会丢失数据
all_squash 无论NFS客户端使用什么账户访问,均映射为NFS服务器的匿名用户(常用)
anonuid* 配置all_squash使用,指定NFS的用户UID,必须存在系统
anongid* 配置all_squash使用,指定NFS的用户UID,必须存在系统
实现开机自动挂载
[root@web01 ~]# cat /etc/fstab
172.16.1.31:/data /mnt nfs defaults 0 0
[root@web01 ~]# mount -a
[root@web01 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
172.16.1.31:/data 100G 1.8G 99G 2% /mnt
NFS存储优点
- NFS简单易用、方便部署、数据可靠、服务稳定、满足中小企业需求。
- NFS的数据都在文件系统之上,所有数据都是能看得见。
NFS存储局限
- 存在单点故障, 如果构建高可用维护麻烦web->nfs()->backup
glusterfs - NFS数据都是明文, 并不对数据做任何校验,也没有密码验证(强烈建议内网使用)。
NFS应用建议
- 生产场景应将静态数据(jpg\png\mp4\avi\css\js)尽可能放置CDN场景进行环境, 以此来减少后端存储压力
- 如果没有缓存或架构、代码等,本身历史遗留问题太大,在多存储也没意义
存储不能带来性能上的提升
lsyncd
Lsyncd使用文件系统事件接口(inotify或fsevents)来监视对本地文件和目录的更改。Lsyncd将这些事件整理几秒钟,然后生成一个或多个进程以将更改同步到远程文件系统。默认同步方法是rsync
Lsyncd是一种轻量级的实时镜像解决方案。Lsyncd相对容易安装,不需要新的文件系统或块设备。Lysncd不会妨碍本地文件系统性能
可以通过配置文件实现细粒度的自定义。自定义操作配置甚至可以从头开始编写,从shell脚本到用Lua语言编写的代码
安装
yum install lsyncd
配置文件 /etc/lsyncd.conf
settings {
logfile = "/var/log/lsyncd/lsyncd.log",
statusFile = "/var/log/lsyncd/lsyncd.status",
inotifyMode = "CloseWrite",
maxProcesses = 8,
}
sync {
default.rsync,
source = "/date", #源
target = "rsync_backup@172.16.1.41::backup", #目标
delete= true,
exclude = { ".*" },
delay = 1,
rsync = {
binary = "/usr/bin/rsync", #实时同步命令
archive = true,
compress = true,
verbose = true,
password_file = "/etc/rsync.pwd", #存放密码文件
_extra = {"--bwlimit=200"}
}
}
创建密码文件并修改权限
echo "1" > /etc/rsync.pwd
chmod 600 /etc/rsync.pwd