計算機集群

德國開姆尼茨工業大學的技術人員在一個大型Linux集群上工作
Solaris Cluster
計算機集群（computer cluster）是一組鬆散或緊密連接在一起工作的計算機。由於這些計算機協同工作，在許多方面它們可以被視為單個系統。與網格計算機不同，計算機集群將每個節點設置為執行相同的任務，由軟件控制和調度。
集群的組件通常通過快速局域網相互連接，每個節點（用作服務器的計算機）運行自己的操作系統實例。在大多數情況下，所有節點使用相同的硬件和相同的操作系統，儘管在某些設置中（例如使用Open Source Cluster Application Resources），可以在每臺計算機或不同的硬件上使用不同的操作系統。
部署集群通常是為了提高單臺計算機的性能和可用性，而集群也通常比速度或可用性相當的單臺計算機的成本效益要高。
計算機集群的出現是許多計算趨勢匯聚的結果，這些趨勢包括低成本微處理器、高速網絡以及用於高性能分佈式計算軟件的廣泛使用。集群使用和部署廣泛，從小型企業集群到世界上最快超級電腦（如IBM的Sequoia）。  在集群出現之前，人們採用具有三重模塊冗餘的單元容錯主機；但是，集群的前期成本較低，網絡結構速度提高，這助推了人們採用集群這種方式。與高可靠性的大型機集群相比，擴展成本更低，但也增加了錯誤處理的複雜性，因為在集群中錯誤模式對於運行的程序是不透明的。

**基本概念**
一個簡單、自制的貝奧武夫機群。
為了通過組合低成本的商用現成計算機，來獲得更大的計算能力和更好的可靠性，人們研究提出了各種架構和配置。
計算機集群方法通常通過快速局域網連接許多現成的計算節點（例如用作服務器的個人計算機）。 計算節點的活動由“集群中間件”協調，集群中間件是一個位於節點之上的軟件層，讓用戶可以將集群視為一個整體的內聚計算單元（例如通過單系統映像概念）。
計算機集群依賴於一種集中管理方法，該方法把節點用作協調的共享服務器。它不同於其他方法（比如對等計算或網格計算），後者也使用許多節點，但具有更多的分佈式特性。
計算機集群可能是一個簡單的兩節點系統，只連接兩臺個人電腦，也可能是一臺速度非常快的超級計算機。構建集群的基本方法是貝奧武夫機群，它可以使用少量個人計算機構建，以產生與傳統高性能計算相比經濟划算的替代方案。一個展示概念可行性的早期項目是133節點的Stone Soupercomputer。 開發人員使用Linux、Parallel Virtual Machine工具包和訊息傳遞介面庫以相對較低的成本實現高性能。
儘管一個集群可能僅由幾臺通過簡單網絡連接的個人計算機組成，但集群架構也可用於實現非常高的性能水平。TOP500組織每半年公佈的500臺最快超級計算機的名單通常包括許多集群，例如，2011年世界上最快的機器是“京”，它有distributed memory和集群架構。

**歷史**
一個VAX集群 11/780, 拍攝於約1977年
Greg Pfister指出，集群最初不是由特定的供應商發明的，而是由無法在一臺計算機上完成所有工作或需要備份的客戶發明的。  他估計計算機集群發明於20世紀60年代。 作為並行工作的一種方式，集群計算的正式工程基礎可以說是由IBM的吉恩·阿姆達爾發明的，因為他在1967年出版了被認為是關於並行處理的開創性論文：阿姆達爾定律。
早期計算機集群的歷史或多或少直接與早期網絡的歷史有關，因為網絡發展的主要動機之一是連接計算資源，創建真正的計算機集群。
第一個被設計成集群的生產系統是20世紀60年代中期的Burroughs B5700，它允許多達四臺計算機（每個計算機都有一個或兩個處理器）緊密連接到一個公共磁盤存儲系統，以平衡工作負載。與標準的多處理器系統不同，每臺計算機都可以在不中斷整體運行的情況下重新啟動。
第一個商業鬆散耦合的集群產品是Datapoint公司的“附加資源計算機”（Attached Resource Computer，ARC）系統，該系統於1977年開發，使用ARCNET作為集群接口。直到迪吉多電腦公司在1984年為VAX/VMS操作系統（現在稱為OpenVMS）發佈了VAX集群產品，集群才真正開始。ARC和VAX集群產品不僅支持並行計算，還支持共享文件系統和外部設備。其目的是提供並行處理的優勢，同時保持數據的可靠性和唯一性。另外兩個值得注意的早期商業集群是Tandem Himalayan（大約1994年出現的高可用性產品）和IBM S/390 Parallel Sysplex（也在大約1994年出現，主要用於商業用途）。
同時，當商業網絡使用計算機集群在計算機外部的並行性時，超級計算機開始在計算機內部中使用它們。繼CDC 6600在1964年取得成功之後，Cray 1也於1976年成功發佈，並通過向量處理引入了內部並行性。 雖然早期的超級計算機不使用集群而是使用了共享內存，但一些速度最快的超級計算機（如京）最終依賴於集群架構。

**集群的屬性**
-{zh-hant:含有2臺伺服器、N臺使用者終端機的一個負載平衡叢集;zh-hans:含有2臺服務器、N臺用戶終端的一個負載均衡集群}-
可以根據不同目的配置計算機集群，從一般用途的業務需求（如Web服務支持），到計算密集型的科學計算。在這兩種情況下，集群都可以使用高可用性方法。請注意，下面描述的屬性並不是排他的，“計算機集群”也可以使用高可用性方法等等。
“負載均衡”集群是集群節點共享計算工作負載，以提供更好的總體性能的配置。例如，Web服務器集群可以將不同的查詢分配給不同的節點，因此總體響應時間將得到優化。 然而，負載平衡的方法可能在不同的應用程序之間有很大的不同，例如，用於科學計算的高性能集群的平衡負載算法與Web服務器集群不同，Web服務器集群可能只是使用一種簡單的循環方法，將每個新請求分配到不同節點。
計算機集群用於計算密集型目的，而不是處理面向IO的操作（如Web服務或數據庫）。 例如，計算機集群可能支持車禍或天氣的計算模擬。非常緊密耦合的計算機集群被設計用於可能接近“超級計算”的工作。
“高可用性集群”提高了集群方法的可用性。它們通過擁有冗餘節點來運行，當系統組件出現故障時，這些節點將用於提供服務。高可用性集群實現試圖使用集群組件的冗餘來消除單點故障。許多操作系統都有高可用性集群的商業實現。Linux-HA項目是Linux操作系統常用的一個自由軟件HA包。

**優點**
集群的設計主要考慮性能，但實際使用中還涉及許多其他因素，包括容錯（能夠容許系統繼續使用故障節點）能力、可擴展性、高性能、不需要頻繁運行維護程序、資源整合（如RAID）和集中管理。集群的優點包括在發生災難時啟用數據恢復、提供並行數據處理和高計算能力。
在可伸縮性方面，集群提供了水平添加節點的能力。這意味著可以向集群中添加更多的計算機，以提高其性能、冗餘和容錯。與在集群中擴展單個節點相比，添加節點是一個既節省成本，又可以使集群獲得更高的性能的解決方案。計算機集群的這一大特性允許大量性能較低的計算機執行較大的計算負載。
向集群添加新節點時，可靠性也會增加，這是因為進行維護的時候不需要停下整個集群，只需停下單個節點維護，集群的其餘節點承擔該節點的負載即可。
如果集群包含大量的計算機，那麼可以使用分佈式文件系統和RAID，這兩種方法可以大大提高集群的可靠性和速度。

**設計與配置**
典型的貝奧武夫配置。
設計集群的問題之一是各個節點之間的耦合程度。例如，單個計算機作業可能需要節點之間的頻繁通信：這意味著集群共享一個專用網絡，位置密集，可能有同類節點。另一個極端是計算機作業使用一個或幾個節點，並且需要很少或沒有節點間通信，接近網格計算。
在貝奧武夫機群中，應用程序從不會看到計算節點（也叫“從屬計算機”），只與“主計算機”交互，而“主計算機”是處理從屬計算機的調度和管理的特定計算機。 在典型的實現中，主計算機具有兩個網絡接口，一個用於為從屬設備與專用貝奧武夫網絡通信，另一個用於組織的通用網絡。 從屬計算機通常有同一操作系統、本地內存和磁盤空間的它們自己的版本。但是，專用從屬網絡還可以有大型共享文件服務器，該服務器存儲全局持久數據，從屬設備可以根據需要訪問這些數據。
一個特殊用途的144節點DEGIMA集群被調整為使用多步行並行樹碼運行天體物理N體仿真，而不是通用的科學計算。
由於每一代遊戲機的計算能力不斷增強，一種新的用途出現了，它們被重新用於高性能計算（HPC）集群。遊戲機集群的例子有索尼PlayStation集群和微軟Xbox集群。另一個消費類遊戲產品的例子是Nvidia Tesla個人超級計算機工作站，它使用多個圖形加速處理器芯片。除了遊戲機，也可以使用高端顯卡。使用顯卡進行網格計算比使用CPU更經濟，儘管不太精確。但是，當使用雙精度值時，它們變得像CPU一樣精確，並且成本更低。
計算機集群歷來在使用相同操作系統的獨立物理計算機上運行。隨著虛擬化技術的出現，集群節點可以在具有不同操作系統的獨立物理計算機上運行，這些操作系統上面繪製了一個虛擬層，使之看起來相似。 當進行維護時，集群還可以在各種配置上進行虛擬化。一個示例實現是Xen作為Linux-HA的虛擬化管理器。

**數據共享與通信**

**數據共享**
NEC的Nehalem集群
隨著計算機集群在20世紀80年代的出現，超級計算機也應運而生。早期的超級計算機依賴於共享內存，這是當時這三類計算機的區別之一。迄今為止，集群通常不使用物理共享內存，而許多超級計算機體系結構也放棄了這一點。
不過，在現代計算機集群中，集群文件系統的使用是必不可少的。例如IBM General Parallel File System、Microsoft的Cluster Shared Volumes或Oracle Cluster File System。

**消息傳遞與通信**
用於集群節點間通信的兩種廣泛使用的方法是MPI（訊息傳遞介面）和PVM（Parallel Virtual Machine）。
早在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的系統中實現的規範。

**集群管理**
在Lubuntu上使用Apache Hadoop，低成本、低能耗的Cubieboard微型集群
使用計算機集群服務器的挑戰之一是管理它的成本，如果集群有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服務器）使用集群架構來支持大量用戶，通常每個用戶請求都被路由到一個特定的節點，實現無需多節點協作的任務並行，因為系統的主要目標是讓用戶快速訪問共享數據。然而，為少數用戶執行復雜計算的"計算機集群"需要利用集群的並行處理能力，在多個節點之間劃分"相同的計算"。
程序的Automatic parallelization仍然是一個技術挑戰，但是並行編程模型可以通過在不同的處理器上同時執行程序的不同部分來實現更高程度的並行性。

**調試和監控**
在集群上開發和調試並行程序需要並行語言原語以及合適的工具，例如高性能調試論壇（HPDF）所討論的那些工具，HPD規範就是這樣產生的。
像TotalView這樣的工具是為了在使用MPI或PVM進行消息傳遞的計算機集群上調試並行實現而開發的。
Berkeley NOW（Network of Workstations）系統收集集群數據並將其存儲在數據庫中，而在印度開發的PARMON系統允許對大型集群進行可視化觀察和管理。
當一個節點在長時間的多節點計算中失敗時，可以使用Application checkpointing來恢復給定的系統狀態。 這在大型集群中是必不可少的，因為隨著節點數量的增加，在繁重的計算負載下節點失敗的可能性也會增加。檢查點可以將系統恢復到穩定狀態，這樣處理就可以在不重新計算結果的情況下繼續進行。

**一些實現**
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是Enabling Grids for E-sciencE（EGEE）創建的一組中間件技術。
slurm還用於調度和管理一些最大的超級計算機集群（參見top500列表）。

**其他方法**
儘管大多數計算機集群都是永久性的，但是人們已經嘗試用flash mob computing來為特定的計算構建短期集群。不過，更大規模的volunteer computing系統（如基於BOINC的系統）的追隨者更多。

**參見**

**參考資料**

**延伸閱讀**
 date=11 Jan 2001- ISBN=0-471-35601-8- ISBN=0-13-899709-8- year=1999- year=1999

**外部鏈接**
  IEEE Technical Committee on Scalable Computing (TCSC)-  Reliable Scalable Cluster Technology, IBMfix-attempted=yes -  Tivoli System Automation Wikidate=20121024110707 -  Large-scale cluster management at Google with Borgdate=20180926155937 , April 2015, by Abhishek Verma, Luis Pedrosa, Madhukar Korupolu, David Oppenheimer, Eric Tune and John Wilkes