Linux上的叢集解決方案(mpi)
一、叢集和Linux上的叢集解決方案
叢集計算機是指用一組聯網的PC或工作站來搭建成的,提供比單個PC(節點)計算效能高得多的計算機。說其是計算機,其實是針對所提供出來的服務而言的,或者說是邏輯上來說的。叢集計算機的主要優勢就是成本,相同的計算能力下,其成本只有傳統大型機的十分之一,在全球計算機TOP500中,叢集計算機的比重越來越大,近兩年的比重超過了80%。特別是對中小企事業應用,實驗研究和教學有很大的競爭力。
集群系統(Cluster)主要解決下面幾個問題:
1.高可靠性(HA)。利用叢集管理軟體,當主伺服器故障時,備份伺服器能夠自動接管主伺服器的工作,並及時切換過去,以實現對使用者的不間斷服務。
2.高效能運算(HP)。充分利用叢集中的每一臺計算機的資源,實現複雜運算的並行處理,通常用於科學計算領域,比如基因分析,物理與化學分析等。
3.負載平衡。即把負載壓力根據某種演算法合理分配到叢集中的每一臺計算機上,以減輕主伺服器的壓力,降低對主伺服器的硬體和軟體要求。
在實際應用中,最常見的情況是利用叢集解決負載平衡問題,比如用於提供WWW服務。在這裡主要展示如何使用LVS(Linux Virtial Server)來實現實用的WWW負載平衡集群系統
關於叢集計算機的作業系統,在TOP500中現在主要的作業系統都有身影,但是應用最多的是LINUX作業系統。這首先利益於LINUX的開放原始碼,使得其有很高的可制定性,可以根據不同的硬體和應用環境作出相應的修改,其次,LINUX也有很高的穩定性,而且不乏商業支援。
為了降低程式開發的難度和提高程式的可移植性,目前基於LINUX的叢集計算環境主要是通過配置MPI(Message Passing Interface)環境可實現的。這也是目前比較成熟的應用模式。因此,本文主要講解LINUX下的叢集環境配置的要求和MPI的配置。
LINUX叢集環境的配置主要有以下幾個部分:
<!--[if !supportLists]-->1. <!--[endif]-->MPI平行計算環境的安裝和配置
<!--[if !supportLists]-->2. <!--[endif]-->計算節點之間的無密碼訪問
<!--[if !supportLists]-->3. <!--[endif]-->NFS共享檔案系統的配置
//
注:在叢集配置過程中,MPI執行環境的安裝和配置是必要的,至於計算節點之間的無密碼訪問和NFS共享,則是在運算效率和檔案管理上對高效能運算提出的要求。一般來說,只要具有MPI執行環境可以運算平行計算。
二、linux叢集中MPI的平行計算環境的簡單配置
MPI的安裝及簡單測試
MPI有多種實現版本,如MPICH, CHIMP以及OPENMPI。其中MPICH是一種最重要的MPI實現,它可以從網上免費獲得Linux和Windows版本。它的開發和MPI規範的制定是同步的,因此最能反映MPI的變化和發展,MPICH由此成為實現MPI的最成熟和最廣泛使用的版本。本文安裝的MPI軟版本為MPICH-1.2.6。
安裝步驟:
1、從網上下載MPICH壓縮包(mpich.tar.gz)
2、解壓:# tar zxvf mpich.tar.gz
3、進入解壓後的目錄: # cd mpich-1.2.6
4、配置: # ./configure –prefix=/usr/local/mpich
其中/usr/local/mpich為軟體所安裝的目錄
5、編譯 # make
6、安裝 # make install
7、配置該軟體的使用者搜尋路徑
Root 使用者下:修改/etc/profile 加入
PATH=$PATH:/usr/local/mpich/bin
MANPATH=$MANPATH:/usr/local/mpich/man
Export PATH MANPATH
普通使用者下:修改~/.bash_profile 加入
export PATH=$PATH:/usr/local/mpich/bin
8、修改/usr/local/mpich/share/machines.LINUX檔案,加入叢集中可以用來做平行計算的主機名(八節點叢集為例)
加入的內容為:
Local:4
Node11:4
Node22:4
(注:冒號後為節點的CPU數或者核心數)
9、MPI環境的簡單測試
在伺服器節點上,以mpich 自帶的計算PI值的平行計算程式cpi對所搭建的叢集環境做簡單的測試。
步驟:
在/usr/local/mpich/example目錄下
(1) 編譯 # make cpi
(2) 啟動平行計算 # mpirun –np N cpi (其中N 為節點機的個數)
可以看到PI值及誤差和計算時間,說明環境搭建基本成功。至此,所組建的MPI叢集基本成。
雖然現在主流的叢集配置都是基於MPI的,但是由於MPI的標準和MPI實現的多樣性,特別是商業應用領域中不同的商業封裝的存在,在MPI環境的安裝和配置過程中,要詳細的閱讀相關的幫助檔案。以求正確的配置好MPI執行環境。
三、計算節點之間的無密碼訪問
這 一點主要是針對高效能運算來說的。在高效能運算中,計算任務被分割成並行的幾個部分,而這幾個部分之間也是有相互關聯,根據計算任務的不同和任務分割的方 法的不同。計算節點之間的通訊量也是不同的。這也是衡量和影響叢集計算機效能的主要方面。從邏輯上講,計算節點之間的無密碼訪問可以使計算程序在叢集計算 機內自由跳躍,從而提高叢集計算的效率。目前主要的訪問機制有RSH和SSH,相對來說SSH的安全性更好些。關於這兩種節點間訪問機制的配置,網上有很多的教程,本文將簡述SSH在節點之間的無密碼訪問。
實現原理
使用一種被稱為"公私鑰"認證的方式來進行ssh登入. "公私鑰"認證方式簡單的解釋是
首先在客戶端上建立一對公私鑰 (公鑰檔案:~/.ssh/id_rsa.pub; 私鑰檔案:~/.ssh/id_rsa)
然後把公鑰放到伺服器上(~/.ssh/authorized_keys), 自己保留好私鑰
當ssh登入時,ssh程式會發送私鑰去和伺服器上的公鑰做匹配.如果匹配成功就可以登入了
1.用使用者anyone登入客戶機器並在客戶端機器上執行"ssh-keygen -t rsa"產生的金鑰檔案。
如果檔案"~/.ssh/id_rsa"存在,會提示是否覆蓋該檔案,此時可選擇"n"不覆蓋該檔案而使用已有的id_rsa檔案;如果選擇"y"則會重新生成"~/.ssh/id_rsa"檔案,接下來會提示輸入passphrase,回車確定使用空的passphrase,再次回車確認(這裡也可以輸出passphrase,相當於ssh時登入的密碼)。然後會重新生成"~/.ssh/id_rsa"檔案和"~/.ssh/id_rsa.pub"檔案(結果如下)。
如果"~/.ssh/id_rsa"檔案和"~/.ssh/id_rsa.pub"檔案不存在則會自動建立新的"~/.ssh/id_rsa"檔案和"~/.ssh/id_rsa.pub"檔案,passphrase設定同上。
2、使用ssh登入到伺服器,編輯伺服器上"~/.ssh/authorized_keys"檔案,將客戶端機器上的"~/.ssh/id_rsa.pub"檔案內容追加到"~/.ssh/authorized_keys"檔案中。
此時會要求輸入zhaoy在伺服器上的登入密碼,輸入後即會將客戶端機器上的"~/.ssh/id_rsa.pub"檔案內容追加到伺服器上的"~/.ssh/authorized_keys"檔案中)
3.完成了金鑰的生成和分發之後就可以進行無密碼的SSH登陸了,當然在金鑰的生成和分發過程中,有很多可控的引數。這一點要注意檢視相關的MAN和使用GOOGLE來解決。
四、NFS共享檔案系統的配置
配置NFS共享檔案系統是因為在高效能運算過程中,各計算節點要頻繁對任務進行資料的讀取和儲存。使用NFS一來可以提高I/O讀寫的效率,可以有針對性的提高NFS系統的可靠性。另外有一點需要注意,在配置計算環境時,要儘量使得與節點配置無關的檔案處於NFS系統中,這可以提高管理效率,降低檔案冗餘。還有就是使檔案系統在各個節點上有相同的路徑。關於NFS的設定網上和書本中有很多。下面簡單介紹一下。
<!--[if !supportLists]-->1. <!--[endif]-->伺服器端的設定
伺服器端的設定都是在/etc/exports這個檔案中進行設定的,設定格式如下:
欲分享出去的目錄 主機名稱1或者IP1(引數1,引數2) 主機名稱2或者IP2(引數3,引數4)
上面這個格式表示,同一個目錄分享給兩個不同的主機,但提供給這兩臺主機的許可權和引數是不同的,所以分別設定兩個主機得到的許可權。
例如可以編輯/etc/exports為:
/tmp *(rw,no_root_squash)
/home/public 192.168.0.*(rw) *(ro)
/home/test 192.168.0.100(rw)
/home/linux *.the9.com(rw,all_squash,anonuid=40,anongid=40)
設定好後可以使用以下命令啟動NFS:
/etc/rc.d/init.d/portmap start (在REDHAT中PORTMAP是預設啟動的)
/etc/rc.d/init.d/nfs start
可以通過MAN命令來檢視exports的相關引數。
<!--[if !supportLists]-->2. <!--[endif]-->客戶端設定
mount nfs目錄的方法:
mount -t nfs hostname(orIP):/directory /mount/point
具體例子:
Linux: mount -t nfs 192.168.0.1:/tmp /mnt/nfs
關於mount和相關引數可以檢視相關的MAN檔案。