計算機叢集

計算機叢集是一組鬆散或緊密連線在一起工作的計算機。由於這些計算機協同工作，在許多方面它們可以被視為單個系統。與網格計算機不同，計算機叢集將每個設定為執行相同的任務，由軟體控制和排程。叢集的元件通常透過快速區域網相互連線，每個節點，可以在每臺計算機或不同的硬體上使用不同的作業系統。部署叢集通常是為了提高單臺計算機的效能和可用性，而叢集也通常比速度或可用性相當的單臺計算機的成本效益要高。計算機叢集的出現是許多計算趨勢匯聚的結果，這些趨勢包括低成本微處理器、高速網路以及用於高效能分散式計算軟體的廣泛使用。叢集使用和部署廣泛，從小型企業叢集到世界上最快超級電腦。 在叢集出現之前，人們採用具有模組冗餘的單元容錯主機；但是，叢集的前期成本較低，網路結構速度提高，這助推了人們採用叢集這種方式。與高可靠性的大型機叢集相比，擴充套件成本更低，但也增加了錯誤處理的複雜性，因為在叢集中錯誤模式對於執行的程式是不透明的。基本概念.為了透過組合低成本的商用現成計算機，來獲得更大的計算能力和更好的可靠性，人們研究提出了各種架構和配置。計算機叢集方法通常透過快速區域網連線許多現成的計算節點。計算機叢集依賴於一種集中管理方法，該方法把節點用作協調的共享伺服器。它不同於其他方法，後者也使用許多節點，但具有更多的分散式特性。計算機叢集可能是一個簡單的兩節點系統，只連線兩臺個人電腦，也可能是一臺速度非常快的超級計算機。構建叢集的基本方法是貝奧武夫機群，它可以使用少量個人計算機構建，以產生與傳統高效能計算相比經濟划算的替代方案。一個展示概念可行性的早期專案是133節點的Stone Soupercomputer。 開發人員使用Linux、工具包和訊息傳遞介面庫以相對較低的成本實現高效能。儘管一個叢集可能僅由幾臺透過簡單網路連線的個人計算機組成，但叢集架構也可用於實現非常高的效能水平。TOP500組織每半年公佈的500臺最快超級計算機的名單通常包括許多叢集，例如，2011年世界上最快的機器是“京”，它有和叢集架構。歷史.Greg Pfister指出，叢集最初不是由特定的供應商發明的，而是由無法在一臺計算機上完成所有工作或需要備份的客戶發明的。 他估計計算機叢集發明於20世紀60年代。 作為並行工作的一種方式，叢集計算的正式工程基礎可以說是由IBM的吉恩·阿姆達爾發明的，因為他在1967年出版了被認為是關於並行處理的開創性論文：阿姆達爾定律。早期計算機叢集的歷史或多或少直接與早期網路的歷史有關，因為網路發展的主要動機之一是連線計算資源，建立真正的計算機叢集。第一個被設計成叢集的生產系統是20世紀60年代中期的Burroughs ，它允許多達四臺計算機緊密連線到一個公共磁碟儲存系統，以平衡工作負載。與標準的多處理器系統不同，每臺計算機都可以在不中斷整體執行的情況下重新啟動。第一個商業鬆散耦合的叢集產品是公司的“附加資源計算機”。同時，當商業網路使用計算機叢集在計算機外部的並行性時，超級計算機開始在計算機內部中使用它們。繼CDC 6600在1964年取得成功之後，也於1976年成功釋出，並透過向量處理引入了內部並行性。 雖然早期的超級計算機不使用叢集而是使用了共享記憶體，但一些速度最快的超級計算機最終依賴於叢集架構。叢集的屬性.-{zh-hant:;zh-hans:}-可以根據不同目的配置計算機叢集，從一般用途的業務需求，到計算密集型的科學計算。在這兩種情況下，叢集都可以使用高可用性方法。請注意，下面描述的屬性並不是排他的，“計算機叢集”也可以使用高可用性方法等等。“負載均衡”叢集是叢集節點共享計算工作負載，以提供更好的總體效能的配置。例如，Web伺服器叢集可以將不同的查詢分配給不同的節點，因此總體響應時間將得到最佳化。 然而，負載平衡的方法可能在不同的應用程式之間有很大的不同，例如，用於科學計算的高效能叢集的平衡負載演算法與Web伺服器叢集不同，Web伺服器叢集可能只是使用一種簡單的迴圈方法，將每個新請求分配到不同節點。計算機叢集用於計算密集型目的，而不是處理面向IO的操作。 例如，計算機叢集可能支援車禍或天氣的計算模擬。非常緊密耦合的計算機叢集被設計用於可能接近“超級計算”的工作。“高可用性叢集”提高了叢集方法的可用性。它們透過擁有冗餘節點來執行，當系統元件出現故障時，這些節點將用於提供服務。高可用性叢集實現試圖使用叢集元件的冗餘來消除單點故障。許多作業系統都有高可用性叢集的商業實現。Linux-HA專案是Linux作業系統常用的一個自由軟體HA包。優點.叢集的設計主要考慮效能，但實際使用中還涉及許多其他因素，包括容錯和集中管理。叢集的優點包括在發生災難時啟用資料恢復、提供並行資料處理和高計算能力。在可伸縮性方面，叢集提供了水平新增節點的能力。這意味著可以向叢集中新增更多的計算機，以提高其效能、冗餘和容錯。與在叢集中擴充套件單個節點相比，新增節點是一個既節省成本，又可以使叢集獲得更高的效能的解決方案。計算機叢集的這一大特性允許大量效能較低的計算機執行較大的計算負載。向叢集新增新節點時，可靠性也會增加，這是因為進行維護的時候不需要停下整個叢集，只需停下單個節點維護，叢集的其餘節點承擔該節點的負載即可。如果叢集包含大量的計算機，那麼可以使用分散式檔案系統和RAID，這兩種方法可以大大提高叢集的可靠性和速度。設計與配置.設計叢集的問題之一是各個節點之間的耦合程度。例如，單個計算機作業可能需要節點之間的頻繁通訊：這意味著叢集共享一個專用網路，位置密集，可能有同類節點。另一個極端是計算機作業使用一個或幾個節點，並且需要很少或沒有節點間通訊，接近網格計算。在貝奧武夫機群中，應用程式從不會看到計算節點，只與“主計算機”互動，而“主計算機”是處理從屬計算機的排程和管理的特定計算機。 在典型的實現中，主計算機具有兩個網路介面，一個用於為從屬裝置與專用貝奧武夫網路通訊，另一個用於組織的通用網路。 從屬計算機通常有同一作業系統、本地記憶體和磁碟空間的它們自己的版本。但是，專用從屬網路還可以有大型共享檔案伺服器，該伺服器儲存全域性持久資料，從屬裝置可以根據需要訪問這些資料。一個特殊用途的144節點DEGIMA叢集被調整為使用多步行並行樹碼執行天體物理N體模擬，而不是通用的科學計算。由於每一代遊戲機的計算能力不斷增強，一種新的用途出現了，它們被重新用於高效能計算叢集。遊戲機叢集的例子有索尼PlayStation叢集和微軟Xbox叢集。另一個消費類遊戲產品的例子是Nvidia Tesla個人超級計算機工作站，它使用多個圖形加速處理器晶片。除了遊戲機，也可以使用高階顯示卡。使用顯示卡進行網格計算比使用CPU更經濟，儘管不太精確。但是，當使用雙精度值時，它們變得像CPU一樣精確，並且成本更低。計算機叢集歷來在使用相同作業系統的獨立物理計算機上執行。隨著虛擬化技術的出現，叢集節點可以在具有不同作業系統的獨立物理計算機上執行，這些作業系統上面繪製了一個虛擬層，使之看起來相似。 當進行維護時，叢集還可以在各種配置上進行虛擬化。一個示例實現是Xen作為Linux-HA的虛擬化管理器。資料共享與通訊.資料共享.隨著計算機叢集在20世紀80年代的出現，超級計算機也應運而生。早期的超級計算機依賴於共享記憶體，這是當時這三類計算機的區別之一。迄今為止，叢集通常不使用物理共享記憶體，而許多超級計算機體系結構也放棄了這一點。不過，在現代計算機叢集中，叢集檔案系統的使用是必不可少的。例如、Microsoft的或。訊息傳遞與通訊.用於叢集節點間通訊的兩種廣泛使用的方法是MPI。早在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”的訪問。STONITH方法是說禁用或關閉可疑的節點。例如，電源fencing使用電源控制器來關閉無法操作的節點。資源fencing方法不允許在不關閉節點電源的情況下訪問資源。這可能包括透過SCSI3持久保留fencing，禁用光纖通道埠的光纖通道fencing，或禁用GNBD伺服器訪問的GNBD fencing。軟體開發和管理.並行程式設計.負載平衡叢集使用叢集架構來支援大量使用者，通常每個使用者請求都被路由到一個特定的節點，實現無需多節點協作的任務並行，因為系統的主要目標是讓使用者快速訪問共享資料。然而，為少數使用者執行復雜計算的"計算機叢集"需要利用叢集的並行處理能力，在多個節點之間劃分"相同的計算"。程式的仍然是一個技術挑戰，但是並行程式設計模型可以透過在不同的處理器上同時執行程式的不同部分來實現更高。除錯和監控.在叢集上開發和除錯並行程式需要並行語言原語以及合適的工具，例如高效能除錯論壇所討論的那些工具，HPD規範就是這樣產生的。像TotalView這樣的工具是為了在使用MPI或PVM進行訊息傳遞的計算機叢集上除錯並行實現而開發的。Berkeley NOW系統收集叢集資料並將其儲存在資料庫中，而在印度開發的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是建立的一組中介軟體技術。slurm還用於排程和管理一些最大的超級計算機叢集。其他方法.儘管大多數計算機叢集都是永久性的，但是人們已經嘗試用來為特定的計算構建短期叢集。不過，更大規模的系統的追隨者更多。