解决挂NFS超时问题
今天是“黑色星期日”,公司一台进入“更年期”的服务器在消停两周后再次“发飙”:内网网卡再次罢工,重启网卡多次都无效。。。由于这台服务器上有多个mysql服务和NFS服务,并且都是通过内网提供服务,知道我有多杯具了吧。。。
没有“plan B”,只能把所有通过内网访问服务的程序都切到外网上,mysql服务的恢复还比较顺利,只要给client外网ip授权就行了;数据库的调整还包括主库之间的连接访问,之前从库都是连接主库的内网ip,这里有个小技巧可以不用停mysql程序,只要执行下面的命令即可:
mysql> CHANGE MASTER TO
MASTER_HOST='123.0.0.1',
MASTER_USER='slave',
MASTER_PASSWORD='master_pass',
MASTER_LOG_FILE='recorded_log_file_name',
MASTER_LOG_POS=recorded_log_position;
数据库服务恢复后切换NFS服务就遇到麻烦了,改用外网ip挂死活不行,总是提示超时:
# /bin/mount -v 123.0.0.1:/data1 /nfs/unidata2
mount: no type was given - I'll assume nfs because of the colon
mount: trying 219.232.244.91 prog 100003 vers 3 prot tcp port 2049
mount: mount to NFS server '123.0.0.1' failed: timed out (retrying).
我确定NFS Server配置无误,相关服务程序portmap, nfs, mount 等进程都已启动,防火墙设置也没问题,在client上能使用ssh通过外网登陆server,并且最诡异的是client使用showmount可以看到server上的共享目录是允许client访问的:
# showmount -e 123.0.0.1
/data1 123.0.0.2,123.0.0.3
到网上找了一下,发现不少人都遇到过类似问题Linux nfs mount RPC :timeout,还有国外的论坛说这个timeout问题是linux内核问题需要升级内核才能解决,崩溃ing,正准备放弃的时候看到一篇介绍 nfs 命令的资料,我只是大概扫了一下但页面底部的那么一小段文字立刻让我恍然大悟:
TMD,原来NFS缺省使用UPD协议,而我的配置防火墙的习惯一般是对外网ip只开放TCP访问,立马调整iptables,重启,问题解决!
在client上切换NFS Server地址时还遇到一个小问题,就是由于内网失灵之前挂的共享目录摘不下来,执行umount和df命令都没反应,这个问题很好处理,只要先把需要访问该共享目录的程序停掉就能摘掉了;对web前端来说就是把php-cgi程序都停掉,然后执行:
# /bin/umount -f /nfs/unidata2
虽然过程很痛苦,但总算把这个问题解决了收获不小,下面就在这篇博文里把NFS的相关知识整理一下。
NFS Server配置
# cat /etc/exports
/data1 123.0.0.1(rw,async,no_root_squash) 123.0.0.2(rw,async,no_root_squash)
启动服务
# /etc/init.d/nfs start
更多参考文章:
2. 14.2. Mounting an NFS Volume