整个集群NAS主要由集群文件系统、高可用NAS集群、LVS负载集群三个逻辑部分组成,如图1所示。集群文件系统使用glusterfs,它具有全局统一命名空间、高性能、高可用、高扩展等特点,它最大特点是采用无元数据服务设计。集群NAS系统基于标准的NFS/CIFS/HTTP/FTP等协议来提供数据访问服务,这里采用NFS/Samba/Httpd/vsftpd开源软件来,多个物理节点通过CTDB构建成高可用NAS集群。集群负载均衡使用国人主导开创的LVS系统来实现,对外使用单一IP提供服务。综合采用Glusterfs, NFS, Samba, CTDB, LVS这些开源软件系统,我们可以构建出于毫不逊色于商业系统的集群NAS系统。图1所示的系统总体架构,逻辑上由三个独立物理集群构成,实际构建部署中这三个集群位于同一个物理集群上,以上这些开源部署在所有节点上。如此,即可有效提高每个节点的利用效率,更为重要的是能够大大节约成本。本文余下部分将详细解说如何基于开源软件构建一个具有三个节点的集群NAS系统。
图1 集群NAS系统总体架构
GlusterFS是Scale-Out存储解决方案Gluster的核心,它是一个开源的分布式文件系统,具有强大的横向扩展能力,通过扩展能够支持数PB存储容量和处理数千客户端。GlusterFS借助TCP/IP或InfiniBand RDMA网络将物理分布的存储资源聚集在一起,使用单一全局命名空间来管理数据。GlusterFS基于可堆叠的用户空间设计,可为各种不同的数据负载提供优异的性能。Glusterfs的主要特征包括:高扩展性和高性能、高可用性、全局统一命名空间、弹性哈希算法、弹性卷管理、基于标准协议,技术实现特点包括:完全软件实现、完整的存储操作系统栈、用户空间实现、模块化堆栈式架构、原始数据格式存储、无元数据服务设计。关于glusterfs更多信息请参考"Glusterfs集群文件系统研究"一文。
Glusterfs集群文件安装配置详细过程如下:
(1) 安装软件
从http://download.gluster.com/pub/gluster/glusterfs/LATEST/下载glusterfs软件,源码及安装包均可。下面以glusterfs-3.2.5.tar.gz源码进行安装,在所有brick server操作均相同。
cd /opt/
yum install flex bison
wget http://download.gluster.com/pub/gluster/glusterfs/LATEST/glusterfs-3.2.5.tar.gz
tar xvzf glusterfs-3.2.5.tar.gz
cd glusterfs-3.2.5
./configure
make & make install
service glusterd start
chkconfig glusterd on
gluster volume info (测试glusterd服务是否运行正常)
gluster peer probe 192.168.1.55 (将192.168.1.55加入集群)
gluster peer probe 192.168.1.56 (将192.168.1.56加入集群)
gluster peer status
gluster volume create testvol 192.168.1.54:/gluster/testvol 192.168.1.55:/gluster/testvol 192.168.1.56:/gluster/testvol
glsuter volume start testvol
mount -t glusterfs 192.168.1.54:/testvol /mnt/
mount (查看所的挂载的文件系统)
df -h (查看挂载文件系统的容量信息)
这里我们基于CTDB实现高可用集群NAS。CTDB是一种轻量级的集群数据库实现,基于它可以实现很多应用集群,目前CTDB支持Samba, NFS, HTTPD, VSFTPD, ISCSI, WINBIND应用,集群共享数据存储支持GPFS,GFS(2),Glusterfs, Luster, OCFS(2)。CTDB本身不是HA解决方案,但与集群文件系统相结合,它可以提供一种简便高效的HA集群解决方案。集群配置两组IP,Private IP用于heartbeat和集群内部通信,Public IP用于提供外部服务访问。Public IP动态在所有集群节点上分配,当有节点发生故障,CTDB将调度其他可用节点接管其原先分配的Public IP,故障节点恢复后,漂移的Public IP会重新被接管。这个过程对客户端是透明的,保证应用不会中断,也就是我们这里所说的高可用HA。
高可用集群NAS的安装配置详细过程如下:
(1) IP配置
Single IP: 192.168.1.50 (后面由LVS使用,对外提供单一IP访问)
Public IP: 192.168.1.51, 192.168.1.52, 192.168.1.53 (用于外部访问,或提供给LVS进行负载均衡)
Private IP: 192.168.1.54, 192.168.1.55, 192.168.1.56 (用于内部访问,heartbeat及集群内部通信)
(2) 挂载集群文件系统
这里使用Glusterfs集群文件系统为所有节点提供共享存储空间,并为CTDB提供lock和status等共享存储空间。CTDB卷建议采用gluster replica volume,NAS卷可以根据实际需求选择distribute, stripe, replica及复合卷。如下创建两个卷,在IP: 192.168.1.54上进行:
gluster volume create nas replica 2 192.168.1.54:/gluster/nas 192.168.1.55:/gluster/nas (replica卷)
gluster volume create ctdb 192.168.1.54:/gluster/ctdb 192.168.1.55:/gluster/ctdb 192.168.1.56:/gluster/ctdb (distribute卷)
gluster volume start nas
gluster volume start ctdb
mkdir /gluster/data
mkdir /gluster/lock
mount -t glusterfs 192.168.1.54:/ctdb /gluster/lock (CTDB使用)
mount -t glusterfs 192.168.1.54:/nas /gluster/data (集群NAS使用)
yum install samba (安装samba服务以及工具包)
yum install nfs-utils (安装nfs工具包,服务已集成于内核中)
yum install ctdb (安装CTDB软件包)
[global]
workgroup = MYGROUP
server string = Samba Server Version %v
log file = /var/log/samba/log.%m
clustering = yes
idmap backend = tdb2
private dir = /gluster/lock
fileid:mapping = fsid
use mmap = no
nt acl support = yes
ea support = yes
security = user
passdb backend = tdbsam
[public]
comment = CTDB NAS
path = /gluster/data
public = yes
writable = yes
CTDB_MANAGES_NFS=yes
NFS_TICKLE_SHARED_DIRECTORY=/gluster/lock/nfs-tickles
STATD_PORT=595
STATD_OUTGOING_PORT=596
MOUNTD_PORT=597
RQUOTAD_PORT=598
LOCKD_UDPPORT=599
LOCKD_TCPPORT=599
STATD_SHARED_DIRECTORY=/gluster/lock/nfs-state
NFS_HOSTNAME="ctdb"
STATD_HOSTNAME="$NFS_HOSTNAME -P "$STATD_SHARED_DIRECTORY/$PUBLIC_IP" -H /etc/ctdb/statd-callout -p 97"
RPCNFSDARGS="-N 4"
/gluster/data *(rw,fsid=1235)
CTDB_RECOVERY_LOCK=/gluster/lock/lockfile
CTDB_PUBLIC_INTERFACE=eth0
CTDB_PUBLIC_ADDRESSES=/etc/ctdb/public_addresses
#CTDB_LVS_PUBLIC_IP=192.168.1.50 (这里启用LVS single IP不成功,后面单独配置LVS进行负载均衡)
CTDB_MANAGES_SAMBA=yes
CTDB_MANAGES_WINBIND=yes
CTDB_MANAGES_NFS=yes
CTDB_NODES=/etc/ctdb/nodes
CTDB_DEBUGLEVEL=ERR
192.168.1.51/24 eth0
192.168.1.52/24 eth0
192.168.1.53/24 eth0
192.168.1.54
192.168.1.55
192.168.1.56
chkconfig ctdb on
chkconfig smb off (CTDB自动管理smb服务)
chkconfig nfs off (CTDB自动管理nfs服务)
/etc/init.d/ctdb start
ctdb status
ctdb ip
ctdb ping -n all
\\192.168.1.51\public
\\192.168.1.52\public
\\192.168.1.53\public
Linux NFS/CIFS访问:
mount -t nfs 192.168.1.51:/gluster/data /mnt/
mount -t nfs 192.168.1.52:/gluster/data /mnt/
mount -t nfs 192.168.1.53:/gluster/data /mnt/
mount -t cifs //192.168.1.51/public /mnt -o username=xxx (xxx为使用smbpasswd创建的用户)
mount -t cifs //192.168.1.52/public /mnt -o username=xxx
mount -t cifs //192.168.1.51/public /mnt -o username=xxx
可以shutdown节点或者stop节点上的nfs/samba服务,然后使用如下命令测试HA工作是否正常。
这里采用LVS DR工作模式构建自动负载均衡集群NAS,安装配置详细过程如下:
(1) 安装软件
modprobe -l|grep ipvs (验证系统是否支持LVS/IPVS)
yum install ipvsadm
#!/bin/sh
VIP=192.168.1.50
RIP1=192.168.1.51
RIP2=192.168.1.52
RIP3=192.168.1.53
PORT=0
. /etc/rc.d/init.d/functions
case "$1" in
start)
echo "start LVS of DirectorServer"
#Set the Virtual IP Address
/sbin/ifconfig eth0:1 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev eth0:1
#Clear IPVS Table
/sbin/ipvsadm -C
#Set Lvs
/sbin/ipvsadm -A -t $VIP:$PORT -s rr -p 60
/sbin/ipvsadm -a -t $VIP:$PORT -r $RIP1:$PORT -g
/sbin/ipvsadm -a -t $VIP:$PORT -r $RIP2:$PORT -g
/sbin/ipvsadm -a -t $VIP:$PORT -r $RIP3:$PORT -g
#Run Lvs
/sbin/ipvsadm
;;
stop)
echo "close LVS Directorserver"
/sbin/ipvsadm -C
/sbin/ifconfig eth0:1 down
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
#!/bin/bash
VIP=192.168.1.50
BROADCAST=192.168.1.255 #vip's broadcast
. /etc/rc.d/init.d/functions
case "$1" in
start)
echo "reparing for Real Server"
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $BROADCAST up
/sbin/route add -host $VIP dev lo:0
;;
stop)
ifconfig lo:0 down
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
;;
*)
echo "Usage: lvs {start|stop}"
exit 1
esac
ipvsadm -Ln
\\192.168.1.50\public (Windows平台CIFS访问)
mount -t nfs 192.168.1.53:/gluster/data /mnt/ (Linux平台NFS访问)
mount -t cifs //192.168.1.51/public /mnt -o username=xxx (Linux平台CIFS访问)
使用不同的客户端访问NFS/CIFS服务,查看验证负载是否均衡到不同集群节点上,结合top/iostat/smbstatus查看状态。