关于
我的项目
相关阅读
热度排行
- [转] 宫崎骏用动漫教给我们的人生哲理,每一句都能说到心里! - (日期:[八月 24, 2013] 点击:[53,185])
- Google 网页爬虫报告无法连接站点解决办法 - (日期:[七月 20, 2014] 点击:[38,634])
- 架设Tiny Tiny RSS(TTRSS)阅读器,找回Google Reader! - (日期:[九月 27, 2013] 点击:[27,764])
- SkyDrive、DropBox和Google Drive三大公有云存储服务对比 - (日期:[六月 25, 2013] 点击:[25,568])
- 升级到至强E5440后,与i5 CPU笔记本性能对比 - (日期:[二月 18, 2014] 点击:[23,704])
- 公钥私钥加密解密数字证书数字签名详解 - (日期:[四月 19, 2014] 点击:[22,955])
- 本站建站技术合集 - (日期:[九月 20, 2013] 点击:[22,481])
- 使用OpenerDNS解决无法访问Google的问题 - (日期:[七月 5, 2014] 点击:[21,784])
- WordPress博客添加“返回顶部”按钮 - (日期:[七月 14, 2013] 点击:[21,194])
- Linux文件系统基础之inode和dentry - (日期:[三月 13, 2015] 点击:[20,161])
- 云存储中的HTTP鉴权算法分析 - (日期:[二月 7, 2014] 点击:[18,636])
- 存储基础知识之——磁盘阵列原理及操作实战 - (日期:[二月 9, 2014] 点击:[17,487])
- 精选37条强大的常用linux shell命令组合 - (日期:[九月 4, 2013] 点击:[17,425])
- DNS原理、架构和配置详解 - (日期:[九月 6, 2013] 点击:[16,798])
- Netty和Jetty的Java NIO 网络框架模型分析 - (日期:[七月 13, 2013] 点击:[16,330])
- CoreOS 初识之安装 - (日期:[十一月 16, 2014] 点击:[16,167])
- Windows与Linux文件系统互访的几种方法 - (日期:[八月 21, 2014] 点击:[15,729])
- Dijkstra算法求解最短路径分析 - (日期:[七月 12, 2014] 点击:[14,923])
- NAS解决方案实现多媒体文件共享播放 - (日期:[十二月 21, 2014] 点击:[13,907])
- 简介 - (日期:[九月 1, 2012] 点击:[13,750])
- 如何编程实现 2 + 2 = 5? - (日期:[六月 2, 2014] 点击:[13,267])
- 搭建了一个iNews程序 - (日期:[十月 15, 2013] 点击:[13,234])
- 2014年9月曝出的Bash ShellShock漏洞简析 - (日期:[九月 26, 2014] 点击:[13,134])
- 彻底解决WordPress博客垃圾评论的问题 - (日期:[八月 5, 2013] 点击:[13,081])
- 如何使用1M的内存排序100万个8位数 - (日期:[三月 27, 2014] 点击:[12,551])
- 全部日志列表 - (日期:[十一月 11, 2012] 点击:[12,322])
- 关于回调函数和this指针探讨 - (日期:[八月 24, 2014] 点击:[12,206])
- 给定一个long型常量,其值为x,给定long型变量a,要求a & x 的取值集合 - (日期:[九月 8, 2012] 点击:[11,699])
- WordPress建站必备实用插件 - (日期:[八月 7, 2014] 点击:[11,358])
- Amazon 云计算业务全面介绍 - (日期:[三月 9, 2014] 点击:[11,266])
分类目录
文章归档
- 2024年四月 (1)
- 2024年二月 (1)
- 2023年九月 (1)
- 2023年一月 (1)
- 2022年十月 (1)
- 2022年八月 (2)
- 2022年四月 (1)
- 2022年三月 (1)
- 2021年十二月 (2)
- 2021年十月 (2)
- 2021年九月 (1)
- 2021年八月 (1)
- 2021年五月 (1)
- 2021年三月 (2)
- 2021年一月 (2)
- 2020年十二月 (5)
- 2020年十一月 (2)
- 2020年十月 (2)
- 2020年九月 (1)
- 2020年八月 (5)
- 2020年七月 (2)
- 2019年九月 (1)
- 2018年八月 (1)
- 2018年七月 (1)
- 2018年六月 (1)
- 2018年五月 (1)
- 2018年三月 (1)
- 2018年二月 (1)
- 2018年一月 (2)
- 2017年十二月 (3)
- 2017年十月 (4)
- 2017年九月 (1)
- 2017年七月 (1)
- 2017年六月 (1)
- 2016年十二月 (1)
- 2016年十月 (1)
- 2016年九月 (1)
- 2016年七月 (2)
- 2016年六月 (1)
- 2016年二月 (3)
- 2015年十二月 (3)
- 2015年十一月 (2)
- 2015年十月 (1)
- 2015年八月 (2)
- 2015年七月 (4)
- 2015年六月 (1)
- 2015年三月 (2)
- 2015年二月 (1)
- 2015年一月 (4)
- 2014年十二月 (2)
- 2014年十一月 (2)
- 2014年十月 (5)
- 2014年九月 (8)
- 2014年八月 (11)
- 2014年七月 (17)
- 2014年六月 (7)
- 2014年五月 (15)
- 2014年四月 (16)
- 2014年三月 (14)
- 2014年二月 (5)
- 2013年十二月 (5)
- 2013年十一月 (3)
- 2013年十月 (13)
- 2013年九月 (13)
- 2013年八月 (13)
- 2013年七月 (9)
- 2013年六月 (8)
- 2013年五月 (1)
- 2013年三月 (3)
- 2013年一月 (1)
- 2012年十一月 (1)
- 2012年九月 (12)
- 2012年八月 (3)
- 2011年二月 (1)
- 2009年三月 (1)
- 2009年二月 (1)
- 2008年十一月 (1)
- 2008年六月 (1)
- 2008年四月 (1)
- 2008年三月 (1)
基于DRBD的高可用NFS解决方案分析
之前对DRBD分析比较多,但是一直没有找到该怎么用他。最近又在看NFS协议(RFC3530)。分析了NFS4对于的迁移、复制和服务端重启等场景的定义。DRBD提供块设备,其上是文件系统,而NFS在文件系统上层,二者结合可以构建一个高可用的文件共享解决方案。关于DRBD,在之前的博客中有一些分析(tag:DRBD)。对于NFS,从如下示意图可以看出其在系统中的位置:
传统的DAS存储模型:主机直接连接存储设备,使用总线接口进行访问。
而对于NAS,同时又客户端和服务端,二者使用以太网进行连接,最新的NFS4版本基于TCP/IP协议。
NFS在网络分层模型中的位置:
这样DRBD相当于提供了底层的存储设备,虚拟出块设备来,在该块设备上面建立文件系统,再将该文件系统上的目录共享为NFS服务,这样客户端就可以通过NFS来访问一个DRBD提供的网络镜像硬盘,当一端故障时,倒换,另一端还能继续访问。
我们知道,对于本地文件系统,只要知道文件的FID就可以访问文件的inode结构,进而操作文件。但是NFS则不一样,NFS的文件系统是虚拟出来的,在服务端,可能有多个文件系统中存在相同的FID,因此必须用一个唯一标识一个文件的句柄,这个句柄就是由FSID和FID来组成。
再来看这里的高可用解决方案,DRBD是对整个块设备进行了实时复制,那么文件系统在双机的两端应该也是完全一致的。如果两台主机共用一个浮动IP,由DRBD的主端来决定浮动IP绑定到哪一端。当发生倒换时,原主端的DRBD镜像出来的共享硬盘设备切换到对端,在对端重新挂载,然后再启动NFS服务,这样其实就相当于是NFS服务进程在本端重启了一次,对于重启,协议有明确的grace time定义,只要服务端和客户端按此实现,那么对于客户端的上层应用这个倒换是不感知的。当客户端重新以其持有的NAS FH访问文件时,在对端仍然能解析出FSID和FID,同样找到具体的文件来访问。
整个想法理论上面来说应该是没有问题。开始搭建这样一个验证环境。按照:DRBD远程实时双机热备系统配置完全手册文章介绍的步骤配置DRBD,挂载到本地/drbd目录,然后在NFS的配置文件中配置导出该目录。另起一个虚拟机,作为客户端,通过浮动IP挂载该共享目录,并开启复制一个大文件到该目录的过程,这样模拟业务在线。
在此过程中,进行DRBD、NFS和浮动IP的倒换。倒换流程:
1、停止主端NFS
2、倒换DRBD到对端
3、对端启动NFS服务
4、切换浮动IP地址到到对端
预期在经过了NFS服务的静默期后,原来的大文件操作仍然能继续。客户端不会提示任何错误。
实际的结果是,客户端提示NFS句柄无效。 本来还想找更高版本的Linux系统,验证NFS4版本是否能支持,但是由于Linux高版本中DRBD配置一直没有搞定,没能成功。但是一想,其实都是RPC,都是基于NAS FH,并不是协议的问题。DRBD设备上面的文件系统是挂载在系统宿主文件系统上面的,有一个块设备文件到文件系统的转换过程,对于NFS服务,根本看不到原来的DRBD设备上面的文件系统,看到的还是根文件系统。虽然DRBD是保证了文件系统的完全镜像,但是挂载之后,二者的inode分配并不一致,因此在解析客户端传过来的FH时,也是无法找到具体的文件的。以后有空可以分析一下NFS的源码,看能否通过其他方式实现直接共享DRBD设备上面的文件系统的内容,而不是通过挂载到宿主文件系统再共享的方式。
补充:还是把NFS4和DRBD的双机方案给配置出来了,并且找到了文件系统ID与客户端FH之间的依赖的问题的解决方案。
关于drbd提供的块设备挂载到宿主文件系统后,服务端不能识别的FH的问题,NFS服务端在导出文件本地文件系统时,可以为导出的目录指定fsid,如果没有指定,则使用一个UUID,这样修改exports文件后问题解决,能正确观察到DRBD和NFS倒换后,NFS客户端业务不中断的过程,甚至还可以看到客户端重传RPC命令字的过程,首次执行读写文件客户端挂载的nfs目录时,有较长时间的延时。
修改后的exports文件为:
[root@f2 nfs]# cat /etc/exports /drbd *(fsid=1047,rw,sync,root_squash)
实验过程中用到的脚本为:
1、启动NFS服务
[root@f2 tools]# cat startnfs systemctl start rpcbind.service nfs-idmap.service nfs-server.service
2、停止NFS服务
[root@f2 tools]# cat stopnfs systemctl stop rpcbind.service nfs-idmap.service nfs-server.service
3、启动drbd
[root@f2 tools]# cat startdrbd
modprobe -s drbd
sleep 10
drbdadm adjust-with-progress all
sleep 15
drbdadm wait-con-int
drbdadm sh-b-pri all
cat /proc/drbd
4、将本端置为主,或者倒换NFS和DRBD
[root@f2 tools]# cat pridrbd hn=`hostname` dsthn="f1" if [ $hn = "f1" ] then dsthn="f2" fi ssh $dsthn "ifconfig ens33:0 down" ssh $dsthn "sh /root/tools/stopnfs;" ssh $dsthn "umount /dev/drbd0; drbdsetup /dev/drbd0 secondary; sleep 2;" drbdsetup /dev/drbd0 primary sleep 2; mount /dev/drbd0 /drbd sh /root/tools/startnfs /sbin/exportfs -rv ifconfig ens33:0 192.168.1.120
5、客户端挂载NFS目录
mount -t nfs4 192.168.1.120:/drbd /nfs
参考页面:
1、Highly Available NFS Storage with DRBD and Pacemaker https://www.suse.com/documentation/sle_ha/singlehtml/book_sleha_techguides/book_sleha_techguides.html
2、关于NFS http://blog.yikuyiku.com/?tag=nfsv4
3、NFSv4 提供无缝的网络访问 http://www.ibm.com/developerworks/cn/linux/l-nfsv4.html
4、NFS文件句柄 http://blog.csdn.net/ycnian/article/details/8506704