zoukankan      html  css  js  c++  java
  • 2 NFS高可用解决方案之NFS的搭建

    preface

    我们紧接着上一篇博文的基础(drbd+heartbeat的正常工作,http://www.cnblogs.com/liaojiafa/p/6129499.html)来搭建NFS的服务。

    NFS主备服务器都安装NFS

    安装NFS

    我这里使用的CentOs6.6默认是安装了NFS的,如果你的没有安装,请使用下面的yum命令安装:

    [root@nfsmaster ~]# yum -y install  nfs-utils nfs-utils-lib nfs4-acl-tools
    [root@nfsmaster ~]# rpm -qa nfs*
    nfs-utils-lib-1.1.5-11.el6.x86_64
    nfs-utils-1.2.3-70.el6_8.2.x86_64
    nfs4-acl-tools-0.3.3-8.el6.x86_64
    

    启动NFS并配置它

    [root@nfsmaster ~]#  service rpcbind restart
    [root@nfsmaster ~]# service nfs start
    
    [root@nfsmaster nfs]# cat /etc/exports 
    /nfs  192.168.1.0/255.255.255.0(rw,sync,no_root_squash)
      # 共享哪个目录 ,允许哪些client连接,具有什么属性对这个目录。
    
    [root@nfsmaster ~]# showmount -e 192.168.1.100   # 查看是否有共享目录
    Export list for 192.168.1.7:
    /nfs 192.168.1.*
    

    NFS的exports配置文件需要copy到backup 服务器上。

    客户端挂载它
    客户端需要安装nfs库,不然会提示下面这样的报错:

    [root@nfsclient ~]# mount -t nfs 192.168.1.7:/nfs /database/
    mount: wrong fs type, bad option, bad superblock on 192.168.1.7:/nfs,
           missing codepage or helper program, or other error
           (for several filesystems (e.g. nfs, cifs) you might
           need a /sbin/mount.<type> helper program)
           In some cases useful info is found in syslog - try
           dmesg | tail  or so
    

    出现上面的报错后,安装nfs-utils

    [root@nfsclient ~]# yum -y install nfs-utils
    

    安装完之后挂载nfs,使用vip

    [root@nfsclient ~]# showmount -e 192.168.1.100
    clnt_create: RPC: Program not registered    #出现这个错误的话,去nfs服务器上确认是否NFS服务正常启动,重启下即可
    [root@nfsclient ~]# showmount -e 192.168.1.100
    Export list for 192.168.1.100:
    /nfs 192.168.1.0/255.255.255.0
    
    [root@localhost ~]# mount -t nfs 192.168.1.100:/nfs /database/
    [root@localhost ~]# df -hT
    Filesystem         Type   Size  Used Avail Use% Mounted on
    /dev/sda2          ext4    28G  2.9G   24G  11% /
    tmpfs              tmpfs  491M     0  491M   0% /dev/shm
    /dev/sda1          ext4   283M   28M  240M  11% /boot
    192.168.1.100:/nfs nfs    9.8G   23M  9.2G   1% /database
      # 挂载成功。
    
    

    模拟Nfs-server故障

    我们把NFSmaster关机,此时客户端不管是df ,还是进入到/database下面,都是卡死的。解决办法是在/etc/mtab里面删除最后一行:

    [root@nfsclient ~]# cat /etc/mtab
    /dev/sda2 / ext4 rw 0 0
    proc /proc proc rw 0 0
    sysfs /sys sysfs rw 0 0
    devpts /dev/pts devpts rw,gid=5,mode=620 0 0
    tmpfs /dev/shm tmpfs rw 0 0
    /dev/sda1 /boot ext4 rw 0 0
    none /proc/sys/fs/binfmt_misc binfmt_misc rw 0 0
    vmware-vmblock /var/run/vmblock-fuse fuse.vmware-vmblock rw,nosuid,nodev,default_permissions,allow_other 0 0
    nfsd /proc/fs/nfsd nfsd rw 0 0
    sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw 0 0
    192.168.1.100:/nfs /database nfs rw,addr=192.168.1.100 0 0       #删除这一行即可。
    

    由此可见,这个heartbeat虽然会让VIP进行漂移,但是呢nfs客户端依然是不可用的。所以我们需要采用另外一种方法来来export共享目录。

    删除export里面的内容,使用命令exporfs申明要共享的目录

    我们删除/etc/exports里面的内容,然后通过exportfs来申明要共享的目录。

    [root@nfsmaster ~]# > /etc/exports
    [root@nfsmaster ~]# exportfs -o rw,sync,all_squash,mp,fsid=2 192.168.1.0/24:/nfs/   
    

    上面这种exportfs的方法同样可以申明共享目录,nfsclient也同样正常使用。

    高可用方案

    经过dbrd+heartbeat+NFS的搭建,以及exportfs的简单使用,下面我们就开始做高可用了。
    说道高可用,不得不说exportfs这个命令,如果我们使用exportfs这个命令来申明需要共享目录的话,那么我们就不需要到/etc/exports里面再次添加这个要申明的目录了。
    对于NFS高可用,我们需要使用exportfs来关闭共享的目录和打开共享的目录,这样做的好处就需要修改/etc/exports文件了,大大提高了方便性。对此,我们通过exportfs命令写了一个脚本,由heartbeat来接管这个脚本,当nfsmaster服务器宕机时,nfsbackup的heartbeat开始就执行脚本,脚本通过exportfs来共享目录,此时VIP也已经飘过去了,所以nfsclient受影响很小。达到了高可用的目的。更多关于exportfs的资料,可以参考man exportfs。下面就看看这个脚本的内容:

    [root@nfsbackup ~]# cat /etc/ha.d/resource.d/rsdata1.sh     #必须放在/etc/ha.d/resource.d下面
    #!/bin/bash
    
    FSID="1"
    EXPORT_DIR="/nfs"         
    EXPORT_OPTIONS="-o rw,sync,all_squash,mp,fsid=2"
    EXPORT_CLIENT="192.168.1.0/24"
    
    exportfs_usage() {
    cat <<EOF
    	USEAGE: $0 {start|stop}
    EOF
    }
    
    exportfs_start()
    {
    	fn="/nfs"
    	service rpcbind stop &>/dev/null
    	service rpcbind start  &>/dev/null
    	service nfs restart  &>/dev/null
            echo "=======nfs restart========"
    	exportfs ${EXPORT_OPTIONS} ${EXPORT_CLIENT}:${EXPORT_DIR} 2>1&    #通过exportfs来申明共享目录
    	rc=$?
    	if [ $rc -ne 0 ];then
    		echo "export resource ${EXPORT_DIR} error"
    		exit $rc
    	else
    	        echo "export resource ok"
    		exit 0
    	fi
    }
    
    exportfs_stop()
    {
    	fn="/nfs"
    	service rpcbind stop &>/dev/null
            service rpcbind start  &>/dev/null
    	service nfs restart  &>/dev/null
            echo "=======nfs restart========"
    	exportfs -u  ${EXPORT_CLIENT}:${EXPORT_DIT} 2>1&   通过exportfs来取消共享目录
    	rc=$?
    	if [ $rc -ne 0 ];then
    		echo "export resource ${EXPORT_DIR} error"
    		exit $rc
    	else
    	        echo "umount resource ok"
    		exit 0
    	fi
    }
    
    if [ $# -lt 1 ];then
    	exportfs_usage
    	exit 1
    fi
    case $1 in
    	start)
    	exportfs_start
    	;;
    	stop)
    	exportfs_stop
    	;;
    	*)
    	exit 1
    	;;
    esac
    

    这个脚本必须赋予可执行权限,且必须是LSB规范。同时在/etc/ha.d/haresources添加上这个脚本

    [root@nfsmaster ~]# cat /etc/ha.d/haresources
    nfsbackup  IPaddr::192.168.1.100/24/eth0 drbddisk::r0 Filesystem::/dev/drbd0::/nfs::ext4  rsdata1.sh   #尾部添加rsdata1.sh这个脚本名
    
    

    上面的操作主备都需要操作。脚本主备都要有。

    测试高可用性

    此时VIP在nfsmaster上面,我们在nfsclient端首先挂载NFS共享目录后创建一些文件:

    [root@nfsclient /]# mount -t nfs 192.168.1.100:/nfs /database    #
    [root@nfsclient /]# cd /database/
    [root@nfsclient database]# touch {1..10}
    [root@nfsclient database]# ls
    1  10  2  3  4  5  6  7  8  9  lost+found  readme
    

    关闭nfsmaster的电源,模拟宕机。此时等待VIP漂移到nfsbackup上面。待漂移到位后,我们继续在nfsclient上操作:

    [root@nfsclient database]# ls    # 可以查看目录下的文件
    1  10  2  3  4  5  6  7  8  9  lost+found  readme
    [root@nfsclient database]# rm -f {1..5}     # 也可以删除文件。
    [root@nfsclient database]# ls
    10  6  7  8  9  lost+found  readme
    
    到此NFS高可用就做完了。
  • 相关阅读:
    Description Resource Path Location Type Java compiler level does not match the version of the instal
    myeclipse导入项目后,项目类中报Base64错
    Oracle中查询一个字符串的长度的函数
    异常QueryTimeoutException和for input String
    myeclipse中的内存溢出PermGen space
    SecureCRT--下重启服务器
    清除tomcat的缓存
    oracle 定时任务 job 调用存储过程有回到输出参数(含out参数)
    Spring之AOP
    @RequestParam、@PathVariable、@RequestBody区别
  • 原文地址:https://www.cnblogs.com/liaojiafa/p/6129514.html
Copyright © 2011-2022 走看看