電腦集群

電腦集群（computer cluster）是一組鬆散或緊密連接在一起工作的電腦。由於這些電腦協同工作，在許多方面它們可以被視為單個系統。與網格計算機不同，電腦集群將每個節點 (電腦科學)設置為執行相同的任務，由軟體控制和調度。

集群的組件通常通過快速區域網相互連接，每個節點（用作伺服器的電腦）運行自己的作業系統實例。在大多數情況下，所有節點使用相同的硬體和相同的作業系統，儘管在某些設置中（例如使用OSCAR），可以在每台電腦或不同的硬體上使用不同的作業系統。

部署集群通常是為了提高單台電腦的性能和可用性，而集群也通常比速度或可用性相當的單台電腦的成本效益要高。

電腦集群的出現是許多計算趨勢匯聚的結果，這些趨勢包括低成本微處理器、高速網路以及用於高性能分布式計算軟體的廣泛使用。集群使用和部署廣泛，從小型企業集群到世界上最快超級電腦（如IBM的Sequoia）。在集群出現之前，人們採用具有三重模塊冗餘的單元容錯主機；但是，集群的前期成本較低，網路結構速度提高，這助推了人們採用集群這種方式。與高可靠性的大型機集群相比，擴展成本更低，但也增加了錯誤處理的複雜性，因為在集群中錯誤模式對於運行的程序是不透明的。

## 基本概念

<image>

為了通過組合低成本的商用現成電腦，來獲得更大的計算能力和更好的可靠性，人們研究提出了各種架構和配置。

電腦集群方法通常通過快速區域網連接許多現成的計算節點（例如用作伺服器的個人電腦）。計算節點的活動由「集群中間件」協調，集群中間件是一個位於節點之上的軟體層，讓使用者可以將集群視為一個整體的內聚計算單元（例如通過單系統映像概念）。

電腦集群依賴於一種集中管理方法，該方法把節點用作協調的共享伺服器。它不同於其他方法（比如對等計算或網格計算），後者也使用許多節點，但具有更多的分布式特性。

電腦集群可能是一個簡單的兩節點系統，只連接兩台個人電腦，也可能是一台速度非常快的超級計算機。構建集群的基本方法是貝奧武夫機群，它可以使用少量個人計算機構建，以產生與傳統高性能計算相比經濟划算的替代方案。一個展示概念可行性的早期項目是133節點的Stone Soupercomputer。開發人員使用Linux、並行虛擬機工具包和訊息傳遞介面庫以相對較低的成本實現高性能。

儘管一個集群可能僅由幾台通過簡單網路連接的個人電腦組成，但集群架構也可用於實現非常高的性能水平。TOP500組織每半年公布的500台最快超級計算機的名單通常包括許多集群，例如，2011年世界上最快的機器是「京」，它有分布存儲器和集群架構。

## 歷史

<image>

Greg Pfister指出，集群最初不是由特定的供應商發明的，而是由無法在一台電腦上完成所有工作或需要備份的客戶發明的。他估計電腦集群發明於20世紀60年代。作為並行工作的一種方式，集群計算的正式工程基礎可以說是由IBM的吉恩·阿姆達爾發明的，因為他在1967年出版了被認為是關於並行處理的開創性論文：阿姆達爾定律。

早期電腦集群的歷史或多或少直接與早期網路的歷史有關，因為網路發展的主要動機之一是連接計算資源，創建真正的電腦集群。

第一個被設計成集群的生產系統是20世紀60年代中期的Burroughs B5700，它允許多達四台電腦（每個電腦都有一個或兩個處理器）緊密連接到一個公共磁碟存儲系統，以平衡工作負載。與標準的多處理器系統不同，每台電腦都可以在不中斷整體運行的情況下重新啟動。

第一個商業鬆散耦合的集群產品是Datapoint公司的「附加資源電腦」（Attached Resource Computer，ARC）系統，該系統於1977年開發，使用ARCNET作為集群接口。直到迪吉多電腦公司在1984年為VAX/VMS作業系統（現在稱為OpenVMS）發布了VAXcluster產品，集群才真正開始。ARC和VAX集群產品不僅支持並行計算，還支持共享文件系統和外部設備。其目的是提供並行處理的優勢，同時保持數據的可靠性和唯一性。另外兩個值得注意的早期商業集群是Tandem Computers（大約1994年出現的高可用性產品）和IBM S/390 Parallel Sysplex（也在大約1994年出現，主要用於商業用途）。

同時，當商業網路使用電腦集群在電腦外部的並行性時，超級計算機開始在電腦內部中使用它們。繼CDC 6600在1964年取得成功之後，Cray 1也於1976年成功發布，並通過向量處理引入了內部並行性。雖然早期的超級計算機不使用集群而是使用了共享內存，但一些速度最快的超級計算機（如京）最終依賴於集群架構。

## 集群的屬性

<image>

可以根據不同目的配置電腦集群，從一般用途的業務需求（如Web服務支持），到計算密集型的科學計算。在這兩種情況下，集群都可以使用高可用性方法。請注意，下面描述的屬性並不是排他的，「電腦集群」也可以使用高可用性方法等等。

「負載均衡」集群是集群節點共享計算工作負載，以提供更好的總體性能的配置。例如，Web伺服器集群可以將不同的查詢分配給不同的節點，因此總體響應時間將得到優化。然而，負載平衡的方法可能在不同的應用程式之間有很大的不同，例如，用於科學計算的高性能集群的平衡負載演算法與Web伺服器集群不同，Web伺服器集群可能只是使用一種簡單的循環方法，將每個新請求分配到不同節點。

電腦集群用於計算密集型目的，而不是處理面向IO的操作（如Web服務或資料庫）。例如，電腦集群可能支持車禍或天氣的計算模擬。非常緊密耦合的電腦集群被設計用於可能接近「超級計算」的工作。

「高可用性集群」提高了集群方法的可用性。它們通過擁有冗餘節點來運行，當系統組件出現故障時，這些節點將用於提供服務。高可用性集群實現試圖使用集群組件的冗餘來消除單點故障。許多作業系統都有高可用性集群的商業實現。Linux-HA項目是Linux作業系統常用的一個自由軟體HA包。

## 優點

集群的設計主要考慮性能，但實際使用中還涉及許多其他因素，包括容錯（能夠容許系統繼續使用故障節點）能力、可擴展性、高性能、不需要頻繁運行維護程序、資源整合（如RAID）和集中管理。集群的優點包括在發生災難時啟用數據恢復、提供並行數據處理和高計算能力。

在可伸縮性方面，集群提供了水平添加節點的能力。這意味著可以向集群中添加更多的電腦，以提高其性能、冗餘和容錯。與在集群中擴展單個節點相比，添加節點是一個既節省成本，又可以使集群獲得更高的性能的解決方案。電腦集群的這一大特性允許大量性能較低的電腦執行較大的計算負載。

向集群添加新節點時，可靠性也會增加，這是因為進行維護的時候不需要停下整個集群，只需停下單個節點維護，集群的其餘節點承擔該節點的負載即可。

如果集群包含大量的電腦，那麼可以使用分布式文件系統和RAID，這兩種方法可以大大提高集群的可靠性和速度。

## 設計與配置

<image>

設計集群的問題之一是各個節點之間的耦合程度。例如，單個電腦作業可能需要節點之間的頻繁通信：這意味著集群共享一個專用網絡，位置密集，可能有同類節點。另一個極端是電腦作業使用一個或幾個節點，並且需要很少或沒有節點間通信，接近網格計算。

在貝奧武夫機群中，應用程式從不會看到計算節點（也叫「從屬電腦」），只與「主電腦」交互，而「主電腦」是處理從屬電腦的調度和管理的特定電腦。在典型的實現中，主電腦具有兩個網路接口，一個用於為從屬設備與專用貝奧武夫網路通信，另一個用於組織的通用網路。從屬電腦通常有同一作業系統、本地記憶體和磁碟空間的它們自己的版本。但是，專用從屬網路還可以有大型共享文件伺服器，該伺服器存儲全局持久數據，從屬設備可以根據需要訪問這些數據。

一個特殊用途的144節點DEGIMA集群被調整為使用多步行並行樹碼運行天體物理N體仿真，而不是通用的科學計算。

由於每一代遊戲機的計算能力不斷增強，一種新的用途出現了，它們被重新用於高性能計算（HPC）集群。遊戲機集群的例子有索尼PlayStation集群和微軟Xbox集群。另一個消費類遊戲產品的例子是Nvidia Tesla個人超級計算機工作站，它使用多個圖形加速處理器晶片。除了遊戲機，也可以使用高端顯卡。使用顯卡進行網格計算比使用CPU更經濟，儘管不太精確。但是，當使用雙精度值時，它們變得像CPU一樣精確，並且成本更低。

電腦集群歷來在使用相同作業系統的獨立物理電腦上運行。隨著虛擬化技術的出現，集群節點可以在具有不同作業系統的獨立物理電腦上運行，這些作業系統上面繪製了一個虛擬層，使之看起來相似。當進行維護時，集群還可以在各種配置上進行虛擬化。一個示例實現是Xen作為Linux-HA的虛擬化管理器。

## 數據共享與通信

### 數據共享

<image>

隨著電腦集群在20世紀80年代的出現，超級計算機也應運而生。早期的超級計算機依賴於共享內存，這是當時這三類電腦的區別之一。迄今為止，集群通常不使用物理共享內存，而許多超級計算機體系結構也放棄了這一點。

不過，在現代電腦集群中，集群文件系統的使用是必不可少的。例如IBM通用並行文件系統、Microsoft的集群共享卷或Oracle集群文件系統。

### 消息傳遞與通信

用於集群節點間通信的兩種廣泛使用的方法是MPI（訊息傳遞介面）和PVM（並行虛擬機）。

早在1989年MPI出現之前，PVM就在橡樹嶺國家實驗室問世了。PVM必須直接安裝在每個集群節點上，並提供一組軟體庫，將節點描繪成一個「並行虛擬機」。PVM為消息傳遞、任務和資源管理以及故障通知提供了一個運行時環境。PVM可以由用C、C++或Fortran等語言編寫的使用者程序使用。

20世紀90年代初，在40個組織的討論中產生了MPI。最初的努力得到了ARPA和國家科學基金會的支持。MPI的設計沒有重新開始，而是利用了當時商業系統中可用的各種特性。MPI規範催生了具體的實現。MPI實現通常使用TCP/IP和套接字連接。MPI現在是一種廣泛使用的通信模型，它使並行程序能夠用C、Fortran、Python等語言編寫。因此，與提供具體實現的PVM不同，MPI是已經在諸如MPICH和Open MPI的系統中實現的規範。

## 集群管理

<image>

使用電腦集群伺服器的挑戰之一是管理它的成本，如果集群有N個節點，有時可能高達管理N個獨立機器的成本。在某些情況下，這為管理成本較低的共享內存架構提供了一個優勢。由於便於管理，這也使得虛擬機非常流行。

### 任務調度

當大型多用戶集群需要訪問大量數據時，任務調度就成為一個挑戰。在具有複雜應用環境的異構CPU-GPU集群中，每項作業的性能取決於底層集群的特性。因此，將任務映射到CPU內核和GPU設備有巨大的挑戰。這是一個正在進行的研究領域；結合和擴展MapReduce和Hadoop的演算法已經被提出和研究。

### 節點故障管理

當集群中的一個節點出現故障時，可以使用諸如「fencing」（隔離）之類的策略來保持系統的其餘部分可操作。Fencing是在節點出現故障時隔離節點或保護共享資源的過程。有兩類隔離方法；一類禁用節點本身，另一類禁用對資源（如共享磁碟）的訪問。

STONITH方法（Shoot The Other Node In The Head）是說禁用或關閉可疑的節點。例如，電源fencing使用電源控制器來關閉無法操作的節點。

資源fencing方法不允許在不關閉節點電源的情況下訪問資源。這可能包括通過SCSI3持久保留fencing，禁用光纖通道埠的光纖通道fencing，或禁用GNBD伺服器訪問的GNBD fencing。

## 軟體開發和管理

### 並行編程

負載平衡集群（如Web伺服器）使用集群架構來支持大量使用者，通常每個使用者請求都被路由到一個特定的節點，實現無需多節點協作的任務並行，因為系統的主要目標是讓使用者快速訪問共享數據。然而，為少數使用者執行複雜計算的"電腦集群"需要利用集群的並行處理能力，在多個節點之間劃分"相同的計算"。

程序的自動並行化仍然是一個技術挑戰，但是並行編程模型可以通過在不同的處理器上同時執行程序的不同部分來實現更高並行度。

### 調試和監控

在集群上開發和調試並行程序需要並行語言原語以及合適的工具，例如高性能調試論壇（HPDF）所討論的那些工具，HPD規範就是這樣產生的。

像TotalView這樣的工具是為了在使用MPI或PVM進行消息傳遞的電腦集群上調試並行實現而開發的。

Berkeley NOW（Network of Workstations）系統收集集群數據並將其存儲在資料庫中，而在印度開發的PARMON系統允許對大型集群進行可視化觀察和管理。

當一個節點在長時間的多節點計算中失敗時，可以使用應用程式檢查點來恢復給定的系統狀態。這在大型集群中是必不可少的，因為隨著節點數量的增加，在繁重的計算負載下節點失敗的可能性也會增加。檢查點可以將系統恢復到穩定狀態，這樣處理就可以在不重新計算結果的情況下繼續進行。

## 一些實現

GNU/Linux世界提供了各種集群軟體；對於應用程式集群，有distcc和MPICH。Linux Virtual Server, Linux-HA等基於導向器的集群，允許傳入的服務請求分布在多個集群節點上。MOSIX、LinuxPMI、Kerrighed、OpenSSI都是集成到內核中的成熟集群，它們可在同類節點之間自動進行進程遷移。OpenSSI、openMosix和Kerrighed是單系統映像實現。

基於Windows Server平台的Microsoft Windows電腦群集Server 2003為高性能計算提供了諸如Job Scheduler、MSMPI庫和管理工具。

gLite是E-sciencE網格計劃（EGEE）創建的一組中間件技術。

slurm還用於調度和管理一些最大的超級計算機集群（參見top500列表）。

## 其他方法

儘管大多數電腦集群都是永久性的，但是人們已經嘗試用快閃計算來為特定的計算構建短期集群。不過，更大規模的志願計算系統（如基於BOINC的系統）的追隨者更多。

## 參見

基本概念 :、集群文件系統 :、心跳專用網絡 :、高可用性集群 :、單系統映像 :、對稱多處理 分布式計算 :、分布式計算 :、分散式檔案系統 :、分布式作業系統 :、分布式共享存儲處理機｜具體系統 :、DEGIMA (computer cluster) :、京 (超級計算機) :、微軟集群伺服器 :、紅帽集群套件 :、Rocks集群發行版 :、Solaris集群 :、Veritas集群伺服器 計算工廠 :、編譯工廠 :、著色農場 :、伺服器農場

## 外部連結

- IEEE Technical Committee on Scalable Computing (TCSC)
- Reliable Scalable Cluster Technology, IBM
- Tivoli System Automation Wiki
- Large-scale cluster management at Google with Borg, April 2015, by Abhishek Verma, Luis Pedrosa, Madhukar Korupolu, David Oppenheimer, Eric Tune and John Wilkes