nfs+drbd+heartbeat实现高可用文件系统

写在前面:

上两篇博客详细的描述了heartbeat    http://blog.csdn.net/sj349781478/article/details/77865621

以及drbd详解    http://blog.csdn.net/sj349781478/article/details/77893474

下面我们要做的就是将着两种软件结合,并给上层NFS提供高可靠服务。

一、NFS介绍

1)什么是NFS

         NFS(Network File System)即网络文件系统,它的主要功能是通过网络让不同的机器系统之间可以彼此共享文件和目录NFS服务器可以允许NFS客户端将远端NFS服务器端的共享目录挂载到本地的NFS客户端中。在本地NFS客户端的机器看来,NFS服务器端共享的目录就好像自己的磁盘分区和目录一样。一般客户端挂载到本地目录的名字可以随便,但为方便管理,我们要和服务器端一样比较好。NFS一般用来存储共享视频,图片等静态数据。

2)rpcnfs的关系

   pcportmap)就是用来统一管理NFS端口的服务,并且统一对外的端口是111NFS服务端需要先启动rpc,再启动NFS这样NFS才能够到RPC去注册端口信息。客户端的RPC可以通过向服务端的RPC请求获取服务端的NFS端口信息。当获取到了NFS端口信息后,就会以实际端口进行数据的传输。因为NFS有很多功能,不同的功能需要使用不同的端口。因此NFS无法固定端口RPC会记录NFS端口的信息,这样我们就能够通过RPC实现服务端和客户端的RPC来沟通端口信息。

     NFS在文件传送或信息传送过程中依赖于RPC协议。RPC,远程过程调用 (Remote Procedure Call) 是能使客户端执行其他系统中程序的一种机制。NFS本身是没有提供信息传输的协议和功能的,但NFS却能让我们通过网络进行资料的分享,这是因为NFS使用了一些其它的传输协议。而这些传输协议用到这个RPC功能的。可以说NFS本身就是使用RPC的一个程序。或者说NFS也是一个RPC SERVER。所以只要用到NFS的地方都要启动RPC服务,不论是NFS SERVER或者NFS CLIENT。这样SERVER和CLIENT才能通过RPC来实现PROGRAM PORT的对应。可以这么理解RPC和NFS的关系:NFS是一个文件系统,而RPC是负责负责信息的传输。

3)客户端NFS和服务端NFS通讯过程

1、首先服务器端启动RPC服务,并开启111端口
2、启动NFS服务,并向RPC注册端口信息
3、客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口
4、服务端的RPC(portmap)服务反馈NFS端口信息给客户端。
5、客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。

二、NFS部署

一、准备阶段:(客户端和服务端)
[[email protected] ~]# cat /etc/redhat- release #查看系统版本
CentOS release 6.6 (Final) [[email protected]-server ~]# uname -r #查看系统内核版本 2.6.32-504.el6.x86_64 [[email protected]-server ~]# uname -m #查看系统是否64位 x86_64
二、NFS服务端所需的软件列表
nfs-utils:这个是NFS服务主程序(包含rpc.nfsd、rpc.mountd、daemons)
rpcbind:这个是CentOS6.X的RPC主程序(CentOS5.X的为portmap)
三、检查软件是否安装
[[email protected] ~]# rpm -qa nfs-utils rpcbind #检查安装的软件包 rpcbind-0.2.0-12.el6.x86_64 nfs-utils-1.2.3-70.el6_8.2.x86_64
<如果没有安装在系统中通过yum 命令进行安装以上两个包>
[[email protected] ~]# yum install -y nfs-utils rpcbind #安装上述所需的两个软件包
四、启动NFS服务端相关服务
---开启rpcbind服务
[[email protected] ~]# /etc/init.d/rpcbind status  #查询rpcbind服务状态并启动 rpcbind (pid 1281) is running... 
[[email protected] ~]# lsof -i : 111 #查询rpcbind监听状态 (111是rpcbind的主端口)
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rpcbind 1281 rpc 6u IPv4 10766 0t0 UDP *:sunrpc rpcbind 1281 rpc 8u IPv4 10769 0t0 TCP *:sunrpc (LISTEN) rpcbind 1281 rpc 9u IPv6 10771 0t0 UDP *:sunrpc rpcbind 1281 rpc 11u IPv6 10774 0t0 TCP *:sunrpc (LISTEN)
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1281/rpcbind tcp 0 0 :::111 :::* LISTEN 1281/rpcbind udp 0 0 0.0.0.0:608 0.0.0.0:* 1281/rpcbind udp 0 0 0.0.0.0:111 0.0.0.0:* 1281/rpcbind udp 0 0 :::608 :::* 1281/rpcbind udp 0 0 :::111 :::* 1281/rpcbind
[[email protected] ~]# chkconfig --list rpcbind #检查rpcbind自启动情况 rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[[email protected] ~]# rpcinfo -p localhost #查看NFS服务项rpc服务器注册的端口信

<这个是还未启动NFS服务的rpcbind状态>
---启动NFS服务
[[email protected] ~]# /etc/init.d/nfs status #查看NFS服务并启动 rpc.svcgssd is stopped rpc.mountd is stopped nfsd is stopped rpc.rquotad is stopped 
[[email protected] ~]# /etc/init.d/nfs start
Starting NFS services:  [  OK  ] Starting NFS quotas: [  OK  ] Starting NFS mountd: [  OK  ] Starting NFS daemon: [  OK  ] Starting RPC idmapd: [  OK  ] 
[[email protected]-server ~]# lsof -i :2049 #查看NFS端口启动(NFS默认端口为2049) [[email protected]-server ~]# netstat -lntup|grep 2049 #查看NFS端口启动(NFS默认端口为2049) tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN - tcp 0 0 :::2049 :::* LISTEN - udp 0 0 0.0.0.0:2049 0.0.0.0:* - udp 0 0 :::2049 :::* -
[[email protected] ~]# rpcinfo -p localhost #启动NFS过后rpcbind服务已经启用了对NFS的端口映射
<这个是启动FNS服务过后 的rpcbind的状态>
[[email protected] ~]# chkconfig --list nfs #查看nfs的开机自启动情况 nfs 0:off 1:off 2:on 3:on 4:on 5:on 6:off [[email protected]-server ~]# chkconfig nfs on #让NFS开机自启动
由于在NFS服务过程中,必须先启动rpcbind,再启动nfs,这样才能让NFS在rpcbind上注册成功
[[email protected] ~]# less /etc/init.d/rpcbind  #查看rpcbind服务启动详情

同理我们查看nfs服务的自启动详情
[[email protected] ~]# less /etc/init.d/nfs

<由上面可以看出系统默认会让rpcbind服务先启动,再启动nfs服务,但是在实际生产环境中,我们最好不要用chkconfig来控制服务的开机自启动,我们生产环境中我们一般用rc.local来管理。主要是为了方便以后查阅哪些服务开机自己,并且能控制先后顺序,如图>
<为了规范化我们用rc.local来管理开机自启动>
[[email protected] ~]# vi /etc/rc.local

NFS服务常见进程的详细说明
我们可以重NFS服务的启动过程看到以下几个进程:
rpcuser 1303 1 0 Nov22 ? 00:00:00 rpc.statd #检查文件一致性 root 1512 2 0 Nov22 ? 00:00:00 [rpciod/0] rpc 2723 1 0 02:43 ? 00:00:00 rpcbind root 2896 1 0 02:56 ? 00:00:00 rpc.rquotad #磁盘配额进程 root 2901 1 0 02:56 ? 00:00:00 rpc.mountd #权限管理验证等 root 2908 2 0 02:56 ? 00:00:00 [nfsd4] root 2909 2 0 02:56 ? 00:00:00 [nfsd4_callbacks] root 2910 2 0 02:56 ? 00:00:00 [nfsd] root 2911 2 0 02:56 ? 00:00:00 [nfsd] root 2912 2 0 02:56 ? 00:00:00 [nfsd] root 2913 2 0 02:56 ? 00:00:00 [nfsd] #NFS主进程,管理登入,身份判定 root 2914 2 0 02:56 ? 00:00:00 [nfsd] root 2915 2 0 02:56 ? 00:00:00 [nfsd] root 2916 2 0 02:56 ? 00:00:00 [nfsd] root 2917 2 0 02:56 ? 00:00:00 [nfsd] root 2948 1 0 02:56 ? 00:00:00 rpc.idmapd #名称映射

<如果对上述进程不明白可以 用man命令查阅帮助信息,如 “man rpc.statd”>

五、配置NFS服务端
前面介绍了NFS的启动,接下来我们配置NFS服务端的配置
/etc/exports 是NFS程序的配置文件。并且默认为空
/etc/exports文件的配置格式为:
NFS共享目录 NFS客户端地址1(参数1,参数2,参数3......) 客户端地址2(参数1,参数2,参数3......)
NFS共享目录 NFS客户端地址(参数1,参数2,参数3......)
<我们在此共享给 192.168.1.0/24所有主机,>
<man exports 查看 例子和参数详情。如下:>
配置完成exports后平滑重启NFS服务 ,下面两条命令等同
[[email protected] ~]# /etc/init.d/nfs reload [[email protected]-server ~]# exportfs -r
[[email protected] ~]# showmount -e 127.0.0.1 #查看本机挂载情况
<必须先启动rpcbinc 再启动nfs才会显示正确>
[[email protected] ~]# mount -t nfs 192.168.1.5:/data /mnt #在本机测试挂载

<我们用客户机器进行挂载并测试>
<挂在过后由于权限问题,我们不能再/mnt里面进行编辑删除新增文件等操作。接下来为/data目录进行权限的设置>
六、配置NFS客户端
客户端也需要安装rpcbind和nfs-utils软件,并且设置开机自启动。(只需要启动rpcbind即可)
然后再进行如下操作
<自此,我们配置成功,但是别高兴。我们只是挂载动作完成了,但是我们没有权限对挂载的目录进行各种操作。>
接下来我们在服务端配置如下命令,给/data目录添加nfsnobody权限,
[[email protected] ~]# cat /var/lib/nfs/etab  #查看一条配置的详细信息

现在我们可以对挂载目录进行各种操作,但是还没有完。我们需要把挂载命令放在rc.local里面,
我们不要把挂载命令放在fstab,因为fstab比网络先启动,会出现挂载不上网络NFS
-------------------------------------------------------------------------------------------------------
WINDOWS客户端的配置
现在我们客户端和服务端的NFS配置都已经完成,多台客户端同上的客户端操作,
如果是WINDOWS客户端,我们需要在程序和功能里面启用 NFS客户端。
 
Windows 7 连接 NFS Server:
控制面板——所有控制面板项——程序和功能——勾选NFS服务,NFS客户端
CMD 进入命令行
mount ip:/www/abc/ z:
 
其它不支持直接连接NFS Server的windows,可以在系统上面安装SFU (Windows Services for UNIX),点开始–>点程序–>点Windows Services for UNIX–>Korn Shell
mount ip:/www/abc/ z:
------------------------------------------------------------------------------------------------------
总结NFS服务的配置过程:
--服务端--
1.安装软件
yum install -y nfs-utils rpcbind
2.启动服务(先启动rpcbind)
/etc/init.d/rpcbind start
/etc/init.d/nfs start
3.设置开机自启动
chkconfig nfs on
chkconfig rpcbind on
修改rc.local
4.配置NFS服务
echo "/data 192.168.1.5/24(rw,sync)"
mkdir -p /data
chown -R nfsnobody.nfsnobody /data
5.重新加载服务
/etc/init.d/nfs reload 或者 exportfs -r
6.检查或测试挂载
showmount -e localhost
mount -t nfs 192.168.1.5:/data /mnt
 
--客户端-
1.安装软件
yum install -y nfs-utils rpcbind
2.启动rpcbind
/etc/init.d/rpcbind start
3.配置开机自启动
chkconfig rpcbind on
或者修改rc.local
4.测试服务端共享情况
show -e 192.168.1.5
5.挂载
mkdir -p /data
mount -t nfs 192.168.1.5:/data /data
6.测试是否有读写权限
-----------------------------------------------------------------------------------------------
常见错误
1.df -h 检查服务端的NFS服务是不是启动成功,
2.确认NFS客户端showmount是否OK。
3.确认rpcbind上是否有NFS注册,(rpcbind必须先启动)
3.确认网络是否通畅
4.确认是否因为防火墙挡住(一般内网不需要开启防火墙,在出口加防火墙就够了)
-----------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------
三、nfs+drbd+heartbeat实现高可用文件系统
上述完成了NFS的配置,可是此时服务端是单点,一旦故障,保存在nfs上的数据将会无法连接,那么下面要解决的就是nfs上的数据如何做到冗余?服务器出了故障如何切换?
答案就是:先搭建heartbeat解决切换问题,再搭建drbd解决数据冗余问题,最后搭建NFS提供数据文件共享。
1、两台服务器上,heartbeat的haresources文件中进行drbd与heartbeat的关联
[[email protected] ~]# vi /etc/ha.d/haresources
master IPaddr::172.16.87.199/24/eth1 drbddisk::web Filesystem::/dev/drbd0::/drbd-data::ext4 killnfsd
 
    
# vi /etc/ha.d/resource.d/killnfsd
killall -9 nfsd; /etc/init.d/nfs restart;exit 0
# chmod 755 /etc/ha.d/resource.d/killnfsd
注:该文件内IPaddr,Filesystem等脚本存放路径在/etc/ha.d/resource.d/下,也可在该目录下存放服务启动脚本(例如:mysql,www),将相同脚本名称添加到/etc/ha.d/haresources内容中,从而跟随heartbeat启动而启动该脚本。
 
IPaddr::172.16.87.199/24/eth1:用IPaddr脚本配置对外服务的浮动虚拟IP

drbddisk::r0:用drbddisk脚本实现DRBD主从节点资源组的挂载和卸载

Filesystem::/dev/drbd0::/drbd-data::ext4 killnfsd 文件系统,目录及格式,后跟nfs资源脚本

2、nfs客户端挂载至heartbeat提供的虚拟vip上
mount -t nfs VIP:/drbd-data  /testdata1

3、测试高可用
主服务器上关闭heartbeat服务---》VIP释放---》drbd资源是释放---》查看从服务器的各项状态
查看vip的切换 #ip add
查看drbd的主从状态 #cat /proc/drbd
查看nfs挂载情况 #df -h

通过一台测试机,挂载到虚地址,当故障切换时,nfs无间断提供服务,提供完美冗余。


此文为头条号作者技术男诺言原创,特此申明