计算机集群

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

基本概念

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

歷史

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年成功發布，並通過向量處理引入了內部並列性。 雖然早期的超級電腦不使用叢集而是使用了共用記憶體，但一些速度最快的超級電腦（如京）最終依賴於叢集架構。

叢集的屬性

可以根據不同目的組態電腦叢集，從一般用途的業務需求（如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的虛擬化管理器。

資料共用

隨著電腦叢集在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的系統中實現的規範。

叢集管理

使用電腦叢集伺服器的挑戰之一是管理它的成本，如果叢集有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的系統）的追隨者更多。