简介 NFS 是Unix 世界最通用共享文件系统的方式,NFS Server 常扮演企业中重要的File Server。但是实务应用上时常遇到一个问题,当NFS Serverc Crash 会 造成所有NFS Client 相关Session 无法正常运作及终止。问题严重时,甚至NFS Client 及Server 都需reboot 才能解决问题。关于此问题,笔者尝试用 RedHat Cluster Suite 架构HA 的机制来解决此问题,当主要的NFS Server 故障时,另一台备用的NFS Server 能立刻接手继续提供NFS 服务。 测试环境
软件 RedHat Enterprise Linux ES 版Update 2 RedHat Cluster Suite Update 2 硬件 x 86 服务器两台 两张网络卡 Adaptec SCSI Card 29320-R 两张 Proware Rackmount 3000I3 磁盘阵列 图1:Proware Rackmount 3000I3 磁盘阵列
操作步骤: 1. High Availability NFS Cluster 架构规划 笔者测试架构的简图如图2。主要服务器node1 的ip 为192.168.0.201,备用服务器node2 的ip 为192.168.0.202,整个HA Cluster 对外的service ip 为192.168.0.200。 图2:High Availability NFS Cluster 架构图 2.设置Proware Rackmount 3000I3 磁盘阵列 这款磁盘阵列,很容易便可从面板上的「Sel」键设置成RAID 5 的磁盘(可参考其安装手册第五章)。假如SCSI 排线连接正确,从node1 或node2 执行「hwbrowser」应可看到Proware Rackmount 上的Share Disk(图3)。 点击查看大图 图3:hwbrowser 画面 3.安装Red Hat 集群管理员套件 用root 登入node1 安装clumanager 与redhat-config-cluster 套件才能设置RedHat 集群管理员,将光盘收入光驱中,便会自动执行安装程序(图4)。请选 取「clumanager」及「redhat-config-cluster」套件进行安装(图5);在node2亦重复此步骤。 点击查看大图 图4:Red Hat 集群管理安装画面 图5:选取「clumanager」及「redhat-config-cluster」套件 或利用rpm 方式安装: [root@node2 RPMS]# rpm -ivh clumanager-1.2.12-1.i386.rpm [root@node2 RPMS]# rpm -ivh redhat-config-cluster-1.0.2-1.1.noarch.rpm [root@node1 root]# rpm -qa grep clu clumanager-1.2.12-1 redhat-config-cluster-1.0.2-1.1 4.编辑 /etc/hosts [root@node1 root]#vi /etc/hosts 127.0.0.1 localhost.localdomain localhost 192.168.0.201 node1.example.com node1 192.168.0.202 node2. example.com node2 并将此文件scp 至node2 [root@node1 root]#scp /etc/hosts node2:/etc/hosts 5.设置集群共享分区(Configuring Shared Cluster Partitions) 共享集群共享分区是用来存放集群的状态信息,存放内容如下: 集群锁定状态 服务状态 设置信息 每一个成员将会定期的写入它的服务状态到共享的储存空间,共需要建立两个集群共享分区:primary 及shadow。假如primary 的共享分区毁损了,集群成员还可以从shadow 或备用共享分区读取信息,并且在同时修复primary 分区,资料的一致性是透过检查码(checksums) 来维护,而且任何在两个分区间的不一致资料将会自动地修正。 假如一个成员在开机时无法写入两个共享的分区,它将不被允许加入集群。集群共享分区的需求如下: 两个分区至少需要 10MB 的空间 共享的分区必须是 raw 装置,它们不能含有文件系统。 共享分区只能由集群的状态与设置信息所使用 [root@node1 root]# fdisk -l /dev/sdb Disk /dev/sdb: 80.0 GB, 80018931712 bytes 255 heads, 63 sectors/track, 9728 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Command (m for help): p <- 印出现有partition table Disk /dev/sdb: 80.0 GB, 80018931712 bytes 255 heads, 63 sectors/track, 9728 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System Command (m for help): n <- 新增第一个共享分区 Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-9728, default 1): Using default value 1 Last cylinder or +size or +sizeM or +sizeK (1-9728, default 9728): +20M Command (m for help): <- 新增第二个共享分区 Command action e extended p primary partition (1-4) p Partition number (1-4): 2 First cylinder (4-9728, default 4): Using default value 4 Last cylinder or +size or +sizeM or +sizeK (4-9728, default 9728): +20M Command (m for help): p Disk /dev/sdb: 80.0 GB, 80018931712 bytes 255 heads, 63 sectors/track, 9728 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sdb1 1 3 24066 83 Linux /dev/sdb2 4 6 24097+ 83 Linux Command (m for help): w <- 写入partition table The partition table has been altered! Calling ioctl() to re-read partition table. WARNING: Re-reading the partition table failed with error 16: 设备或系统资源忙碌中. The kernel still uses the old table. The new table will be used at the next reboot. Syncing disks. [root@node1 root]# reboot <- 重新启动 6.建立raw 装置 在设置集群共享分区后,请在分区上建立raw 装置,共享的分区上不能含有文件系统。要建立一个 raw 装置,必需编辑 /etc/sysconfig/rawdevices 文件案来系结一个 raw 字符装置到适当的区块装置以使得该raw 装置可以被开启、读取与写入。 [root@node1 root]# cat /etc/sysconfig/rawdevices # raw device bindings # format: <rawdev> <major> <minor> # <rawdev> <blockdev> # example: /dev/raw/raw1 /dev/sda1 # /dev/raw/raw2 8 5 /dev/raw/raw1 /dev/sdb1 /dev/raw/raw2 /dev/sdb2 [root@node2 root]# cat /etc/sysconfig/rawdevices # raw device bindings # format: <rawdev> <major> <minor> # <rawdev> <blockdev> # example: /dev/raw/raw1 /dev/sda1 # /dev/raw/raw2 8 5 /dev/raw/raw1 /dev/sdb1 /dev/raw/raw2 /dev/sdb2 编辑完/etc/sysconfig/rawdevices 文件后,可以重新开机 或者是执行下列指令来使其生效。 #service rawdevices restart #使用 raw -aq 指令可查询所有的raw 装置 [root@node1 root]# raw -aq /dev/raw/raw1: bound to major 8, minor 17 /dev/raw/raw2: bound to major 8, minor 18 7.设置集群名称 选择『主选单』=>『系统设置』=>『服务器设置』=>『集群』。 或在shell 提示符号下输入redhat-config-cluster 指令。 图6:设置集群名称 8.设置Share Raw Device 选择redhat-config-cluster 上的「Cluster」=>「Shared State」便可看到图7 的画面,填入正确的Raw Device。 图7:Share Raw Device 9. 新增Cluster Member 选取「Member」,再点选「新增」的按钮(图8)。程序将会要求输入Member名称。请输入Cluster 中一部系统的主机名称或地址,请注意每一个Member 必须位于与执行redhat-config-cluster 的机器在同一子网络中,而且必须在 DNS或每一部集群系统的 /etc/hosts 文件中已经定义了。请新增两个Cluster Member「node1」及「node2」。(图9) 图8:新增Cluster Member 图9:nfs_cluster 的成员 10.设置Failover Domain 「Failover Domain」是指提供某种服务,可互相备用的主机集合。一个Failover Domain 含有下列的特征: Unrestricted — 指派给这个网域的一项服务可以在任何可用的成员(包括不列在此Failover Domain 内的主机)上执行 Restricted — 指派给这个网域的一项服务只能可以在Failover Domain 可用的成员上执行。 Unordered — 当一项服务被指派给一个Unordered 的Failover Domain,服务将执行于其上的成员将于未经优先级排列的可用Failover Domain 成员中来挑选。 Ordered —允许您在一个Failover Domain 中的成员间指定一个优先级,在清单顶部的成员便是最优先的,接下来便是清单中的第二个成员,依此类推。 选择「Failover Domain」的卷标页,再点选「新增」的按钮。将会出现如图10所示的「Failover Domain」对话窗口。 图10:「Failover Domain」对话窗口 勾选「Restrict failover to only these members」防止在这里未列出的任何成员接手指派给这个网域的一项服务。 勾选「Ordered Failover」依据网域中成员清单的位置来决定接管服务的优先权,较优先的成员将位于顶端。 图11:设置「Failover Domain」的属性 11.激活NFS 服务器 要建立High Availability NFS 服务,每一部集群成员都必须激活NFS 服务 # service nfs start <-- 马上激活NFS 服务 #chkconfig nfs on <-- 重开机后亦自动激活NFS 服务 还有一点需特别注意:文件系统挂载以及集群NFS 服务所相关的汇出不应该收录在/etc/fstab 或/etc/eXPorts 文件中。 12.利用「NFS Druid」来快速设置一个客户端可存取的NFS 共享 a.激活Cluster 服务:「Cluster」=>「Start Cluster Service」 b. 激活NFS 设置向导:「Cluster」=>「Configure 」=>「Add Exports」=> 「NFS」 你将会看到如图12 的画面,然后按下「Forward」。 图12:NFS Druid 画面 c.利用「NFS Druid」将/dev/sdb export 给NFS Client,目录名称为 /data,步骤如图13~图15。这个部份有几点需特别注意: Service Name—在集群中用来辨识这个服务所使用的名称 Service IP—集群的NFS 服务将被指定一个浮动的IP 地址,以用来与集群服务器的IP 地址做区分,这个IP 地址称为「Service IP」。NFS Client 存取NFS, 是透过Service IP 而不是node1 或node2 的真实IP。 这是为了不让NFS Client 知道是集群内那台服务器提供服务。这个浮动的 IP 位址将会设置在主要服务器(Master,在本例中是node1)。藉由使用这个方法,NFS 客户端只知道浮动IP 地址,而不知道已经配置了集群的 NFS 服务器的事实。 如果主要服务器故障(node1),则此Service IP 会移转至备用服务器(node2),如些一来,当主要服务器故障,备用服务器接管NFS 服务,NFS Client 完全不用做任何异动。 避免使用 exportfs –r exportfs -r 指令将移除在 /etc/exports 文件中没有特别指定的任何export 资讯,执行这个指令将会导致集群的NFS 服务变得无法被存取(直到服务被重新激活)。由于这个原因,建议您避免于已设置高存取性之NFS 服务的集群中使用exportfs -r 指令。如要回复不经意使用exportfs -r 指令,必须先停止然后再重新激活 NFS 集群服务。 图13:export 与Client 选项 图14:设置Service Name 与Service IP 图15:选择export 的Device 在「NFS Druid」的最后,点选「套用」来建立这个服务。并从「集群设置工具」中选择「文件」=>「储存」来储存设置。 13.将node1 的/etc/cluster.XML 复制至node2 集群设置工具将集群服务与系统程序、集群成员与集群服务的信息储存在/etc/cluster.xml 配置文件。所以当node1 巳完成设置后,请将/etc/cluster.xml 复制至node2 上,并激活node2 上的「clumanager」程序。 [root@node1 root]# scp /etc/cluster.xml node2:/etc/cluster.xml root@node2's passWord: cluster.xml 100% 1405 [root@node2 root]# service clumanager start Starting Red Hat Cluster Manager... Loading Watchdog Timer (softdog): [ OK ] Starting Quorum Daemon: 14.修改node1 及node2 上的/etc/syslog.conf 指定Cluster Log 存放位置。 [root@node1 root]# vi /etc/syslog.conf # Add for cluster local4.* /var/log/cluster # service syslog restart [root@node2 root]# vi /etc/syslog.conf # Add for cluster local4.* /var/log/cluster # service syslog restart 15.查看集群状态 选择 『集群』 => 『设置』 显示集群状态(图16)。 图16:集群状态图 16.测试High Availability NFS Cluster,下面是笔者的测试过程,用此来证明当node1 Crash 时,node2 确实可Take Over NFS 服务,达到High Availability 目的。 [root@FTP root]# showmount -e 192.168.0.200 Export list for 192.168.0.200: /data * [root@ftp root]#mkdir /mnt/nfs [root@ftp root]#mount 192.168.0.200:/data /mnt/nfs [root@ftp root]#mount ........... ........... 192.168.0.200:/data on /mnt/nfs type nfs (rw,addr=192.168.0.200) [root@ftp root]# cd /mnt/nfs 此时将node1 电源关掉或执行「poweroff」指令仿真node1 Crash [root@ftp nfs]# ls 此时大约会hang 5~10 秒,node1 便接管NFS 服务,ls 指令执行结果便会出现。
后记 本文笔者利用RedHat Cluster Suite 加上SCSI Share Disk 构建High Availability NFS Cluster。由于SAN 的流行,而且愈来愈多厂商对于Linux HA 解决方案感兴趣,下期文章笔者将继续介绍如何在SAN 环境下构建RedHat High Availability Cluster。
[1] [2] 下一页
(出处:http://www.sheup.com)
上一页 [1] [2]