目录
一、nfs服务器的介绍
1.什么是nfs?
nfs就是网络文件系统,英文Network File System,是由SUN公司研制的UNIX表示层协议(presentation layer protocol),能使使用者访问网络上别处的文件就像在使用自己的计算机一样。
也就是在网络上共享自己机器里的文件,让其他的机器可以使用。
2.为什么需要nfs服务器?
nfs服务器都够实现数据同源,保障网站数据的一致性,不管负载均衡器将请求分配到哪台后端服务器,客户机看到的内容都是一样的。
nfs服务器并不是保障数据一致性的最好的解决方法,这是一种比较廉价的解决方法,性能不是特别好,适合学生学习阶段使用,公司一般采用专用的存储服务器。
san存储区域网络(Storage Area Network,简称SAN)采用网状通道(Fibre Channel ,简称FC,区别与Fiber Channel光纤通道)技术,通过FC交换机连接存储阵列和服务器主机,建立专用于数据存储的区域网络。
3.nfs服务器的优缺点?
优点: 随便一台linux服务器都可以搭建,成本非常低,构建非常容易
缺点: 读取速度有限,跟网络质量,磁盘IO,CPU,内存等因素有关,在传统的tcp/ip网络上传输
4.nfs服务的实现原理
NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此NFS的功能对应的端口并不固定,客户端要知道NFS服务器端的相关端口才能建立连接进行数据传输,而RPC就是用来统一管理NFS端口的服务,并且统一对外的端口是111,RPC会记录NFS端口的信息,如此我们就能够通过RPC实现服务端和客户端沟通端口信息。PRC最主要的功能就是指定每个NFS功能所对应的port number,并且通知客户端,客户端可以连接到正常端口上去。
在启动NFS SERVER之前,首先要启动RPC服务(即portmap或rpcbind服务,下同)否则NFS SERVER就无法向RPC服务区注册,另外,如果RPC服务重新启动,原来已经注册好的NFS端口数据就会全部丢失。因此此时RPC服务管理的NFS程序也要重新启动以重新向RPC注册。一般修改NFS配置文档后,是不需要重启NFS的,直接在命令执行/etc/init.d/nfs reload或exportfs –rv即可使修改的/etc/exports生效。
通俗的讲,nfs自己并没有去对外监听某个端口号,而是外包给了rpc服务,rpc帮助nfs去监听端口,然后告诉客户机和本机的哪个进程对应的端口。
二、nfs服务器的部署
1.准备工作
准备一台centos的系统,修改ip和主机名
IP:192.168.10.233 主机名:nfs-server
建议关闭防火墙和selinux,具体操作上一篇文章有
2.安装和启动nfs服务
#安装nfs相关的软件
[root@nfs-server ~]# yum install nfs-utils -y
#启动nfs服务
[root@nfs-server ~]# service nfs-server start
Redirecting to /bin/systemctl start nfs-server.service
#设置nfs服务开机启动
[root@nfs-server ~]# systemctl enable nfs-server
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.
#查看nfs服务是否启动
[root@nfs-server ~]# ps aux|grep nfs
root 73072 0.0 0.1 50112 2904 ? Ss 12:07 0:00 /usr/sbin/nfsdcld
root 75737 0.0 0.0 0 0 ? S 12:13 0:00 [nfsd]
root 75738 0.0 0.0 0 0 ? S 12:13 0:00 [nfsd]
root 75739 0.0 0.0 0 0 ? S 12:13 0:00 [nfsd]
root 75740 0.0 0.0 0 0 ? S 12:13 0:00 [nfsd]
root 75741 0.0 0.0 0 0 ? S 12:13 0:00 [nfsd]
root 75742 0.0 0.0 0 0 ? S 12:13 0:00 [nfsd]
root 75743 0.0 0.0 0 0 ? S 12:13 0:00 [nfsd]
root 75744 0.0 0.0 0 0 ? S 12:13 0:00 [nfsd]
root 76441 0.0 0.0 12324 1108 pts/1 S+ 12:15 0:00 grep --color=auto nfs
3.编辑/etc/exports文件
#写具体共享的目录和权限
[root@nfs-server ~]# vim /etc/exports
[root@nfs-server ~]# cat /etc/exports
/web 192.168.10.0/24(ro,all_squash,async)
#/web 是共享文件夹的路径,使用绝对路径,需要新建
#192.168.10.0/24 表示允许过来访问的客户机的ip地址网段
#(ro,all_squash,async)表示权限的限制
#ro 表示只读
#rw 表示可读可写
#all_squash 任何客户机上的用户过来访问的时候,都认为它是普通用户
#root_squash 当nfs客户端以root管理员访问时,映射为nfs服务器的匿名用户
#no_root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员
#sync 同步,同时将数据写入到内存与硬盘中,保证数据不丢失
#async 异步,优先将数据保存到内存,然后再写入磁盘,效率高,但可能丢失数据
#新建/web目录,写入共享的文件
[root@nfs-server ~]# mkdir /web
[root@nfs-server ~]# cd /web
[root@nfs-server web]# vim index.html
[root@nfs-server web]# cat index.html
welcome to hunan changsha!!!
#刷新输出文件的列表
[root@nfs-server web]# exportfs -rv
exporting 192.168.10.0/24:/web
4.在客户机上安装nfs-utils软件
#在客户机上安装nfs-utils软件
#这是Ip为192.168.10.230的客户机
[root@manager ~]# yum install nfs-utils -y
#查看nfs服务器共享的文件夹
[root@manager ~]# showmount -e 192.168.10.233
Export list for 192.168.10.233:
/web 192.168.10.0/24
#这是Ip为192.168.10.231的客户机
[root@worker2 ~]# yum install nfs-utils -y
[root@worker2 ~]# showmount -e 192.168.10.233
Export list for 192.168.10.233:
/web 192.168.10.0/24
#这是Ip为192.168.10.232的客户机
[root@worker1 ~]# yum install nfs-utils -y
[root@worker1 ~]# showmount -e 192.168.10.233
Export list for 192.168.10.233:
/web 192.168.10.0/24
5.部署服务,并挂载nfs服务器
#在manager机器上部署服务
[root@manager ~]# docker service create --name sc-nginx2 --mount 'type=volume,source=nfsvolume,target=/usr/share/nginx/html,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/web,"volume-opt=o=addr=192.168.10.233,ro,nfsvers=4,async"' --replicas 6 -p 8889:80 nginx:latest
pu05ln49zba3dt9bebd7uo00k
overall progress: 6 out of 6 tasks
1/6: running [==================================================>]
2/6: running [==================================================>]
3/6: running [==================================================>]
4/6: running [==================================================>]
5/6: running [==================================================>]
6/6: running [==================================================>]
verify: Service converged
#sc-nginx2 服务的名字
#source=nfsvolume docker宿主机上卷的名字,不需要提前建好,会自动创建
#target=/usr/share/nginx/html 容器里存放网页的目录
#volume-driver=local 访问本地的目录
#volume-opt=type=nfs volume对nfs支持的选项
#volume-opt=device=:/web 表示nfs服务器共享的目录
#volume-opt=o=addr=192.168.10.233,ro,nfsvers=4,async 挂载具体的nfs服务器的IP地址和选项
#--replicas 6 副本的数量,也就是启6个容器
#-p 8889:80 端口的映射,本机的8889端口映射到容器里的80端口
#nginx:latest 镜像的版本
#查看创建的服务
[root@manager ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
pu05ln49zba3 sc-nginx2 replicated 6/6 nginx:latest *:8889->80/tcp
#查看创建的volume具体信息
#Options那一项表示挂载的具体信息
[root@manager ~]# docker volume inspect nfsvolume
[
{
"CreatedAt": "2021-08-29T14:58:55+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/nfsvolume/_data",
"Name": "nfsvolume",
"Options": {
"device": ":/web",
"o": "addr=192.168.10.233,ro,nfsvers=4,async",
"type": "nfs"
},
"Scope": "local"
}
]