集群计算

**電腦叢集**（英語：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 的系統）的追隨者更多。

## 參見

## 參考資料

## 延伸閱讀

* Baker, Mark; et al. Cluster Computing White Paper. 11 Jan 2001. arXiv:cs/0004014 .
* Marcus, Evan; Stern, Hal. Blueprints for High Availability: Designing Resilient Distributed Systems. John Wiley & Sons. 2000. ISBN 0-471-35601-8.
* Pfister, Greg. In Search of Clusters. Prentice Hall. 1998. ISBN 0-13-899709-8.
* Buyya, Rajkumar (編). High Performance Cluster Computing: Architectures and Systems **1**. NJ, USA: Prentice Hall. 1999. ISBN 0-13-013784-7.
* Buyya, Rajkumar (編). High Performance Cluster Computing: Architectures and Systems **2**. NJ, USA: Prentice Hall. 1999. ISBN 0-13-013785-5.

## 外部連結

* 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