計算機叢集是一組鬆散或緊密連線在一起工作的計算機。由於這些計算機協同工作，在許多方面它們可以被視為單個系統。與網格計算機不同，計算機叢集將每個設定為執行相同的任務，由軟體控制和排程。 叢集的元件通常透過快速區域網相互連線，每個節點（用作伺服器的計算機）執行自己的作業系統例項。在大多數情況下，所有節點使用相同的硬體和相同的作業系統，儘管在某些設定中（例如使用），可以在每臺計算機或不同的硬體上使用不同的作業系統。 部署叢集通常是為了提高單臺計算機的效能和可用性，而叢集也通常比速度或可用性相當的單臺計算機的成本效益要高。 計算機叢集的出現是許多計算趨勢匯聚的結果，這些趨勢包括低成本微處理器、高速網路以及用於高效能分散式計算軟體的廣泛使用。叢集使用和部署廣泛，從小型企業叢集到世界上最快超級電腦（如 IBM 的 Sequoia）。 在叢集出現之前，人們採用具有三重模組冗餘的單元容錯主機；但是，叢集的前期成本較低，網路結構速度提高，這助推了人們採用叢集這種方式。與高可靠性的大型機叢集相比，擴充套件成本更低，但也增加了錯誤處理的複雜性，因為在叢集中錯誤模式對於執行的程式是不透明的。 基本概念 為了透過組合低成本的商用現成計算機，來獲得更大的計算能力和更好的可靠性，人們研究提出了各種架構和配置。 計算機叢集方法通常透過快速區域網連線許多現成的計算節點（例如用作伺服器的個人計算機）。 計算節點的活動由 叢集中介軟體 協調，叢集中介軟體是一個位於節點之上的軟體層，讓使用者可以將叢集視為一個整體的內聚計算單元（例如透過單系統映像概念）。 計算機叢集依賴於一種集中管理方法，該方法把節點用作協調的共享伺服器。它不同於其他方法（比如對等計算或網格計算），後者也使用許多節點，但具有更多的分散式特性。 計算機叢集可能是一個簡單的兩節點系統，只連線兩臺個人電腦，也可能是一臺速度非常快的超級計算機。構建叢集的基本方法是貝奧武夫機群，它可以使用少量個人計算機構建，以產生與傳統高效能計算相比經濟划算的替代方案。一個展示概念可行性的早期專案是 133 節點的 Stone Soupercomputer。 開發人員使用 Linux、工具包和訊息傳遞介面庫以相對較低的成本實現高效能。 儘管一個叢集可能僅由幾臺透過簡單網路連線的個人計算機組成，但叢集架構也可用於實現非常高的效能水平。TOP500 組織每半年公佈的 500 臺最快超級計算機的名單通常包括許多叢集，例如，2011 年世界上最快的機器是 京，它有和叢集架構。 歷史 Greg Pfister 指出，叢集最初不是由特定的供應商發明的，而是由無法在一臺計算機上完成所有工作或需要備份的客戶發明的。 他估計計算機叢集發明於 20 世紀 60 年代。 作為並行工作的一種方式，叢集計算的正式工程基礎可以說是由 IBM 的吉恩阿姆達爾發明的，因為他在 1967 年出版了被認為是關於並行處理的開創性論文：阿姆達爾定律。 早期計算機叢集的歷史或多或少直接與早期網路的歷史有關，因為網路發展的主要動機之一是連線計算資源，建立真正的計算機叢集。 第一個被設計成叢集的生產系統是 20 世紀 60 年代中期的 Burroughs ，它允許多達四臺計算機（每個計算機都有一個或兩個處理器）緊密連線到一個公共磁碟儲存系統，以平衡工作負載。與標準的多處理器系統不同，每臺計算機都可以在不中斷整體執行的情況下重新啟動。 第一個商業鬆散耦合的叢集產品是公司的 附加資源計算機（Attached Resource Computer，ARC）系統，該系統於 1977 年開發，使用 ARCNET 作為叢集介面。直到迪吉多電腦公司在 1984 年為 VAXVMS 作業系統（現在稱為 OpenVMS）釋出了產品，叢集才真正開始。ARC 和 VAX 叢集產品不僅支援平行計算，還支援共享檔案系統和外部裝置。其目的是提供並行處理的優勢，同時保持資料的可靠性和唯一性。另外兩個值得注意的早期商業叢集是（大約 1994 年出現的高可用性產品）和 IBM S390 Parallel Sysplex（也在大約 1994 年出現，主要用於商業用途）。 同時，當商業網路使用計算機叢集在計算機外部的並行性時，超級計算機開始在計算機內部中使用它們。繼 CDC 6600 在 1964 年取得成功之後，也於 1976 年成功釋出，並透過向量處理引入了內部並行性。 雖然早期的超級計算機不使用叢集而是使用了共享記憶體，但一些速度最快的超級計算機（如京）最終依賴於叢集架構。 叢集的屬性 zhhantzhhans 可以根據不同目的配置計算機叢集，從一般用途的業務需求（如 Web 服務支援），到計算密集型的科學計算。在這兩種情況下，叢集都可以使用高可用性方法。請注意，下面描述的屬性並不是排他的，計算機叢集 也可以使用高可用性方法等等。 負載均衡 叢集是叢集節點共享計算工作負載，以提供更好的總體效能的配置。例如，Web 伺服器叢集可以將不同的查詢分配給不同的節點，因此總體響應時間將得到最佳化。 然而，負載平衡的方法可能在不同的應用程式之間有很大的不同，例如，用於科學計算的高效能叢集的平衡負載演算法與 Web 伺服器叢集不同，Web 伺服器叢集可能只是使用一種簡單的迴圈方法，將每個新請求分配到不同節點。 計算機叢集用於計算密集型目的，而不是處理面向 IO 的操作（如 Web 服務或資料庫）。 例如，計算機叢集可能支援車禍或天氣的計算模擬。非常緊密耦合的計算機叢集被設計用於可能接近 超級計算 的工作。 高可用性叢集 提高了叢集方法的可用性。它們透過擁有冗餘節點來執行，當系統元件出現故障時，這些節點將用於提供服務。高可用性叢集實現試圖使用叢集元件的冗餘來消除單點故障。許多作業系統都有高可用性叢集的商業實現。LinuxHA 專案是 Linux 作業系統常用的一個自由軟體 HA 包。 優點 叢集的設計主要考慮效能，但實際使用中還涉及許多其他因素，包括容錯（能夠容許系統繼續使用故障節點）能力、可擴充套件性、高效能、不需要頻繁執行維護程式、資源整合（如 RAID）和集中管理。叢集的優點包括在發生災難時啟用資料恢復、提供並行資料處理和高計算能力。 在可伸縮性方面，叢集提供了水平新增節點的能力。這意味著可以向叢集中新增更多的計算機，以提高其效能、冗餘和容錯。與在叢集中擴充套件單個節點相比，新增節點是一個既節省成本，又可以使叢集獲得更高的效能的解決方案。計算機叢集的這一大特性允許大量效能較低的計算機執行較大的計算負載。 向叢集新增新節點時，可靠性也會增加，這是因為進行維護的時候不需要停下整個叢集，只需停下單個節點維護，叢集的其餘節點承擔該節點的負載即可。 如果叢集包含大量的計算機，那麼可以使用分散式檔案系統和 RAID，這兩種方法可以大大提高叢集的可靠性和速度。 設計與配置 設計叢集的問題之一是各個節點之間的耦合程度。例如，單個計算機作業可能需要節點之間的頻繁通訊：這意味著叢集共享一個專用網路，位置密集，可能有同類節點。另一個極端是計算機作業使用一個或幾個節點，並且需要很少或沒有節點間通訊，接近網格計算。 在貝奧武夫機群中，應用程式從不會看到計算節點（也叫 從屬計算機），只與 主計算機 互動，而 主計算機 是處理從屬計算機的排程和管理的特定計算機。 在典型的實現中，主計算機具有兩個網路介面，一個用於為從屬裝置與專用貝奧武夫網路通訊，另一個用於組織的通用網路。 從屬計算機通常有同一作業系統、本地記憶體和磁碟空間的它們自己的版本。但是，專用從屬網路還可以有大型共享檔案伺服器，該伺服器儲存全域性持久資料，從屬裝置可以根據需要訪問這些資料。 一個特殊用途的 144 節點 DEGIMA 叢集被調整為使用多步行並行樹碼執行天體物理 N 體模擬，而不是通用的科學計算。 由於每一代遊戲機的計算能力不斷增強，一種新的用途出現了，它們被重新用於高效能計算（HPC）叢集。遊戲機叢集的例子有索尼 PlayStation 叢集和微軟 Xbox 叢集。另一個消費類遊戲產品的例子是 Nvidia Tesla 個人超級計算機工作站，它使用多個圖形加速處理器晶片。除了遊戲機，也可以使用高階顯示卡。使用顯示卡進行網格計算比使用 CPU 更經濟，儘管不太精確。但是，當使用雙精度值時，它們變得像 CPU 一樣精確，並且成本更低。 計算機叢集歷來在使用相同作業系統的獨立物理計算機上執行。隨著虛擬化技術的出現，叢集節點可以在具有不同作業系統的獨立物理計算機上執行，這些作業系統上面繪製了一個虛擬層，使之看起來相似。 當進行維護時，叢集還可以在各種配置上進行虛擬化。一個示例實現是 Xen 作為 LinuxHA 的虛擬化管理器。 資料共享與通訊 資料共享 隨著計算機叢集在 20 世紀 80 年代的出現，超級計算機也應運而生。早期的超級計算機依賴於共享記憶體，這是當時這三類計算機的區別之一。迄今為止，叢集通常不使用物理共享記憶體，而許多超級計算機體系結構也放棄了這一點。 不過，在現代計算機叢集中，叢集檔案系統的使用是必不可少的。例如、Microsoft 的或。 訊息傳遞與通訊 用於叢集節點間通訊的兩種廣泛使用的方法是 MPI（訊息傳遞介面）和 PVM。 早在 1989 年 MPI 出現之前，PVM 就在橡樹嶺國家實驗室問世了。PVM 必須直接安裝在每個叢集節點上，並提供一組軟體庫，將節點描繪成一個 並行虛擬機器。PVM 為訊息傳遞、任務和資源管理以及故障通知提供了一個執行時環境。PVM 可以由用 C、C 或 Fortran 等語言編寫的使用者程式使用。 20 世紀 90 年代初，在 40 個組織的討論中產生了 MPI。最初的努力得到了 ARPA 和國家科學基金會的支援。MPI 的設計沒有重新開始，而是利用了當時商業系統中可用的各種特性。MPI 規範催生了具體的實現。MPI 實現通常使用 TCPIP 和套接字連線。 MPI 現在是一種廣泛使用的通訊模型，它使並行程式能夠用 C、Fortran、Python 等語言編寫。 因此，與提供具體實現的 PVM 不同，MPI 是已經在諸如 MPICH 和 Open MPI 的系統中實現的規範。 叢集管理 thumb 在 Lubuntu 上使用 Apache Hadoop，低成本、低能耗的 Cubieboard 微型叢集 使用計算機叢集伺服器的挑戰之一是管理它的成本，如果叢集有 N 個節點，有時可能高達管理 N 個獨立機器的成本。 在某些情況下，這為管理成本較低的共享記憶體架構提供了一個優勢。 由於便於管理，這也使得虛擬機器非常流行。 任務排程 當大型多使用者叢集需要訪問大量資料時，任務排程就成為一個挑戰。在具有複雜應用環境的異構 CPUGPU 叢集中，每項作業的效能取決於底層叢集的特性。因此，將任務對映到 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 系統允許對大型叢集進行視覺化觀察和管理。 當一個節點在長時間的多節點計算中失敗時，可以使用來恢復給定的系統狀態。 這在大型叢集中是必不可少的，因為隨著節點數量的增加，在繁重的計算負載下節點失敗的可能性也會增加。檢查點可以將系統恢復到穩定狀態，這樣處理就可以在不重新計算結果的情況下繼續進行。 一些實現 GNULinux 世界提供了各種叢集軟體；對於應用程式叢集，有 distcc 和 MPICH。Linux Virtual Server LinuxHA 等基於導向器的叢集，允許傳入的服務請求分佈在多個叢集節點上。MOSIX、LinuxPMI、Kerrighed、OpenSSI 都是整合到核心中的成熟叢集，它們可在同類節點之間自動進行程序遷移。OpenSSI、openMosix 和 Kerrighed 是單系統映像實現。 基於 Windows Server 平臺的 Microsoft Windows 計算機群集 Server 2003 為高效能計算提供了諸如 Job Scheduler、MSMPI 庫和管理工具。 gLite 是（EGEE）建立的一組中介軟體技術。 slurm 還用於排程和管理一些最大的超級計算機叢集（參見 top500 列表）。 其他方法 儘管大多數計算機叢集都是永久性的，但是人們已經嘗試用來為特定的計算構建短期叢集。不過，更大規模的系統（如基於 BOINC 的系統）的追隨者更多。 參見 基本概念 叢集檔案系統 高可用性叢集 單系統映像 對稱多處理 分散式計算 分散式計算 分散式檔案系統 分散式作業系統 分散式共享儲存處理機 具體系統 DEGIMA computer cluster 京 超級計算機 紅帽叢集套件 計算工廠 著色農場 伺服器農場 參考資料 延伸閱讀 外部連結 IEEE Technical Committee on Scalable Computing TCSC Reliable Scalable Cluster Technology IBM Tivoli System Automation Wiki Largescale cluster management at Google with Borg April 2015 by Abhishek Verma Luis Pedrosa Madhukar Korupolu David Oppenheimer Eric Tune and John Wilkes Category 平行計算 Category 併發計算 Category 超級電腦 Category 區域網 Category 電腦的類別