基於開源軟件構建高性能集群NAS系統,包括負載均衡(劉愛貴)


大數據時代的到來已經不可阻擋,面對數據的爆炸式增長,尤其是半結構化數據和非結構化數據,NoSQL存儲系統和分布式文件系統成為了技術浪潮,得到了長足的發展。非結構化數據目前呈現更加快速的增長趨勢,IDC研究報告分析指出,到2012年非結構化數據將占到數據存儲總量的80%以上。集群NAS是一種橫向擴展(Scale-out)存儲架構,具有容量和性能線性擴展的優勢,已經得到全球市場的認可。從EMC對ISILON、HP對IBRIX、DELL對Exanet等收購事件,以及IBM推出SONAS、NetApp發布Data ONTAP 8,都可以看出集群NAS已經成為主流存儲技術之一。在國內,我們也看到UIT UFS、龍存LoongStore、九州初志CZSS、美地森YFS等集群NAS解決方案。集群NAS的未來潛在市場巨大,在高性能計算HPC、廣電IPTV、視頻監控、雲存儲等行業領域將逐步得到廣泛應用。這些商業集群NAS系統固然很好,在性能、可用性、擴展性、易用性、管理性以及服務和支持方面都很不錯的表現,但往往成本也很斐然,很多大企業都消受不起,更別提那些中小企業了。受益於近年來開源存儲軟件的蓬勃發展,我們完全可以使用普通的服務器、存儲和網絡設備,DIY出低成本的高性能、高擴展、高可用集群NAS系統,敢於商業集群NAS系統相媲美。本文將基於Glusterfs, NFS, Samba, CTDB, LVS等開源軟件構建集群NAS系統。

系統總體架構

整個集群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系統總體架構

集群文件系統
“集群”主要分為高性能集群HPC(High Performance Cluster)、高可用集群HAC(High Availablity Cluster)和負載均衡集群LBC(Load Balancing Cluster)。集群文件系統是指協同多個節點提供高性能、高可用或負載均衡的文件系統,它是分布式文件系統的一個子集,消除了單點故障和性能瓶問題。對於客戶端來說集群是透明的,它看到是一個單一的全局命名空間,用戶文件訪問請求被分散到所有集群上進行處理。此外,可擴展性(包括Scale-Up和Scale-Out)、可靠性、易管理等也是集群文件系統追求的目標。在元數據管理方面,可以采用專用的服務器,也可以采用服務器集群,或者采用完全對等分布的無專用元數據服務器架構。目前典型的集群文件系統有SONAS, ISILON, IBRIX, NetAPP-GX, Lustre, PVFS2, GlusterFS, Google File System, LoongStore, CZSS等。集群文件系統是構建集群NAS的底層核心部分,在開源集群文件系統方面,Lustre, Glusterfs, Ceph, MooseFS等是主流,我們這里選擇glusterfs進行構建集群NAS。


圖2 glusterfs系統架構

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操作均相同。
   

[cpp]  view plain  copy
 
 print?
  1. cd /opt/  
  2. yum install flex bison  
  3. wget http://download.gluster.com/pub/gluster/glusterfs/LATEST/glusterfs-3.2.5.tar.gz  
  4. tar xvzf glusterfs-3.2.5.tar.gz  
  5. cd glusterfs-3.2.5  
  6. ./configure  
  7. make & make install  
  8. service glusterd start  
  9. chkconfig glusterd on  


(2) 系統配置
    在其中一個節點進行,假設為192.168.1.54,其他兩個節點為192.168.1.55和192.168.1.56

[cpp]  view plain  copy
 
 print?
  1. gluster volume info (測試glusterd服務是否運行正常)  
  2. gluster peer probe 192.168.1.55 (將192.168.1.55加入集群)  
  3. gluster peer probe 192.168.1.56 (將192.168.1.56加入集群)  
  4. gluster peer status  


(3) 系統測試
    創建一個卷並進行mount測試,假設在192.168.1.54上進行

[cpp]  view plain  copy
 
 print?
  1. gluster volume  create testvol 192.168.1.54:/gluster/testvol 192.168.1.55:/gluster/testvol 192.168.1.56:/gluster/testvol  
  2. glsuter volume start testvol  
  3. mount -t glusterfs 192.168.1.54:/testvol /mnt/  
  4. mount (查看所的掛載的文件系統)  
  5. df -h (查看掛載文件系統的容量信息)  


高可用集群NAS
諸如Glusterfs、Lustre、Ceph等集群文件系統,提供了統一命名空間、高性能、高可用、高擴展的非結構化數據解決方案。出於性能方面考慮,集群文件系統都設計了私有協議的客戶端,通常是基於VFS或FUSE接口實現的與POSIX標准兼容的接口,但往往僅提供Linux/Unix系統客戶端軟件。對於Linux/Unix系統來說,只需要安裝集群文件系統客戶端內核模塊或軟件即可;而對於Windows/Mac等系統而言,因為沒有客戶端軟件可用,就沒法訪問集群文件系統了。另外,一些特殊場合下,用戶不希望在Linux/Unix/Windows/Mac系統上安裝客戶端軟件,而是希望通過標准協議訪問集群文件系統。因此,我們需要以集群文件系統為底層基礎核心,構建使用標准協議訪問的存儲服務,目前主要就是使用NFS/CIFS標准協議的NAS。傳統NAS系統具有單點性能瓶頸、擴展性差、應用規模和高負載支持有限等不足,無法滿足大數據應用需求。集群NAS是一種橫向擴展(Scale-out)存儲架構,它協同多個節點(即通常所稱的NAS機頭)提供高性能、高可用或高負載均衡的NAS(NFS/CIFS)服務,具有容量和性能線性擴展的優勢。

 


圖3 CTDB基本架構

這里我們基於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上進行:

[cpp]  view plain  copy
 
 print?
  1. gluster volume create nas  replica 2 192.168.1.54:/gluster/nas 192.168.1.55:/gluster/nas (replica卷)  
  2. gluster volume create ctdb 192.168.1.54:/gluster/ctdb 192.168.1.55:/gluster/ctdb 192.168.1.56:/gluster/ctdb (distribute卷)  
  3. gluster volume start  nas  
  4. gluster volume start  ctdb  

    
    在三個節點上同時mount以上創建的nas和ctdb卷:

[cpp]  view plain  copy
 
 print?
  1. mkdir /gluster/data  
  2. mkdir /gluster/lock  
  3. mount -t glusterfs 192.168.1.54:/ctdb /gluster/lock  (CTDB使用)  
  4. mount -t glusterfs 192.168.1.54:/nas  /gluster/data  (集群NAS使用)  

    
(2) 安裝軟件

[cpp]  view plain  copy
 
 print?
  1. yum install samba      (安裝samba服務以及工具包)  
  2. yum install nfs-utils  (安裝nfs工具包,服務已集成於內核中)  
  3. yum install ctdb       (安裝CTDB軟件包)  

    
(3) 配置Samba
    smb.conf文件默認位於/etc/samba/smb.conf,我們把smb.conf放在CTDB lock卷上,並為所有節點建立符號鏈接至/etc/samba/smb.conf。
    ln -s /glsuter/lock/smb.conf /etc/samba/smb.conf
    smb.conf配置內容如下:

 

 

[cpp]  view plain  copy
 
 print?
  1. [global]  
  2.     workgroup = MYGROUP  
  3.     server string = Samba Server Version %v  
  4.     log file = /var/log/samba/log.%m  
  5.   
  6.     clustering = yes  
  7.     idmap backend = tdb2  
  8.     private dir = /gluster/lock  
  9.     fileid:mapping = fsid  
  10.     use mmap = no  
  11.     nt acl support = yes  
  12.     ea support = yes  
  13.   
  14.     security = user  
  15.     passdb backend = tdbsam  
  16.   
  17. [public]  
  18.     comment = CTDB NAS  
  19.     path = /gluster/data  
  20.     public = yes  
  21.     writable = yes      


(4) 配置NFS
    同樣將/etc/sysconfig/nfs和/etc/export存放在CTDB lock卷上,並為所有節點建立符號鏈接。
    ln -s /gluster/lock/nfs /etc/sysconfig/nfs
    ln -s /gluster/lock/export /etc/export
    nfs配置內容如下:

[cpp]  view plain  copy
 
 print?
  1. CTDB_MANAGES_NFS=yes  
  2. NFS_TICKLE_SHARED_DIRECTORY=/gluster/lock/nfs-tickles  
  3. STATD_PORT=595  
  4. STATD_OUTGOING_PORT=596  
  5. MOUNTD_PORT=597  
  6. RQUOTAD_PORT=598  
  7. LOCKD_UDPPORT=599  
  8. LOCKD_TCPPORT=599  
  9. STATD_SHARED_DIRECTORY=/gluster/lock/nfs-state  
  10. NFS_HOSTNAME="ctdb"  
  11. STATD_HOSTNAME="$NFS_HOSTNAME -P "$STATD_SHARED_DIRECTORY/$PUBLIC_IP" -H /etc/ctdb/statd-callout -p 97"  
  12. RPCNFSDARGS="-N 4"  

    
    export配置內容如下:

[cpp]  view plain  copy
 
 print?
  1. /gluster/data   *(rw,fsid=1235)  


(5) 配置CTDB
    同樣將/etc/sysconfig/ctdb, /etc/ctdb/public_addresses, /etc/ctdb/nodes存放於CTDB lock卷上,並為所有節點建立符號鏈接。
    ln -s /gluster/lock/ctdb /etc/sysconfig/ctdb
    ln -s /gluster/lock/public_addresses /etc/ctdb/public_addresses
    ln -s /glsuter/lock/nodes /etc/ctdb/nodes
    
    ctdb配置內容如下:

[cpp]  view plain  copy
 
 print?
  1. CTDB_RECOVERY_LOCK=/gluster/lock/lockfile  
  2. CTDB_PUBLIC_INTERFACE=eth0  
  3. CTDB_PUBLIC_ADDRESSES=/etc/ctdb/public_addresses  
  4. #CTDB_LVS_PUBLIC_IP=192.168.1.50  (這里啟用LVS single IP不成功,后面單獨配置LVS進行負載均衡)  
  5. CTDB_MANAGES_SAMBA=yes  
  6. CTDB_MANAGES_WINBIND=yes  
  7. CTDB_MANAGES_NFS=yes  
  8. CTDB_NODES=/etc/ctdb/nodes  
  9. CTDB_DEBUGLEVEL=ERR  

   
    public_addresses配置內容如下:

[cpp]  view plain  copy
 
 print?
  1. 192.168.1.51/24 eth0  
  2. 192.168.1.52/24 eth0  
  3. 192.168.1.53/24 eth0  

    
    nodes配置內容如下:

[cpp]  view plain  copy
 
 print?
  1. 192.168.1.54  
  2. 192.168.1.55  
  3. 192.168.1.56  

    
(6) 啟動服務並查看狀態

[cpp]  view plain  copy
 
 print?
  1. chkconfig ctdb on  
  2. chkconfig smb  off  (CTDB自動管理smb服務)  
  3. chkconfig nfs  off  (CTDB自動管理nfs服務)  
  4. /etc/init.d/ctdb start  
  5. ctdb status  
  6. ctdb ip  
  7. ctdb ping -n all  

    
(7) 訪問測試
    Windows CIFS訪問:
 

[cpp]  view plain  copy
 
 print?
  1. \\192.168.1.51\public  
  2. \\192.168.1.52\public  
  3. \\192.168.1.53\public  
  4. Linux NFS/CIFS訪問:  
  5. mount -t nfs 192.168.1.51:/gluster/data /mnt/  
  6. mount -t nfs 192.168.1.52:/gluster/data /mnt/  
  7. mount -t nfs 192.168.1.53:/gluster/data /mnt/  
  8. mount -t cifs //192.168.1.51/public /mnt -o username=xxx    (xxx為使用smbpasswd創建的用戶)  
  9. mount -t cifs //192.168.1.52/public /mnt -o username=xxx  
  10. mount -t cifs //192.168.1.51/public /mnt -o username=xxx  

    可以shutdown節點或者stop節點上的nfs/samba服務,然后使用如下命令測試HA工作是否正常。

自動負載均衡集群NAS
上面我們已經成功構建了高可用集群NAS,所有NAS機頭均可對外提供NAS服務,並且相互之間具備高可用的特性。如果按照上面的配置實施,則用戶可以用通過192.168.1.51, 192.168.1.52, 192.168.153三個IP使用NFS/CIFS來訪問集群NAS,訪問時需要指定IP。顯而易見,這個高可用集群NAS不具備自動負載均衡(load balance)的功能,很容易導致集群NAS機頭負載不均衡的情況發生,這對大規模高並發訪問或數據密集型應用是非常不利的。

負載均衡最為常用的一種方法是RR-DNS,它為同一個主機名配置多個IP地址,在應答DNS查詢時根據Round Robin算法返回不同的IP地址,客戶端使用返回的IP連接主機,從而實現負載均衡的目的。RR-DNS負載均衡方法的優點是簡單、靈活、方便、成本低,客戶端和服務端都不要作修改(除配置DNS信息之外),而且集群節點可以跨WAN。RR-DNS的問題是無法感知集群節點負載狀態並進行調度,對故障節點也會進行調度,可能造成額外的網絡負載,不夠均衡,容錯反應時間長。另外一種最為常用的負載均衡技術是LVS(Linux Virtual Server),它由章文嵩博士開創的開源項目,廣泛被業界推崇和使用。LVS是一種高效的Layer-4交換機,提供Linux平台下的集群負載平衡功能,它為物理集群構建一個高擴展和高可用的虛擬服務器,以單一IP代表整個集群對外提供服務。相對於RR-DNS,LVS可以有效彌補其不足之外,配置稍顯復雜。LVS主要有三種工作模式,即VS-NAT,VS-TUN,VS-DR。VS-NAT模式,集群中的物理服務器可以使用任何支持TCP/IP操作系統,物理服務器可以分配Internet的保留私有地址,只有負載均衡器需要一個合法的IP地址。缺點是擴展性有限,當服務器節點數據增長到20個以上時,負載均衡器將成為整個系統的瓶頸,因為所有的請求包和應答包都需要經過負載均衡器再生;VS-TUN模式,負載均衡器只負責將請求包分發給物理服務器,而物理服務器將應答包直接發給用戶。所以負載均衡器能處理很巨大的請求量,負載均衡器不再是系統的瓶頸。 這種方式的不足是,需要所有的服務器支持"IP Tunneling"協議;VS-DR模式,和VS-TUN相同,負載均衡器也只是分發請求,應答包通過單獨的路由方法返回給客戶端。與VS-TUN相比,VS-DR這種實現方式不需要隧道結構,因此可以使用大多數操作系統做為物理服務器。它的不足是,要求負載均衡器的網卡必須與集群物理網卡在一個物理段上。

 


圖4 LVS DR工作模式系統架構

這里采用LVS DR工作模式構建自動負載均衡集群NAS,安裝配置詳細過程如下:
(1) 安裝軟件

[cpp]  view plain  copy
 
 print?
  1. modprobe -l|grep ipvs  (驗證系統是否支持LVS/IPVS)  
  2. yum install ipvsadm  

    
(2) 配置LVS master
    編寫shell腳本lvsmaster.sh,並在master節點上運行,其配置內容如下:  

[cpp]  view plain  copy
 
 print?
  1. #!/bin/sh  
  2.   
  3.     VIP=192.168.1.50  
  4.     RIP1=192.168.1.51  
  5.     RIP2=192.168.1.52  
  6.     RIP3=192.168.1.53  
  7.     PORT=0  
  8.   
  9.     . /etc/rc.d/init.d/functions  
  10.     case "$1" in  
  11.         start)  
  12.         echo "start LVS of DirectorServer"  
  13.         #Set the Virtual IP Address  
  14.         /sbin/ifconfig eth0:1 $VIP broadcast $VIP netmask 255.255.255.255 up  
  15.         /sbin/route add -host $VIP dev eth0:1  
  16.   
  17.         #Clear IPVS Table  
  18.         /sbin/ipvsadm -C  
  19.   
  20.         #Set Lvs  
  21.         /sbin/ipvsadm -A -t $VIP:$PORT -s rr -p 60  
  22.         /sbin/ipvsadm -a -t $VIP:$PORT -r $RIP1:$PORT -g  
  23.         /sbin/ipvsadm -a -t $VIP:$PORT -r $RIP2:$PORT -g  
  24.         /sbin/ipvsadm -a -t $VIP:$PORT -r $RIP3:$PORT -g  
  25.   
  26.         #Run Lvs  
  27.         /sbin/ipvsadm  
  28.         ;;  
  29.   
  30.         stop)  
  31.         echo "close LVS Directorserver"  
  32.         /sbin/ipvsadm -C  
  33.         /sbin/ifconfig eth0:1 down  
  34.         ;;  
  35.   
  36.         *)  
  37.         echo "Usage: $0 {start|stop}"  
  38.         exit 1  
  39.     esac  

    
(3) 配置LVS realserver 
    編寫shell腳本lvsrealserver.sh,並在所有集群節點上運行,這里master節點同時也是real server節點。其配置內容如下:

[cpp]  view plain  copy
 
 print?
  1. #!/bin/bash  
  2.   
  3.  VIP=192.168.1.50  
  4.  BROADCAST=192.168.1.255  #vip's broadcast  
  5.  . /etc/rc.d/init.d/functions  
  6.   
  7.  case "$1" in  
  8.      start)  
  9.      echo "reparing for Real Server"  
  10.      echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore  
  11.      echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce  
  12.      echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore  
  13.      echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce  
  14.      ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $BROADCAST up  
  15.      /sbin/route add -host $VIP dev lo:0  
  16.      ;;  
  17.   
  18.      stop)  
  19.      ifconfig lo:0 down  
  20.      echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore  
  21.      echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce  
  22.      echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore  
  23.      echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce  
  24.      ;;  
  25.   
  26.      *)  
  27.      echo "Usage: lvs {start|stop}"  
  28.      exit 1  
  29.  esac  


(4) 系統測試

[cpp]  view plain  copy
 
 print?
  1.    ipvsadm -Ln  
  2.    \\192.168.1.50\public    (Windows平台CIFS訪問)  
  3.    mount -t nfs 192.168.1.53:/gluster/data /mnt/  (Linux平台NFS訪問)  
  4.    mount -t cifs //192.168.1.51/public /mnt -o username=xxx  (Linux平台CIFS訪問)  

    使用不同的客戶端訪問NFS/CIFS服務,查看驗證負載是否均衡到不同集群節點上,結合top/iostat/smbstatus查看狀態。

以上構建的LVS具有單點故障問題,如果需要構建高可用LVS,請參考以下URL進行配置:
(1) piranha方案,http://www.linuxvirtualserver.org/docs/ha/piranha.html
(2) ldirectord方案,http://www.linuxvirtualserver.org/docs/ha/heartbeat_ldirectord.html

 

http://blog.csdn.net/liuaigui/article/details/7163482


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM