为什么需要nfs服务器?
保障网站数据的一致性,不管负载均衡器将请求分配到哪台后端的服务器,客户机看到的内容是一样。
nfs是什么?
网络文件系统,英文Network File System(NFS),是由SUN公司研制的UNIX表示层协议(presentation layer protocol),能使使用者访问网络上别处的文件就像在使用自己的计算机一样。
nfs解决了什么问题?
数据同源: 到同一个地方去拿数据,保障数据的一致性
nfs的优点和缺点
- 优点: 随便一台linux服务器都可以搭建,成本非常低,构建非常容易
- 缺点: 读取速度有限,跟网络质量,磁盘IO,cpu,内存等因素有关,在传统的tcp/ip网络上传输的
准备一台服务器
- 配置没有关系,可以简单点: 1核/1G
- 配置好ip地址:192.168.0.103
[root@nfs-server ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:1b:98:76 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.139/24 brd 192.168.0.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe1b:9876/64 scope link
valid_lft forever preferred_lft forever
1.安装nfs的相关软件
[root@nfs-server ~] yum install nfs-utils -y
2.启动nfs-server服务
[root@nfs-server ~]# service nfs-server stop 关闭
Redirecting to /bin/systemctl stop nfs-server.service
[root@nfs-server ~]# service nfs-server start 启动
Redirecting to /bin/systemctl start nfs-server.service
[root@nfs-server ~]# service nfs-server restart 重启
Redirecting to /bin/systemctl restart nfs-server.service
[root@nfs-server ~]# ps aux|grep nfs
root 431 0.0 0.0 0 0 ? I 8月01 0:01 [kworker/u128:4-nfsd4]
root 833 0.0 0.3 50304 2932 ? Ss 8月01 0:00 /usr/sbin/nfsdcld
root 5311 0.0 0.0 0 0 ? S 11:02 0:00 [nfsd]
root 5312 0.0 0.0 0 0 ? S 11:02 0:00 [nfsd]
root 5313 0.0 0.0 0 0 ? S 11:02 0:00 [nfsd]
root 5314 0.0 0.0 0 0 ? S 11:02 0:00 [nfsd]
root 5315 0.0 0.0 0 0 ? S 11:02 0:00 [nfsd]
root 5316 0.0 0.0 0 0 ? S 11:02 0:00 [nfsd]
root 5317 0.0 0.0 0 0 ? S 11:02 0:00 [nfsd]
root 5318 0.0 0.0 0 0 ? S 11:02 0:00 [nfsd]
root 5326 0.0 0.1 12320 992 pts/0 S+ 11:03 0:00 grep --color=auto nfs
3.原理部分
nfs服务和rpc到底是如何实现的呢?工作原理
因为 NFS 支持的功能相当的多,而不同的功能都会使用不同的程序来启动, 每启动一个功能就会启用一些端口来传输数据,因此, NFS 的功能所对应的端口才没有固定住, 而是随机取用一些未被使用的小于 1024 的埠口来作为传输之用。但如此一来又造成客户端想要连上服务器时的困扰, 因为客户端得要知道服务器端的相关埠口才能够联机吧!
时我们就得需要远程过程调用 (RPC) 的服务啦!RPC 最主要的功能就是在指定每个 NFS 功能所对应的 port number ,并且回报给客户端,让客户端可以连结到正确的端口上去。 那 RPC 又是如何知道每个 NFS 的端口呢?这是因为当服务器在启动 NFS 时会随机取用数个端口,并主动的向 RPC 注册,因此 RPC 可以知道每个端口对应的 NFS 功能。
nfs自己并没有去对外监听某个端口号,而是外包给了rpc服务,rpc帮助nfs去监听端口,然后告诉客户机和本机的那个进程对应的端口连续
[root@nfs-server ~]# netstat -anplut|grep rpc 查看rpc服务相关的端口
tcp 0 0 0.0.0.0:35503 0.0.0.0:* LISTEN 960/rpc.statd
tcp 0 0 0.0.0.0:20048 0.0.0.0:* LISTEN 5304/rpc.mountd
tcp6 0 0 :::20048 :::* LISTEN 5304/rpc.mountd
tcp6 0 0 :::42099 :::* LISTEN 960/rpc.statd
udp 0 0 0.0.0.0:20048 0.0.0.0:* 5304/rpc.mountd
udp 0 0 127.0.0.1:717 0.0.0.0:* 960/rpc.statd
udp 0 0 0.0.0.0:42974 0.0.0.0:* 960/rpc.statd
udp6 0 0 :::20048 :::* 5304/rpc.mountd
udp6 0 0 :::43399 :::* 960/rpc.statd
4.共享文件,编辑/etc/exports文件,写好具体的共享的目录和权限
[root@nfs-server ~]# vim /etc/exports
/web 192.168.0.0/24(rw,all_squash,sync) #编辑此句话
/web 是我们共享的文件夹的路径--》使用绝对路径 --》需要自己新建
192.168.0.0/24 允许过来访问的客户机的ip地址网段
(rw,all_squash,sync) 表示权限的限制
rw 表示可读可写 read and write
ro 表示只能读 read-only
all_squash :任何客户机上的用户过来访问的时候,都把它认为是普通的用户
root_squash## 标题 当NFS客户端以root管理员访问时,映射为NFS服务器匿名用户
no_root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员
sync 同时将数据写入到内存与硬盘中,保证不丢失数据
async 优先将数据保存到内存,然后再写入硬盘,效率更高,但可能丢失数据
[root@nfs-server ~] mkdir /web
[root@nfs-server ~] cd /web
[root@nfs-server web]vim index.html #创建首页文件
[root@nfs-server web]ls
index.html
[root@nfs-server web] cat index.html
miluo
jiangcaiguo yikexin #首页内容
5.刷新输出文件的列表
[root@nfs-server web] exportfs -rv
exporting 192.168.0.0/24:/web
6.建议关闭防火墙和selinux
[root@nfs-server download] service firewalld stop
Redirecting to /bin/systemctl stop firewalld.service
[root@nfs-server download] systemctl disable firewalld
[root@nfs-server download] getenforce
Disabled
7.在客户机上挂载nfs服务器上共享的/web
[root@web-server2 ~] yum install nfs-utils -y #安装nfs-utils软件,方便客户机上进行挂载,具有了相关命令了,例如:showmount
[root@web-server2 ~] showmount -e 192.168.0.139 #查看nfs服务器上共享输出了哪些文件夹
Export list for 192.168.0.103:
/web 192.168.0.0/24
#挂载nfs服务器上的目录到本机上
[root@web-server2 ~] mkdir /web #在客户机的本地新建一个目录/web
[root@web-server2 ~] mount 192.168.0.103:/web /web #将nfs服务器上的/web目录挂载到本地的/web目录,今后访问本地的/web目录,就是访问到nfs服务器上的/web目录
# mount 是挂载的命令,可以理解为一种映射
# 语法: mount nfs服务器的目录 本地的目录
8.后端的real-server到底要把nfs服务器共享的目录挂载到哪里?用户才能看到一样的数据
答:nginx安装目录下的html
[root@web-server2 sczhengbo99] mount 192.168.0.139:/web /usr/local/sczhengbo99/html/