简介
本文是系列文章中的第 4 部分,也是最后一部分。该系列文章涵盖了安装和设置一个大型 Linux 计算机集群的全部内容。有关如何从多个独立的硬件和软件创建一个可运行的 Linux(R) 集群的资源很多,本系列力求把这些公共领域里的资源中的最新信息集中起来以供您参考。本系列文章无意为您提供有关如何设计一个新的大型 Linux 集群的基础知识;要获得一般性的架构方面的知识,请参考本文中提到的相关参考资料和 Redbooks™。
本系列是针对系统架构师和系统工程师使用 IBM eServer™ Cluster 1350 框架(关于该框架的更多信息,请参见 参考资料 )计划和实现 Linux 集群而设计的。其中的一部分内容可能会与集群管理员的日常集群操作有关。本文的每个章节都针对相同的示例安装。
本系列的 第 1 部分 详细阐述了设置集群硬件的操作指导。 第 2 部分 带您亲历了硬件配置的后续步骤:安装软件,这其中会用到 IBM systems 管理软件、Cluster Systems Management (CSM) 和节点安装。
第 3 部分 和本文(介绍集群存储后端)全面介绍了存储的硬件配置以及 IBM 共享文件系统 GPFS(General Parallel File System)的安装和配置。 第 3 部分 详细讨论了存储系统的架构、硬件准备以及存储区域网络(Storage Area Network,SAN)的设置。本文是系列文章的第 4 部分,也是最后一部分,提供了有关特定于此示例集群存储后端的 CSM 的详细信息,尤其是如何执行存储系统的节点安装以及 GPFS 的集群配置。
详细介绍节点安装细节
本节详细介绍了与示例集群的存储后端相关的集群服务器管理(CSM)细节。内容包括在每个节点上安装 GPFS 代码,以及为存储节点配置 Qlogic 适配器。请注意这种配置并不一定需要使用 CSM 执行;也可以手工完成。本文中的例子使用 CSM 几乎实现了新服务器安装的自动化,包括存储服务器。
回顾架构问题
在阅读本节之前,先阅读一下本系列 第 1 部分 中有关总体集群架构的章节将会很有益处。阅读 第 3 部分 中有关存储架构的章节将会获益良多。理解整个架构可以使您更好的利用本文中的信息。
按照正确的顺序安装存储节点
按照正确的顺序进行安装是解决后面介绍的 ROM 溢出问题所必须的,因为该配置中使用的 xSeries™ 346 系统没有使用 RAID 7K 卡。请按照以下顺序完成这些步骤:
- 在管理服务器上运行 csmsetupks -vxn <nodename>。
- 断开存储服务器与 SAN 上的连接,从而避免在 SAN 磁盘上安装操作系统,这些磁盘会被首先找到。
- 在管理服务器上运行 installnode -vn <nodename>。
- 当存储节点重新启动时在控制台上按 F1 键进入 BIOS。
- 进入 Start Options,并将 PXEboot 从 disabled 修改为 enabled for planar ethernet 1。
- 让节点重新启动,开始安装。
- 从终端服务器上监视安装过程,让节点全部引导。
- 登录到节点中,监视 csm 安装 log /var/log/csm/install.log。
- 在 post-reboot 任务完成时重新启动节点。
- 当节点重新启动时,按 F1 键进入 BIOS。
- 进入 Start Options,将 PXEboot 修改为 disabled。
- 插上 SAN 线,让节点完全引导。
- 按照 配置磁盘路径和负载均衡 中介绍的方法使用 MSJ 配置磁盘路径。
提供节点间无密码的根访问权限
GPFS 需要 GPFS 集群中的所有节点都能够使用根用户 ID 访问其他节点,而不需要提供密码。GPFS 使用这个中间节点的访问允许 GPFS 集群中的任何节点在其他节点上运行相关命令。例如,此处就使用了安全 shell(ssh)来提供这种访问能力,不过您也可以使用远程 shell(rsh)。为此,请创建一个集群范围内的密钥和相关配置文件,然后按照下面的步骤使用 CSM 分发这些文件:
- 创建两个新目录 /cfmroot/root/.ssh 和 /cfmroot/etc/ssh。
- 输入
ssh-keygen -b 1024 -t rsa -f /cfmroot/etc/ssh/ssh_host_rsa_key -N "" -C "RSA_Key"
,创建一个 RSA 密钥对,即验证使用的公钥和私钥
ssh-keygen -b 1024 -t dsa -f /cfmroot/etc/ssh/ssh_host_dsa_key -N "" -C "DSA_Key"
,创建一个 DSA 密钥对,即验证使用的公钥和私钥
- 创建一个包含公钥的授权文件,如下所示。SSH 使用这个文件来确定是否提示输入密码。
cat /root/.ssh/id_rsa.pub > /cfmroot/root/.ssh/authorized_keys2
cat /root/.ssh/id_dsa.pub >> /cfmroot/root/.ssh/authorized_keys2
cat /cfmroot/etc/ssh/ssh_host_rsa_key.pub >> /cfmroot/root/.ssh/authorized_keys2
cat /cfmroot/etc/ssh/ssh_host_dsa_key.pub >> /cfmroot/root/.ssh/authorized_keys2
- 停止 CSM 维护 known_hosts 文件,如下所示。这个文件中包含了很多主机名。如果一个主机已经出现在这个文件中,那么 SSH 就不会提示用户确认连接。CSM 会试图维护这个文件,但是在一个不需要根密码访问的混合集群环境中,这可能会成为一种障碍。
stopcondresp NodeFullInstallComplete SetupSSHAndRunCFM
startcondresp NodeFullInstallComplete RunCFMToNode
perl -pe 's!(.*update_known_hosts.*)!#$1!' -i /opt/csm/csmbin/RunCFMToNode
- 生成一个系统范围的 known_hosts 文件。这最好通过创建一个脚本来实现,如下所示。运行这个脚本并将输出重定向到 /cfmroot/root/.ssh/known_hosts 中。
#!/bin/bash
RSA_PUB=$(cat "/cfmroot/etc/ssh/ssh_host_rsa_key.pub")
DSA_PUB=$(cat "/cfmroot/etc/ssh/ssh_host_dsa_key.pub")
for node in $(lsnodes); do
ip=$(grep $node /etc/hosts | head -n 1 | awk '{print $1}')
short=$(grep $node /etc/hosts | head -n 1 | awk '{print $3}')
echo $ip,$node,$short $RSA_PUB
echo $ip,$node,$short $DSA_PUB
done
该示例脚本只能用于单个接口。您可以对其稍加修改,从而允许跨多个接口的无密码连接。known_hosts 文件的格式已经超出了本文的范围,但是对每一行都使用一个以逗号分隔开的主机名会非常有用。
- 通过链接所生成的密钥可以允许无密码的根用户访问,如下所示。
cd /cfmroot/root/.ssh
ln -s ../../etc/ssh/ssh_host_dsa_key id_dsa
ln -s ../../etc/ssh/ssh_host_dsa_key.pub id_dsa.pub
ln -s ../../etc/ssh/ssh_host_rsa_key id_rsa
ln -s ../../etc/ssh/ssh_host_rsa_key.pub id_rsa.pub
- 您可能希望确保这种配置在安装时(操作系统重新启动之前)就安装到了每个系统上。CSM 并不能确保后安装过程的执行顺序,因此如果有任何后安装任务依赖于这种配置,就可能会失败。但也可能会成功,因此安装成功与否无法预测。例如,您可能有一个 GPFS 的后安装脚本,并且需要将一个节点添加到 GPFS 集群中,然后挂载 GPFS 文件系统。实现这种功能的一种方法是为此处创建的所有文件创建一个 tar 包,并使用一个 CSM 的 post-installation pre-reboot 脚本解包。
定义与 GPFS 有关的 CSM 组
对于本例来说,我们定义了两个主要的 CSM 组在配置 GPFS 过程中使用,如下所示。
- StorageNodes,其中只包括那些直接连接到 SAN 上的节点,例如 nodegrp -w "Hostname like 'stor%'" StorageNodes。
- NonStorageNodes,其中包括了构成 GPFS 集群的所有其他节点,例如 nodegrp -w "Hostname not like 'stor%'" NonStorageNodes。
这两个组在安装过程中用来确保执行存储节点角色的服务器可以接收特定的二进制文件和配置文件,这在下面会详细进行介绍。注意本节没有介绍 CSM 所执行的详细安装步骤。有关对这个过程的介绍,请参看本系列文章的 第 1 部分 和 第 2 部分。
安装过程被总结为以下阶段:
- 从安装服务器上进行 PXE/DHCP 引导
- 从安装服务器上开始 NFS 安装
- 执行 Pre-reboot 脚本
- 重新启动
- 执行 Post-reboot 脚本
- CFM 文件传输
- CSM 后安装配置
本文中的配置修改都是在 pre-reboot 和 CFM 文件传输阶段进行的。
安装 GPFS RPM
GPFS 需要每个集群成员都安装一个基本的 GPFS RPM 集。样例安装所使用的 GPFS 版本是 2.3.0-3。这些 RPM 的安装是一个两阶段的过程:安装 2.3.0-1 基本版本,然后更新到 2.3.0-3。这个安装使用的 RPM 有:
- gpfs.base
- gpfs.docs
- gpfs.gpl
- gpfs.msg.en_US
注意:由于本文中的例子使用的是 GPFS Version 2.3,因此并不需要安装 Reliable Scalable Cluster Technology(RSCT)并创建一个对应的域。Version 2.3 之前版本的 GPFS 需要这些手工设置这些步骤。
CSM 可以采用多种方法来安装 GPFS RPM。本文推荐在安装基本操作系统时安装 RPM。CSM 提供了一个包含定制的 RPM 的安装和更新目录结构,然而,对于最初的 RPM 安装,以及之后升级到 GPFS 2.3.0-3 所需的 RPM 安装,CSM 提供的结构不一定能够工作。
另一种方法是为 CSM 编写一些 pre-reboot post-installation 脚本来根据需要安装 RPM。在这种情况中,要将所有的 GPFS RPM(包括更新 RPM)全部拷贝到管理服务器上的 /csminstall/Linux 目录中。CSM 通常为脚本数据预留的目录是 /csminstall/csm/scripts/data,在安装过程中它会被挂载到节点上,这样就可以通过 NFS 来使用所需要的 RPM。
编写安装脚本 /csminstall/csm/scripts/installprereboot/install-gpfs.sh 来安装 GPFS。下面是一个安装脚本的示例:
#! /bin/bash
# Installs GPFS filesets and updates to latest levels
# CSMMOUNTPOINT environment variable is set by CSM
DATA_DIR=$CSMMOUNTPOINT/csm/scripts/data
cd $DATA_DIR
rpm -ivh gpfs.*2.3.0-1*.rpm
rpm -Uvh gpfs.*2.3.0-3*.rpm
echo 'export PATH=$PATH:/usr/lpp/mmfs/bin' > /etc/profile.d/gpfs.sh
一旦在存储服务器上安装 GPFS 之后,您可能还会希望自动安装 FAStT MSJ 工具,这可以以静寂(非交互)模式来完成。MSJ 用于 Qlogic 适配器、故障恢复和多路径等配置,这将在 HBA 配置 一节中详细进行介绍。安装并不是基于 RPM 的,因此默认情况下无法简单地集成到 CSM 中。要安装它,需要在 GPFS 安装程序的末尾添加一个脚本来检查这个节点是否是一个存储服务器,然后再安装 MSJ。要以静寂模式完成安装,请使用 FAStTMSJ*_install.bin -i silent 命令。
配置 Qlogic 故障恢复
示例集群使用的是 Qlogic qla2300 驱动程序,版本为 7.01.01,用于 Qlogic QLA 2342 适配器。存储节点组中的每个节点都有两个这种 PCI 适配器。qla2300 驱动程序已经成为 Red Hat Enterprise Linux 3 update 4 发行版中的标准组件了。然而,为了满足这个示例集群的需要,您需要进行以下修改:
- 修改 qla2300 驱动程序以执行故障恢复功能。这使您能够利用多个磁盘路径,如果首选路径失败,可以进行故障恢复。默认情况下没有设置这个功能。
使用脚本进行第一次修改(这个脚本在使用 CSM 安装过程中重启之前运行)。实现这种功能的脚本在 /csminstall/csm/scripts/installprereboot/ 目录中。这个脚本包含了以下命令:
#! /bin/bash
# Adds lines to /etc/modules.conf to enable failover for the qla2300 drivers
echo "options qla2300 ql2xfailover=1 ql2xmaxsectors=512 ql2xmaxsgs=128" >>
/etc/modules.conf
echo "Updating initrd with new modules.conf set up"
mkinitrd -f /boot/initrd-`uname -r`.img `uname -r`
- 设置每台主机上到磁盘的首选路径,使其可以匹配每个 DS4500 上的设置。使用通过 HBA0 看到的奇数编号的数组,以及通过 HBA1 看到的偶数编号的数组。
第二个修改需要在对存储节点重新安装时手动执行。详细信息在 在存储服务器上定义 HBA 配置 一节中介绍。
GPFS 网络调优
将该示例中提供的几行代码添加到每个节点上的 /etc/sysctl.conf 文件中,用来对 GPFS 网络进行调优。这是通过 CSM 使用的 post-reboot 安装脚本完成的。这个脚本位于 /csminstall/csm/scripts/installpostreboot 目录中,包含以下内容:
FILE=/etc/sysctl.conf
# Adds lines to /etc/sysctl.conf for GPFS network tuning
echo "# CSM added the next 8 lines to the post installation script for
GPFS network tuning" >> $FILE
echo "# increase Linux TCP buffer limits" >> $FILE
echo "net.core.rmem_max = 8388608" >> $FILE
echo "net.core.wmem_max = 8388608" >> $FILE
echo "# increase default and maximum Linux TCP buffer sizes" >> $FILE
echo "net.ipv4.tcp_rmem = 4096 262144 8388608" >> $FILE
echo "net.ipv4.tcp_wmem = 4096 262144 8388608" >> $FILE
echo "# increase max backlog to avoid dropped packets" >> $FILE
echo "net.core.netdev_max_backlog=2500" >> $FILE
# Following lines are not related to GPFS tuning
echo "# Allow Alt-SysRq" >> $FILE
echo "kernel.sysrq = 1" >> $FILE
echo "# Increase ARP cache size" >> $FILE
echo "net.ipv4.neigh.default.gc_thresh1 = 512" >> $FILE
echo "net.ipv4.neigh.default.gc_thresh2 = 2048" >> $FILE
echo "net.ipv4.neigh.default.gc_thresh3 = 4096" >> $FILE
echo "net.ipv4.neigh.default.gc_stale_time = 240" >> $FILE
# Reset the current kernel parameters
sysctl -p /etc/sysctl.conf
分发 GPFS 可移植层
GPFS 可移植层(PL)是内核特有的,必须为集群中的每个操作系统级别单独创建。PL 的作用和为示例集群创建它的过程将在 生成并安装可移植层 一节中详述。CSM 使用 CFM 文件传输工具来管理 PL 二进制文件的分发。将 PL 二进制文件拷贝到管理服务器上的 /cfmroot/usr/lpp/mmfs/bin 目录中,并对文件进行命名,使它们只会分发到相关组中具有特定内核版本的节点上。例如:
/cfmroot/usr/lpp/mmfs/bin/dumpconv._<nodegroup>
/cfmroot/usr/lpp/mmfs/bin/lxtrace._<nodegroup>
/cfmroot/usr/lpp/mmfs/bin/mmfslinux._<nodegroup>
/cfmroot/usr/lpp/mmfs/bin/tracedev._<nodegroup>
注意在大型集群中,为了减轻 CFM 的负载,可以将这 4 个文件添加到定制 RPM 中,并使用上文介绍的 GPFS RPM 安装方法与 GPFS 一起安装。
自动将新节点添加到 GPFS 集群中
简单地安装 GPFS RPMS 和可移植层无法在新安装的节点上挂载并配置 GPFS 集群中的文件系统。在小型集群中,这可以手工进行管理。然而,扩展到更大规模的集群之后,就需要自动化完成这个步骤。这可以通过使用 CSM 的监视功能来完成:监视整个新节点的安装过程,并启动一个脚本在集群中的新节点上配置和挂载 GPFS。
清单 1 给出了一个示例脚本,可以用来配置 GPFS。您可能需要针对自己的配置对这个脚本稍加修改。清单 1 提供了一些基本内容。这个脚本会接收节点名(由 CSM 监视器传入),将其添加到 GPFS 集群中,并尝试在这个节点上启动 GPFS,这个过程会提供一点错误处理功能。
清单 1. 配置 GPFS 使用的示例脚本
#!/bin/bash
# CSM condition/response script to be used as a response to the InstallComplete
# condition. This will attempt to add the node to the GPFS cluster, dealing
# with some common failure conditions along the way. Only trivial attempts are
# made at problem resolution, advanced problems are left for manual
# intervention.
# Note requires the GPFS gpfs-nodes.list file. This file should contain a list
# of all nodes in the GPFS cluster with client/manager and
# quorum/non-quorum details suitable for passing to the mmcrcluster command.
# Output is sent to /var/log/csm/
# Returned error codes:
# 1 - GPFS is already active
# 2 - unable to read the gpfs-nodes.list file
# 3 - node name not present in the gpfs-nodes.list file
# 4 - node is a quorum node
# 5 - unable to add node to cluster (mmaddnode failed)
# 6 - unable to start GPFS on the node (mmstartup failed)
# set this to the location of your node list file
gpfs_node_list=/etc/gpfs-nodes.list
# set this to the interface GPFS is using for communication
gpfs_interface=eth1
PATH=$PATH:/usr/lpp/mmfs/bin # ensure GPFS binaries are in the PATH
log_file=/var/log/csm/`basename $0`.log # log to /var/log/csm/
touch $log_file
# Get the node short name as set by RSCT condition ENV var ERRM_RSRC_NAME
node=`echo $ERRM_RSRC_NAME | cut -d. -f1`
(
[ ! -r "$gpfs_node_list" ] && echo " ** error: cannot read GPFS
node list $gpfs_node_list" && exit 2
echo
echo "--- Starting run of `basename $0` for $node at `date`"
# Is the node a quorum node? If so exit.
quorum_status=`grep $node $gpfs_node_list | cut -d: -f2 | cut -d- -f2`
if [ -n "$quorum_status" ]; then
if [ "$quorum_status" = "quorum" ]; then
echo "** error: this is a quorum node, stopping..."
exit 4
else
node_s=`grep $node $gpfs_node_list | cut -d: -f1`
fi
else
echo "** error: could not find node $node in GPFS node list $gpfs_node_list"
exit 3
fi
# Find out if the node is already part of the cluster
if mmlscluster | grep $node >/dev/null; then
# check the node status
status=`mmgetstate -w $node | grep $node | awk '{print $3}'`
if [ "$status" = "active" ]; then
echo "** error: this node already appears to have GPFS active!"
exit 1
fi
# attempt to remove node from cluster
echo "Node $node is already defined to cluster, removing it"
# attempt to disable storage interface on node
if ssh $node $ifdown $gpfs_interface; then
mmdelnode $node
ssh $node ifup $gpfs_interface
else
echo "** error: could not ssh to $node, or ifdown $gpfs_interface failed"
fi
fi
# try to add node to GPFS cluster
if mmaddnode $node; then
echo "Successfully added $node to GPFS cluster, starting GPFS on $node"
if mmstartup -w $node; then
echo "mmstartup -w $node succeeded"
else
echo "** error: cannot start GPFS on $node, please investigate"
exit 6
fi
else
echo "** error: could not add $node to GPFS cluster"
exit 5
fi
) >>$log_file 2>&1
当节点完成基本操作系统的安装时,您可以使用 CSM 自动运行如清单 1 所示的脚本,这样在节点引导时,就可以自动挂载 GPFS 文件系统了。首先需要将这个脚本定义为 CSM 监视器中的一种响应机制。例如: mkresponse -n SetupGPFS -s /path/to/script/SetupGPFS.sh SetupGPFS。
现在就有一个名为 SetupGPFS 的响应了,它会运行这个脚本。接下来应该将这个响应关联到默认的 CSM 条件 NodeFullInstallComplete,方法如下: startcondresp NodeFullInstallComplete SetupGPFS。
现在每当安装一个新节点时,CSM 都会在管理服务器上自动运行这个脚本。在 CSM 管理服务器上,现在当运行 lscondresp 命令时,应该可以看到 NodeFullInstallComplete 条件与 SetupGPFS 响应关联。这个条件或响应应该被列为 Active。
解决 ROM 溢出问题
xSeries 346 上可用 ROM 的空间数量存在一个问题,在引导时可能会出现 PCI 分配错误。消息说明系统 ROM 空间已满,没有空间来为其他使用 ROM 空间的适配器使用了(更详细内容请参看 参考资料)。
如果启用了 PXE 引导,这个问题就会影响存储节点,其中 Qlogic PCI 适配器没有足够的空间正确进行初始化。针对这个问题的一个解决方案如下;
- 禁用 GPFS 网络使用的 Broadcom PCI 卡上的 PXE 引导功能。使用下载的诊断工具 b57udiag -cmd,选择设备,然后禁用 PXE 引导。
- 通过 CSM 利用 PXE 引导来安装节点,然后使用 BIOS 禁用两个 onboard 适配器中的 PXE 引导功能(详细步骤在 按照正确顺序安装存储节点 一节中介绍)。
避免这个问题的另外一种解决方案是在每台 xSeries 346 上都使用一个 RAID 7K 卡。这可以减少 SCSI BIOS 所使用的 ROM 数量,并允许 Qlogic BIOS 成功加载,即使启用了 PXE 也没有问题。
在存储服务上定义 HBA 配置
示例集群中 xSeries 346 存储服务器上使用的 HBA 是 IBM DS4000 FC2-133 Host Bus Adapter(HBA)型号的适配器。它也称为 Qlogic 2342 适配器。本例使用了 1.43 版本的固件,以及上一节提到的 v7.01.01-fo qla2300 驱动程序。驱动程序中的 -fo 表示具有故障恢复功能,这不是驱动程序的默认选项。可以通过修改每个存储节点上的 /etc/modules.conf 的设置启用。这是在安装过程中使用 CSM 实现的,将在 配置 Qlogic 故障恢复 一节中介绍。
下一节介绍了更新固件和每个存储服务器上 HBA 设置所需要的步骤,以及重新安装驱动以在两个 HBA 之间启用负载均衡所需要的手工步骤。
下载 HBA 固件
您可以从 IBM System x 支持 Web 站点(请参看 参考资料)上下载 FC2-133 HBA 的固件。固件可以使用 IBM Management Suite Java 或可引导的磁盘和 flasutil 程序进行更新。
配置 HBA 设置
对于这个示例集群来说,需要对 HBA 的默认设置进行以下修改。这些值位于所下载的驱动程序提供的 README 中。您可以使用 Qlogic BIOS 完成这些修改,在引导过程中出现提示符时使用 <ctrl>-q 可进入 Qlogic BIOS,或者使用 MSJ 工具 修改。设置如下:
- 主机适配器设置
高级适配器设置
- LUNs per target:0
- Enable target reset:Yes
- Port down retry count:12
安装 IBM Management Suite Java
IBM FAStT Management Suite Java(MSJ)是一个基于 Java 的 GUI 应用程序,可以管理存储服务器中的 HBA。这个工具可以用来进行配置和诊断。有关下载软件的链接,请参看 参考资料。
示例设置使用 CSM 将 MSJ 作为 GPFS 安装的一部分在每个存储节点上进行安装。这个二进制文件是包含 GPFS RPM 的 tar 文件的一部分,这个文件是在 CSM 节点安装过程中由 CFS 进行分发的。由一个 post 脚本解压这个 tar 文件,接着运行 tar 文件里面包含的安装脚本。本文的示例在这次安装中使用了 32 位的 FAStT MSJ 来防止在安装 64 位版本时可能出现的问题。示例脚本使用了下面的命令安装 MSJ: FAStTMSJ*_install.bin -i silent。
这会同时安装应用程序和代理。注意由于这是一个 32 位版本的 MSJ,因此即使示例使用了静寂安装模式,代码也会查找并加载 32 位版本的库。因此,使用已经安装好的 32 位版本的 XFree86-libs,以及基本 64 位安装附带的 64 位版本。32 位库包含在 XFree86-libs-4.3.0-78.EL.i386.rpm 文件中,该文件包含在 tar 文件中。这个 rpm 的安装是通过 install.sh 脚本进行的,然后会安装 MSJ。
配置到磁盘的路径和负载均衡
每个存储节点上都需要使用 MSJ 手工配置到 DS4500s 上的磁盘阵列的路径,以及在每台计算机上两个 HBA 卡之间实现负载均衡。如果没有执行这种配置,默认情况下磁盘阵列只能通过每台计算机上的第一个适配器 HBA0 以及每个 DS4500s 上的控制器 A 进行访问。通过将磁盘分布在 HBA 之间,以及 DS4500s 的控制器之间,就可以实现负载均衡,并提高后端的性能。
注意负载均衡的配置是一个手工执行的步骤,每次重新安装存储节点时,必须在每个存储节点上都重新执行。对于这个示例集群来说,配置负载均衡的步骤如下所示:
- 从新安装的具有 xforwarding 设置(ssh <nodename> -X)的服务器的本地计算机上打开一个新窗口。
- 在一个会话中输入 # qlremote。
- 在另外一个会话中运行 # /usr/FAStT MSJ & 以启动 MSJ GUI。
- 在 MSJ GUI 中,高亮显示 HBA 选项卡下面的一个适配器,并选择 Configure。此时会出现一个类似于图 1 所示的窗口。
图 1. 选择 DS4500 时 MSJ 的视图
- 要启用负载均衡,请右键单击节点名高亮显示存储子系统,然后从菜单中选择下面的内容:LUNs > Configure LUNs。这样就会出现 LUN 配置窗口。您可以通过选择 Tools > Load Balance 自动配置负载均衡。现在会看到一个类似于图 2 所示的窗口。
图 2. 在配置故障恢复时 MSJ 的视图
- 在配置好逻辑驱动器之后,LUN 配置窗口就会关闭,并将配置保存到 Port Configuration 窗口中的主机系统(默认密码是 config)。如果配置成功保存,就会看到一条确认消息。配置会保存到一个名为 /etc/qla2300.conf 的文件中。有几个新的选项应该已经被添加到 /etc/modules.conf 的 qla2300 驱动程序行中,说明这个文件已经存在且应该能够使用。
- 切换回启动 qlremote 进程的窗口,并使用 <ctrl>-c 命令停止这个进程。这是非常重要的一步。
- 要启用新配置,请重新加载 qla2300 驱动模块。如果磁盘被挂载在一个连接到使用该驱动程序的适配器的 Fibre Channel 子系统上,那就无法执行这种操作。配置主机适配器驱动程序,通过初始 RAM 磁盘进行加载,初始 RAM 磁盘将在引导过程中加载适配器模块时对冗余磁盘应用配置数据。注意:只要逻辑磁盘的配置发生变化,都必须执行这个过程将有效配置保存到磁盘上。
在一个具有多个存储节点并且需要进行负载均衡的配置中,使用 MSJ 最有效的方法是保持 MSJ 在一个节点上打开,然后在其他每个节点上运行 qlremote,并使用一个 MSJ 会话连接到其他相应的会话。
配置 GPFS 集群
本节将详细介绍在创建 GPFS 集群过程中所需要的步骤。此处假设所有节点都已经按照本文前面的介绍进行了安装和配置,或者已经手工执行了下面的配置:
- 每台计算机上已经安装了 GPFS RPM。
- PATH 已经修改为包括 GPFS 二进制文件目录。
- 已经配置好存储接口。
- 不用输入密码就可以以根用户身份在节点之间以 ssh 连接。
- 已经在 sysctl 中完成了网络调优设置。
- NSD 服务器可以看到一块 SAN 磁盘。
在本系列文章的 第 3 部分 的 “存储架构” 一节中可以看到对这个示例集群的 GPFS 架构的详细介绍。
请结合 GPFS 文档阅读本节内容(请参看 参考资料),尤其是以下内容:
- GPFS V2.3 Administration and Programming Reference
,其中包含了对很多管理任务和 GPFS 命令的详细介绍。
- GPFS V2.3 Concepts, Planning, and Installation Guide
,详细介绍了对 GPFS 集群的规划考虑,以及在安装新集群过程中所执行的步骤。
- GPFS V2.3 Problem Determination Guide
,其中包含了进行故障诊断时所包含的步骤,以及 GPFS 的错误消息。
生成并安装可移植层
GPFS 可移植层(PL)是一组二进制文件,需要从源代码开始进行本地编译,以便匹配作为 GPFS 集群一部分的计算机上的 Linux 内核和配置。对于这个示例集群来说,这个过程是在一个存储节点上进行的。所生成的文件会使用 CSM 和 CFM 拷贝到每个节点上。(详细信息请参看 分发 GPFS 可移植层 一节的内容)。这是一个有效的方法,因为所有计算机都使用相同的架构,并且使用的是相同的内核。编译 GPFS PL 的命令可以在 /usr/lpp/mmfs/src/README 中找到。这个示例集群使用的步骤如下所示:
- 导出 SHARKCLONEROOT=/usr/lpp/mmfs/src。
- 输入 cd /usr/lpp/mmfs/src/config, cp site.mcr.proto site.mcr。
- 编辑新文件 site.mcr 来匹配要使用的配置。确保以下行没有被注释掉:
- #define GPFS_LINUX
- #define GPFS_ARCH_X86_64
- LINUX_DISTRIBUTION = REDHAT_AS_LINUX
- #define LINUX_DISTRIBUTION_LEVEL 34
- #define LINUX_KERNEL_VERSION 2042127
(注意 a # 不代表注释。)
- 输入 cd /usr/lpp/mmfs/src。
- 使用 make World 创建 GPFS PL。
- 使用 make InstallImages 将 GPFS PL 拷贝到 /usr/lpp/mmfs/bin 目录中。GPFS PL 中包含以下 4 个文件:
- tracedev
- mmfslinux
- lxtrace
- dumpconv
- 拷贝一组这些文件(每个对应内核使用一个)到 CSM 结构中,以便使用 CFM 进行分发。
创建 GPFS 集群
您可以使用几个独特的步骤为这个例子创建 GPFS 集群。尽管所有这些步骤都不是必须的,但是处理集群中不同类型的节点(存储节点或其他节点)是一种好方法。
第一个步骤是创建一个只包含存储节点和 quorum 节点的集群:一共有 5 个节点。在创建包含要包括的所有节点的存储接口的主机简写名时,请使用描述符文件,描述符文件之后再加上以下信息:
- 管理节点或客户机:定义节点是否构成从中提取配置和文件系统管理器的一个资源池的一部分。示例集群中只包括了这个资源池中的存储节点。
- Quorum 或 nonquorum:定义节点是否应该算做一个 quorum 节点。示例集群中的 quorum 节点是存储节点和 tiebreaker 节点 quor001。
创建集群的命令如下:
mmcrcluster -n stor.nodes -C gpfs1 -p stor001_s -s stor002_s -r /usr/bin/ssh -R
/usr/bin/scp
- -C 标志设置了集群名。
- -p 设置主配置服务器节点。
- -s 设置次配置服务器节点。
- -r 为 GPFS 使用的远程 shell 程序设置完整路径。
- -R 设置 GPFS 使用的远程文件拷贝程序。
下面是示例集群中使用的 stor.nodes 节点描述符文件:
stor001_s:manager-quorum
stor002_s:manager-quorum
stor003_s:manager-quorum
stor004_s:manager-quorum
quor001_s:client-quorum
对要加入集群中的所有其他节点,例如计算节点、用户节点和管理节点,请在以后步骤中添加类似于 <nodename>_s:client-nonquorum 的项。
在 quorum 节点上启用 unmountOnDiskFail
下一个步骤是在 tiebreaker 节点上使用 mmchconfig unmountOnDiskFail-yes quor001_s 启用 unmountOnDiskFail 选项。这可以防止 SAN 配置中的虚假磁盘错误被误报给文件系统管理器。
定义网络共享磁盘
下一个步骤是使用 mmcrnsd –F disc#.desc 命令创建 GPFS 所使用的磁盘。运行这个命令为每个磁盘创建一个全局名,这是一个必要的步骤,因为磁盘在 GPFS 集群中的每个节点上可能有不同的 /dev 名。对 GPFS 文件系统要使用的所有磁盘运行该命令。现在,为每个磁盘定义主 NSD 服务器和次 NSD 服务器;它们用于代表 NSD 客户机的 I/O 操作,NSD 客户机不能够本地访问 SAN 存储。
定义为 NSD 的磁盘的磁盘描述符包含在一个文件里,-F 标志就用来指向这个文件。为了保证示例集群的可管理能力,请在每个 DS4500 的 LUN 上执行一次该过程,并在 tiebreaker 磁盘上执行一次该过程。每个磁盘阵列或 DS4500 上的每个 LUN 在所使用的文件中都有一个描述符。下面是从 disk1.desc 中摘录出来的一行:
sdc:stor001_s:stor002_s:dataAndMetadata:1:disk01_array01S
下面是该行中的几个字段,按顺序依次显示:
- 主 NSD 服务器上的本地磁盘名
- 主 NSD 服务器
- 次 NSD 服务器
- 数据类型
- 故障组
- 所生成的 NSD 的名称
通过使用上面的描述符文件,可以在这个配置中定义下面的 3 个故障组:
- 第一个 DS4500 中的磁盘,即 disk01。
- 第二个 DS4500 中的磁盘,即 disk02。
- quorum 节点上的 tiebreaker 磁盘。
启动 GPFS
下一个步骤是使用下面的命令在集群范围内启动 GPFS:
- 在所有 NSD 服务器上启动 GPFS,同时防止 NSD 被标记为 down 状态。请使用下面的命令: mmstartup -w stor001_s,stor002_s,stor003_s,stor004_s。
- 在所有不是 NSD 服务器的其他节点(包括 tiebreaker 节点)上启动 GPFS。请使用下面的命令: mmstartup -w quor001_s,mgmt001_s,...
- 从管理节点上在所有计算节点上启动 GPFS。请使用下面的命令: dsh -N ComputeNodes /usr/lpp/mmfs/bin/mmstartup。
- 检查所有节点的状态,方法为:监视当前文件系统管理器上的 /var/adm/log/mmfs.log.latest 文件(使用 mmlsmgr <filesystem> 命令时可以找到),并监视下面这个命令的输出结果: mmgetstate -w <nodenames> dsh -N ComputeNodes /usr/lpp/mmfs/bin/mmgetstate。
这个方法看起来可能过分谨慎了,但是它已经被作为一种可扩充的方法,可在规模巨大的集群中使用。上面这些步骤另外一种方法是使用命令 mmstartup –a。这对于小型集群来说可以正常工作,但是对于大型集群来说,可能会需要花费很长一段时间来返回,在大型集群中,可能有些节点会由于各种原因而变得不可访问,例如网络问题。
创建 GPFS 文件系统
对于本例来说,使用所有定义为 GPFS 的 NSD 创建了一个大型的 GPFS 文件系统。注意所使用的命令使用上面的 mmcrnsd 命令中的不同磁盘描述符文件作为参数。这需要将创建 NSD 的每个步骤中的输出结果连接到一个文件中。
示例集群使用了以下设置:
- 所有 NSD(使用 -F 设置)
- Mountpoint:/gpfs
- Automount:是(使用 -A 设置)
- Blocksize:256KB(使用 -B 设置)
- 复制:数据和元数据都有两个拷贝(使用 -m, -M, -r, -R 设置)
- 挂载文件系统的节点估计数:1200(使用 -n 设置)
- 启用配额(使用 -Q 设置)
下面是完整的命令:
mmcrfs /gpfs /dev/gpfs -F disk_all.desc -A yes -B 256K -m 2 -M 2
-r 2 -R 2 -n
1200 -Q yes
在创建 /gpfs 之后,要手工进行第一次挂载。然后,如果启用了 automount,就可以在节点启动 GPFS 时自动挂载。
启用配额
上面 mmcrfs 命令的 -Q 标志在 /gpfs 文件系统上启用配额。可以为每个用户或组用户定义配额。默认配额已经进行了设置,可以适用于任何新用户或组。可以使用命令 mmdefquotaon 启用默认配额。使用 mmdefedquota 命令编辑默认配额。这个命令打开了一个编辑窗口,其中可以指定配额的范围。下面的示例演示了配额范围的设置:
gpfs: blocks in use: 0K, limits (soft = 1048576K, hard = 2097152K)
inodes in use: 0, limits (soft = 0, hard = 0)
使用 mmedquota –u <username> 命令可以为一个用户或组编辑特定配额。用户可以使用命令 mmlsquota 显示自己的配额。超级用户可以使用 mmrepquota gpfs 命令显示文件系统的配额状态。
调优
这个集群经过配置后,当服务器引导时,使用 mmchconfig autoload=yes 命令在 /etc/inittab 中添加一项,GPFS 就可以自动启动。
使用 GPFS pagepool 可以缓存用户数据和文件系统元数据。pagepool 机制允许 GPFS 将读请求与写请求异步实现。增加 pagepool 的大小可以增大 GPFS 可以缓存的数据或元数据量,而不需要执行同步 I/O。 pagepool 的默认值是 64 MB。最大 GPFS pagepool 大小是 8 GB。所允许的最小值是 4 MB。在 Linux 系统上, pagepool 的最大值是计算机物理内存的一半
pagepool 的理想大小取决于应用程序以及对其重新访问的数据的有效缓存的需要。如果系统中的应用程序可以访问大型文件、重用数据、可以从 GPFS 数据预取获益或具有随机 I/O 模式,增加 pagepool 的值可能会进一步获益。然而,如果该值设置得太大,那么 GPFS 就无法启动。
对于示例集群来说,集群中所有节点的 pagepool 所使用的值都是 512 MB。
优化网络设置
要对网络性能进行优化,GPFS 通过将存储网络适配器的 MTU 的大小设置为 9000 来启用巨帧。始终启用 /proc/sys/net/ipv4/tcp_window_scaling,因为这是默认设置。TCP 窗口设置在安装时使用 CSM 脚本进行了调优,方法是将下面几行添加到 NSD 服务器和 NSD 客户机的 /etc/sysctl.conf 文件中:
# increase Linux TCP buffer limits
net.core.rmem_max = 8388608
net.core.wmem_max = 8388608
# increase default and maximum Linux TCP buffer sizes
net.ipv4.tcp_rmem = 4096 262144 8388608
net.ipv4.tcp_wmem = 4096 262144 8388608
# increase max backlog to avoid dropped packets
net.core.netdev_max_backlog=2500
配置 DS4500 设置
存储服务器缓存设置如果设置错误,可能会影响 GPFS 性能。本例在 DS4500s 上使用了以下设置,这也是 GPFS 文档的推荐设置:
- Read cache:启用
- Read ahead multiplier:0
- Write cache:禁用
- Write cache mirroring:禁用
- Cache block size:16K
结束语
就是这样!您应该已经按照本系列文章中的例子成功安装了一个大型的 Linux 集群。在自己的安装中应用这些原则就可以成功安装另外一个大型 Linux 集群。