LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1220|回复: 3

簡易 Cluster 架設

[复制链接]
发表于 2006-6-27 23:30:32 | 显示全部楼层 |阅读模式
转:鸟哥原创 Vbird.Org
--------------------------------------------------------------------------------

原理:

什麼是 Cluster 與 Cluster 的優點
 
什麼是 Cluster 呢?目前常見的 Cluster (叢集)架構有兩種,一種是 Web / Internet cluster system,這種架構主要是將資料放置在不同的主機上面,亦即由多部主機同時負責一項服務;而另外一種則是所謂的平行運算了!平行運算其實就是將同一個運算的工作,交給整個 Cluster 裡面的所有 CPU 來進行同步運算的一個功能。由於使用到多個 CPU 的運算能力,所以可以加快運算的速度。目前比較常見於平行運算功能的,通常需要在超級電腦上面才看的到,這些超級電腦主要是用在天文、軍事、物理等需要很精密的、大量的運算的工作中,而考慮到穩定性,則通常是用在 Unix 系統上面的硬體架構上。不過,目前由於 PC 上面的 CPU 的運算功能越來越強大了~因此,當然很多程式開發者就動腦筋到 PC 上面來製作平行電腦的系統囉!我們這篇短文主要在介紹的就是『平行運算』這一類的 Cluster 了!
 
由於 Cluster 主要是用在平行運算上面的,而所謂的平行運算是使用到多顆 CPU 的運算功能,因此可以讓您的大型運算的程式很快的執行完畢!因此,如果你的工作環境當中,常常會使用到很耗 CPU 運算功能的程式時,就可以嘗試使用 Cluster 來進行工作囉!應該可以節省您不少的時間吶!此外,我們這篇短文主要是在 X86 架構下的 PC 來架設 Cluster 的喔!
 
不過,也需要特別留意的是,由於我們的 Cluster 是將一個工作平均分給所有的 node (註:一顆 CPU 在一個 Cluster 架構下,就稱為一個 node 囉!),所以,萬一您做成的 Cluster 系統當中,所有的 node 並非完全相同的運算等級,那麼先做完工作的 node 將會暫停工作,會等到所有的 node 都進行完畢後,才會在進行下一動~所以啦!強烈的建議在同一個 cluster 的架構中,盡量所有的 CPU 都使用相同的 CPU 型號,應該會比較好一點喔!
 

--------------------------------------------------------------------------------

Cluster 的主從架構
 
最簡單的 Cluster 其實就是以一種主從架構來進行資料的運算工作的,圖示如下:


上面的 Master 與 Slave 指的都是 CPU 喔!
 
Master 那部機器上面必須要有可以將工作分配給各個 node 去工作的函式庫,也就是 MPI ,他最重要的功能就是將工作給他分配下去的啦!而最重要的軟體就是:(1)MPICH;(2)編譯器(compiler, 例如 Fortran);
 
什麼是網路功能呢?如果 master 與 slave 是在同一部機器當中,例如雙 CPU 的主機板,那麼這裡就不需要網路功能啦!不過,如果我是使用四台雙 CPU 的 PC 呢?呵呵!那麼這四部主機就需要以高速網路架構進行連線啦!此外,還需要在這四部主機之間建立可以互通訊息的通訊協定才行,這方面的功能就含有:(1)R Shell, 亦即稱為 RSH;(2)NIS,使 Master 與 Slave 具有相同的帳號群組關係;(3)NFS,使讀取寫入的資料可以在同一個 partition 上面;
 
Slave 就是單純的將來自 Master 的任務給他做完就是了!
 
整個主從架構大致上就是這樣啦!因此,可以知道的是,我們需要的就是上面那些咚咚囉!
 

--------------------------------------------------------------------------------

達成 Cluster 所需要額外功能 ( RSH ) 與軟體 ( MPICH )
 
由上面的 Cluster 主從架構當中,我們知道 Master 與 Slave 之間的網路溝通很重要的一個咚咚,那就是 R Shell 囉!此外,還有將一個工作傳送給不同的 node 來進行計算的任務,就需要 MPICH 這個函式庫來進行!簡單的談一談這兩個玩意兒吧!
 
RSH:
在我們的 Linux 主機上面工作,通常使用 BASH 這個 shell 來傳達給 kernel 工作的訊息,以使主機正確的工作;而如果在不同的主機之間,那就可以使用 R Shell 來進行指令的下達喔,如此一來,我們就可以直接在 A 機器,向 B 機器下達工作的指令,而不需要登入 B 機器呢~那就是 RSH 的主要功能啦!最常見的 RSH 指令就是 rcp 與 rsh 了!有興趣的朋友應該知道以 man 來查尋一下該指令的用法囉!
需要附帶一提的是,這個 RSH 是『相當危險』的一個服務喔!由於我們可以直接登入 RSH 主機,並且在上面進行指令的下達,為了避免還要輸入密碼的問題,因此通常 RSH 已經將信任主機設定好了,不過,由於 RSH 會啟動一些 port 來監聽 Clients 的需求,而偏偏這些 port 與 daemon 都還挺危險的,因此,『Cluster 最好是設定在內部網域當中,並使用私有 IP ,比較能夠避免危險』喔!此外,那個 Master 也必須要設定好一定程度的嚴密防火牆喔!
 
MPICH:
MPI 是 Messages Passing Interface 的縮寫,他本身是一個規格很嚴密的通訊標準,主要的功能是在處理平行運算之間各個 node 的資料交換,請注意, MPI 並不是一套軟體喔!而至於 MPICH 就是符合 MPI 這個標準通訊協定的一套軟體了!因此,我們可以經由 MPICH 這個軟體提供的 MPI 函式庫來達成平行運算的功能喔!也就是說,我們所寫的程式,只要能夠使用 MPICH 提供的函式庫,那麼該程式就可以進行平行運算時候所需要的功能了,這就可以避免程式開發者還要去處理通訊節點上面的問題,而可以將程式開發的重心著重在程式本身的問題上面!
MPICH 是由 Mathematics and Computer Science Division的 Argonne 實驗室所發展,詳細的資料可以參考:http://www-unix.mcs.anl.gov/mpi/mpich/
 
除了這兩個軟體之外,還需要 NIS 與 NFS 喔!所以啦!要建置一個 Cluster 的話,身為系統管理員的您,必須要學會的技能真是相當的多的,至少需要:
 
熟悉 Linux 的操作技巧;
熟悉 Linux 基礎網路參數設定;
熟悉 Linux 相關的 Server 架設(這方面請參考鳥哥的私房菜架站篇);
瞭解 RSH 的相關功能與設定技巧;
瞭解 MPICH 的設定與相關功能;
熟悉至少一種程式語言。
 
還真的是不好學啊!鳥哥也是新手玩弄 Cluster 說~大家一起研究研究吧! ^_^

--------------------------------------------------------------------------------
架設流程
要架設 Cluster 當然就是需要多部的 PC 來連線啦!不然怎麼稱為 Cluster 呢?您說是吧!所以,無論如何,在架設 Cluster 之前,請務必要確認您的『所有硬體以及網路功能都是完整無缺的!』否則就無法繼續下去啦!另外,建議 Cluster 的所有主機規格盡量相同,可以避免等待的困擾呢!底下就來談一談整個架設流程吧!
 

--------------------------------------------------------------------------------

整體架構
 
整體架構的架設當中,需要的所有軟體為:
 
Master 主機安裝需要:
防火牆的設定(含 NAT 架設);
RSH
NIS Server
NFS Server
Compiler Install
MPICH Install
其他特殊功能
 
Slave 主機安裝需要:
防火牆的設定
RSH
NIS Client
NFS Client
 
基本上,幾乎所有的工作都是在 Master 上面做啦! Slave 最大的任務就是進行來自 Master 所要求的計算工作,因此,Slave 能夠越簡單越好~至於 Master 上面,由於我們都是在 Master 主機上面下達工作指令,而總不能老是在螢幕前面下達指令吧!因此上,Master 通常會有兩個網路介面,分別是對外的 Public IP 與對內的 Priavte IP。而既然 Master 有提供 Public IP 的設定,自然就比較擔心所謂的駭客入侵問題,所以啦,您的 Master 主機,要嗎就不要開放 Public IP ,要嗎就務必要設定很嚴密的防火牆,並且不必要的服務就盡量關閉他~畢竟我們的 Cluster 是要用來做為計算運作的,所以不必要的網路協定服務,當然就是關閉他啦!底下鳥哥將以自己的一個實際案例進行說明的啦!參考看看吧!
 

--------------------------------------------------------------------------------

鳥哥的一個實例規範
 
在我這個案例當中, Cluster 主要的功能為:進行 MM5 這個氣象模式的運算以及 Models-3/CMAQ 這個空氣品質模式的運算,而由於這兩個咚咚都是使用 PGI Fortran 90 做為 Compiler ,因此,我就必須要進行 PGI 的安裝啦!而我的硬體架構主要是這樣的:
 
Master : 為雙 CPU 主機,使用 AMD MP 的 CPU ,並且有一顆 120 GB 的硬碟,此外,由於我的數值模式需要 PGI Fortran ,所以就必須要安裝 Server 版的 PGI Fortran 喔!
Slave : 共有三部 Slave ,每一部均為雙 CPU 的 AMD MP 的 CPU ,並且有一顆 120 GB 的硬碟;
連接 Master 與 Slave 的為 10/100/1000 的 Switch ,當然,四部主機(1 x master + 3 x slave)都是安裝 Intel 的 1GB 網路卡喔!
 
硬體連接有點像這樣:


那麼底下就來談一談怎麼安裝他吧!
 
 楼主| 发表于 2006-6-27 23:33:54 | 显示全部楼层
系統安裝( Red Hat 9 )

我的這個系統使用的是最新的 Red Hat 出版的 Red Hat 9 ,會用這個玩意兒最大的原因是因為 Red Hat 是目前支援的 Linux 軟體最多的一個 Linux Distribution 了,安裝他之後,就比較不會欠東欠西的,此外,很多的軟體都是以 Red Hat 做為測試的平台,因此我就選擇他來做為我的系統平台啊!另外,需要留意的是,由於 Slave 並不需要使用到圖形介面的功能,他單純是用在計算上面,因此我沒有在 slave 上面安裝圖形介面的打算~至於 Master 則安裝了 KDE 這個咚咚喔!好了,Linux 的安裝相信大家應該都要很熟悉了,所以我就不再談安裝的詳細步驟,僅提幾個特別需要注意的地方囉:
 
Partition 方面:
因為我的硬碟實在是在蠻大的,並且在 Slave 上面也是 120 GB 的硬碟,如果不將 Slave 的硬碟使用的話,實在覺得很浪費,因此,一開始我就規劃將四部主機的硬碟全部都以 NFS 分享到內部網域當中,而為了避免跟系統的檔案放在一起,因此,我就將硬碟分割出除了必要的 partition 之外,其他的就掛載在 /disk1 這個目錄當中,四部主機的 parition 都相同,分別是:
 
/     : 10 GB
/var  :  5 GB
/tmp  :  3 GB
Swap  :  3 GB ( 因為我每部 Linux 主機上面都有 1.5 GB 的記憶體 )
/disk1: 96 GB
 
安裝時選擇的套件:
所有的主機都需要底下的套件安裝(註:因為原本的筆記記錄的很亂,所以如果找不到相同的字眼,那就是我寫錯啦!):
Administrattion Tools
Development Tools
Editors
Engineering and Scientific
FTP Server
Kernel Development
Network Servers
Server configuration Tools
Sound and vedio
System Tools
Text-based Internet
Windows File servers
不過, Master 需要額外再增加 X Window 方面的支援,例如 KDE 與 X-Window System 這兩個主要的套件要勾選喔!
 
系統安裝大致上就是這些吧,如果有疏漏的,請未來在安裝完畢之後,再以原本 Red Hat 9 的光碟來重新安裝他吧!反正 Red Hat 系統都是以 rpm 來安裝的,挺容易安裝的喔!整個安裝完畢後,還花不到幾分鐘呢!
 

--------------------------------------------------------------------------------

防火牆 ( 含 NAT 主機 ) 與網路設定
 
由於我們的 Cluster 主要是用在數值運算,因此,當然不需要對外開放網路服務啦!所以,最好就是以私有 IP 來進行網路的設定是比較好的!此外,最好還是要設定好防火牆的啦!我的網域參數預設是這樣的:
 
Network/netmask:192.168.10.0/255.255.255.0
Master:(對外)140.116.xxx.yyy;(對內)192.168.10.30, Gateway 為對外的 Gateway 喔!並且有設定 NAT 啊!
Slave:192.168.10.10, 192.168.10.20, 192.168.10.40 三部,Gateway 為 192.168.10.30
 
網路參數的各個檔案是這樣的:
 
各個主機的主機名稱請修改:/etc/sysconfig/network
各個主機的網路卡設定項目請修改:/etc/sysconfig/network-scripts/ifcfg-eth0
各個主機的 DNS 查尋系統請修改:/etc/resolv.conf
各個主機的內部主機名稱查尋系統請修改:/etc/hosts,我的 /etc/hosts 如下:
127.0.0.1       localhost       localhost.localdomain
192.168.10.10   node1.cluster
192.168.10.20   node2.cluster
192.168.10.30   server.cluster
192.168.10.40   node4.cluster
 
而我的每部主機先將所有的網路服務都給他關掉去,僅剩下 SSH 這個網路協定存在而已~所以,我利用 Red Hat 提供的 ntsysv 這個指令來選擇開機時啟動的項目有:
 
atd
crond
iptables
keytable
network
random
sshd
syslogd
xinetd
 
至於防火牆系統的規劃上面,由於 Master 主機 (192.168.10.30) 具有 NAT 的功能,所以必須要修改一下他的防火牆機制,因此,就有兩個不同的防火牆機制 scripts 囉!另外,由於擔心外來的入侵攻擊,因此,在這個 Cluster 的系統當中,我的 iptables 防火牆機制是使用『MAC(網路卡卡號)』來做為設定的基準,而不是使用 IP 啊!為什麼呢?因為反正我僅允許我自己同網域內的幾部電腦連進來而已,當然沒有必要針對 IP 啊!所以囉,就必須要收集四部主機的網路卡來允許他進入囉。此外,由於我可能並不在 Cluster 前面操作,因此會啟用一兩部主機的網路卡卡號,好讓他能夠進入 Cluster 呦!底下就將我的防火牆機制給他列出來一下:
 
Master: #!/bin/bash
# This program is for iptables' rules
# VBird 2003/05/02
#
# 0. PATH and modules
  PATH=/sbin:/bin:/usr/sbin:/usr/bin
  export PATH
  modprobe ip_tables
  modprobe iptable_nat
  modprobe ip_nat_ftp
  modprobe ip_nat_irc
  modprobe ip_conntrack
  modprobe ip_conntrack_ftp
  modprobe ip_conntrack_irc
#
# 1. clear the rules and make the policys
  iptables -F
  iptables -X
  iptables -Z
  iptables -F -t nat
  iptables -X -t nat
  iptables -Z -t nat
  iptables -P INPUT   DROP
  iptables -P OUTPUT  ACCEPT
  iptables -P FORWARD ACCEPT
  iptables -t nat -P PREROUTING  ACCEPT
  iptables -t nat -P POSTROUTING ACCEPT
  iptables -t nat -P OUTPUT      ACCEPT
#
# 2. NAT services
  echo "1" > /proc/sys/net/ipv4/ip_forward
  iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth1 -j MASQUERADE
#
# 3. Trust network and conditions
  iptables -A INPUT -m state --state ESTABLISHED,RELATED  -j ACCEPT  
  iptables -A INPUT -i lo -j ACCEPT
  iptables -A INPUT -m mac --mac-source XX:YY:ZZ:WWQP -j ACCEPT  
# 上面這一行就是網路卡的卡號啦!

 
Slave:
Slave 的防火牆機制跟 Master 幾乎一模一樣,只是因為在內部啊,所以不需要啟動 NAT 的服務即可!上面的給改一改先~
 
好啦!網路的設定與防火牆就到這裡為止,要記得喔,你的網路必須要已經能夠正確的啟動了!如果還是無法啟動網路,或者是防火牆機制還是有問題,那麼對外的那個網路卡的網路線還是先給他拔掉吧!比較安全一些些的啦!等到都設定妥當,尤其是防火牆,然後才來啟動他吧!
 

--------------------------------------------------------------------------------

NFS 架設規劃
 
由於我這裡預計要設定 NIS ,並且每部主機的 /disk1 都要分享出去,因此,每部主機都必須要開放 NFS 的服務喔!並且,每一部主機的設定都可以相同吶!這樣比較容易來設定囉~此外,比較不一樣的地方在於 Master 這一部,由於我的 Cluster 所有的帳號都在 NIS 的管制之中,因此,我將 Master 的 /home 也分享出來,並且每部 Slave 主機都掛載 Master 的 /home 才成!
 
這個 NFS 在 Cluster 當中是相當重要的,為什麼呢?因為我們不是在四部主機上面工作嗎,而這四部主機會去讀取的『資料』其實都是『在本機上面可以看的到的』資料才行,這還包括底下我們會持續介紹的 mpich 這個軟體的函式庫呢!也就是說:『在 Cluster 裡面,所有的機器會使用到的資料必須都在相同的目錄當中!』所以,這就是為什麼我們要對 /home 進行分享,以及進行 NIS 的設定了!此外,因為我的 Server 這部 Master 機器分享出去的目錄中,已經含有 /disk1 這個 partition,此外,還通通將他掛載在 /cluster/server 底下,因此,可以建議:『未來在安裝所有的 Cluster 需要的套件資料時,例如 Compiler 以及 MPICH 等等,都可以安裝到 /cluster/server 這個目錄底下,以使所有的主機都能夠使用同一個 partition 來源的資料喔!』
 
設定程序:
 
Master:
  1. 啟動 portmap 並且設定開機啟動:
[root @server root]# /etc/rc.d/init.d/portmap start
[root @server root]# chkconfig --level 35 portmap on
 
2. 設定 NFS 分享出去:
[root @server root]# vi /etc/exports
/home  192.168.10.0/24(rw,async,no_root_squash)
/disk1 192.168.10.0/24(rw,async,no_root_squash)
[root @server root]# exportfs -rv
[root @server root]# /etc/rc.d/init.d/nfs start
[root @server root]# chkconfig --level 35 nfs on
 
3. 設定預計的掛載點:
[root @server root]# mkdir -p /cluster/node1
[root @server root]# mkdir -p /cluster/node2
[root @server root]# mkdir -p /cluster/node4
[root @server root]# mkdir -p /cluster/server
 
Slave:
  1. 啟動 portmap 並且設定開機啟動:
[root @node1 root]# /etc/rc.d/init.d/portmap start
[root @node1 root]# chkconfig --level 35 portmap on
 
2. 設定 NFS 分享出去:
[root @node1 root]# vi /etc/exports
/disk1 192.168.10.0/24(rw,async,no_root_squash)
[root @node1 root]# exportfs -rv
[root @node1 root]# /etc/rc.d/init.d/nfs start
[root @node1 root]# chkconfig --level 35 nfs on
 
3. 設定預計的掛載點:
[root @node1 root]# mkdir -p /cluster/node1
[root @node1 root]# mkdir -p /cluster/node2
[root @node1 root]# mkdir -p /cluster/node4
[root @node1 root]# mkdir -p /cluster/server
 
掛載程序:
 
Master:
將底下這些指令測試執行一下,如果成功後,將指令寫入 /etc/rc.d/rc.local 當中
  [root @server root]# mount -t nfs -o bg,intr server.cluster:/disk1 /cluster/server
[root @server root]# mount -t nfs -o bg,intr  node1.cluster:/disk1 /cluster/node1
[root @server root]# mount -t nfs -o bg,intr  node2.cluster:/disk1 /cluster/node2
[root @server root]# mount -t nfs -o bg,intr  node4.cluster:/disk1 /cluster/node4
 
Slave:
將底下這些指令測試執行一下,如果成功後,將指令寫入 /etc/rc.d/rc.local 當中 [root @node1 root]# mount -t nfs            server.cluster:/home  /home
[root @node1 root]# mount -t nfs -o bg,intr server.cluster:/disk1 /cluster/server
[root @node1 root]# mount -t nfs -o bg,intr  node1.cluster:/disk1 /cluster/node1
[root @node1 root]# mount -t nfs -o bg,intr  node2.cluster:/disk1 /cluster/node2
[root @node1 root]# mount -t nfs -o bg,intr  node4.cluster:/disk1 /cluster/node4
 
呵呵!這樣就設定成功了!我們每一部主機『看起來』就好像有 400 GB 的硬碟空間啊!可怕了吧! ^_^
 

--------------------------------------------------------------------------------

NIS 架設規劃
 
NIS 的設定也是很簡單,不過主要還是需要分為 NIS Server 與 NIS Client 兩部份來設定的!請注意,在設定0
回复 支持 反对

使用道具 举报

发表于 2006-6-28 02:00:47 | 显示全部楼层
在sun公司的工程师培训里,有听过cluster的知识。
但看了鸟哥这一篇图文并茂的介绍文章,却是从一个侧面,也就是从技术上的实现来认识cluster.

是一篇值得反复研读的好文。
回复 支持 反对

使用道具 举报

发表于 2006-7-20 15:28:51 | 显示全部楼层
的确是一篇好文章,原来自己搭环境的时候是按照导师给的步骤,一步一步来的
说真的,是一点都不理解为什么要nfs呀,什么的服务,这篇文章也稍微点醒了我

不过就是还不大清楚,如果我们要把server的/home目录nfs出去的话在node01~noden上
是不是不用再划分/home目录了呢,因为我觉得那样的话纯属浪费

还有,设定信任网卡的那段是否有人能够解释得清楚点呢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表