目录
背景说明
解决办法
执行步骤
数据移动
取消挂载
停nfs服务(客户端)
卸载nfs(客户端)
重启主机(客户端)
卸载nfs(服务端)
背景说明
nfs可以完成集群多个主机之间共享目录,如图所示:
服务器集群中/new目录为共享目录,里面放置有各种安装软件及配置文件。
想要实现服务器集群高可用,要求当集群某一主组件挂掉的时候,需要有另一从组件完成替换,并继续提供服务,并且当集群中其中任何一台主机关机的时候,其他主机依然能够提供服务,对于用户来说没有任何影响。
但是nfs对于高可用来说存在一个隐患:客户端nfs中有一个内核级别的线程,nfsv4.1-svc,该线程会一直和nfs服务端进行通信,且无法被kill掉。(停止客户端Nfs服务,设置开机不自启动,并卸载nfs,重启主机才能让该线程停掉)。
一旦nfs服务端停掉,或者所在主机关机,那么nfs客户端就会找不到nfs服务端,导致nfs客户端所在主机一直处于卡死状态,表现为无法ssh到该主机,不能使用 df -h 等命令,会对客户造成比较严重的影响。
解决办法
如果想要高可用,那么可能就不需要使用Nfs来实现共享目录,而是将/new目录设置为主机本地目录
执行步骤
数据移动
- 在nfs服务端所在主机上,通过scp,将 /new 目录复制到nfs客户端所在主机上,但是目录名字需要修改一下,执行如下命令(建议后台执行,因为有时候该目录比较大,或者压缩后再发送):
-
- scp -r /new root@其他主机名://new_tmp
取消挂载
- 由于nfs客户端都是挂载在nfs服务端所在主机的 /new 上,需要取消挂载,执行如下命令:
-
- umount -v /new
- 取消挂载以后, /new 变为了空目录,删除 /new 目录,将 /new_tmp 目录重命名为 /new
停nfs服务(客户端)
- 停止nfs服务,执行如下命令:
-
- systemctl stop nfs
- 取消nfs服务开启启动,执行如下命令:
-
- systemctl disable nfs
- 观察nfs状态,分别执行如下命令:
-
- systemctl status nfs
- ps -ef | grep nfs
- 可以观察到nfs线程并没有停干净
卸载nfs(客户端)
- 搜索nfs的rpm包,执行如下命令:
-
- rpm -qa | grep nfs
- 卸载nfs rpm包,执行如下命令:
-
- rpm -e --nodeps libnfsidmap-0.25-19.el7.x86_64
- rpm -e --nodeps nfs-utils-1.3.0-0.66.el7.x86_64
- rpm -e --nodeps nfs4-acl-tools-0.3.3-20.el7.x86_64
- 再次查看nfs是否卸载完全
-
- rpm -qa | grep nfs
- 观察 nfsv4.1-svc 线程是否还存活,执行如下命令:
-
- ps -ef | grep nfs
- 可以观察到此时 nfs该线程还存在,所以当nfs服务端停止的时候,还是会存在当前主机卡死的情况。
重启主机(客户端)
- 依次重启之前nfs客户端所在主机,执行如下命令:
-
- reboot
- 每重启一台主机之后,观察nfs进程是否还存在,执行如下命令:
-
- ps -ef | grep nfs
卸载nfs(服务端)
- 停止nfs服务端,执行如下命令:
-
- systemctl stop nfs
- 禁止nfs服务开启启动,执行如下命令:
-
- systemctl disable nfs
- 查看nfs服务是否停止,执行如下命令:
-
- systemctl status nfs
- 卸载nfs rpm,执行如下命令:
-
- rpm -e --nodeps libnfsidmap-0.25-19.el7.x86_64
- rpm -e --nodeps nfs-utils-1.3.0-0.66.el7.x86_64
- rpm -e --nodeps nfs4-acl-tools-0.3.3-20.el7.x86_64
- 查看nfs rpm包是否还存在,执行如下命令:
-
- rpm -qa | grep nfs