{{위키데이터 속성 추적}}
[[파일:MEGWARE.CLIC.jpg|섬네일|300px|독일에 위치한 [[켐니츠 기술 대학교]]에서 기술자들이 대규모 [[리눅스]] 클러스터에서 작업하고 있다]]
'''컴퓨터 클러스터'''({{llang|en|computer cluster}})는 여러 대의 [[컴퓨터]]들이 연결되어 하나의 시스템처럼 동작하는 컴퓨터들의 집합을 말한다. 클러스터의 구성 요소들은 일반적으로 고속의 [[근거리 통신망]]으로 연결된다. 서버로 사용되는 [[노드]]에는 각각의 [[운영 체제]]가 실행된다. 컴퓨터 클러스터는 저렴한 [[마이크로프로세서]]와 고속의 [[네트워크]], 그리고 고성능 [[분산 컴퓨팅]]용 소프트웨어들의 조합 결과로 태어났다. 클러스터는 일반적으로 단일 컴퓨터보다 더 뛰어난 성능과 안정성을 제공하며, 비슷한 성능과 안정성을 제공하는 단일 컴퓨터보다 비용 면에서 훨씬 더 효율적이다.<ref>{{웹 인용|first=David|last=Bader|authorlink=David A. Bader|coauthors=Robert Pennington|url=http://www.cc.gatech.edu/~bader/papers/ijhpca.html|제목=Cluster Computing: Applications|publisher=Georgia Institute of Technology College of Computing|8=Georgia Tech College of Computing|date=June 1996|accessdate=2007-07-13|보존url=https://web.archive.org/web/20071221011621/http://www.cc.gatech.edu/~bader/papers/ijhpca.html|보존날짜=2007-12-21|url-status=dead}}</ref> 따라서 열 개 안팎의 중소 규모의 클러스터부터 수천 개로 이루어진 대형 [[슈퍼컴퓨터]]에 이르기까지 널리 사용되고 있다.

== 원리 ==
[[파일:Beowulf.jpg|섬네일|150px|간단하게 집에서 만들어진 [[베오울프 클러스터]]]]
시장에서 구할 수 있는 저렴한 상용 제품 여러 대를 조합하여 더 빠르고 안정적인 시스템을 만들고자 하는 요구가 원천이 되어 다양한 아키텍처와 구성방법이 발전해왔다.

컴퓨터 클러스터링 접근법은 일반적으로 시장에서 쉽게 가용한 제품들을 고속의 [[근거리 통신망]]으로 연결한다.<ref name="nbis">''Network-Based Information Systems: First International Conference, NBIS 2007'' {{ISBN|3-540-74572-6}} page 375</ref> 컴퓨팅 노드들을 "클러스터 미들웨어"라는 소프트웨어 계층에서 관리된다. 이 소프트웨어 계층은 노드들의 상부층에 위치하여 사용자들이 [[단일 시스템 이미지]] 개념으로 하나의 커다란 컴퓨팅 단위로 처리할 수 있도록 한다.<ref name=nbis /> 중앙 집중적인 관리 접근법은 노드들을 잘 조화된 공유 서버들로 만들어 준다. 이 방식은 많은 노드들을 사용하는 [[점대점 프로토콜|점대점]]이나 [[그리드 컴퓨팅]]과는 다르며 [[분산 컴퓨팅]]의 특성으로 차이점이 있다.<ref name=nbis /> 컴퓨터 클러스터는 간단히 두 개의 개인용 컴퓨터를 연결하는 두 노드 시스템일 수도 있고 수천 대를 연결한 매우 빠른 [[슈퍼컴퓨터]]일 수도 있다. 기본적인 클러스터 구성 방법은 전통적인 슈퍼컴퓨터를 비용 면에서 효율적인 제품으로 대체하기 위해 몇 개의 개인용 컴퓨터들을 이용하여 만든 [[베오울프 클러스터|베오울프]](beowulf) 방식이다. 초창기 133개의 노드로 구성된 [[Stone Soupercomputer]] 프로젝트는 컴퓨터 클러스터 개념이 실현 가능하다는 것을 증명하였다.<ref name="sciam">{{뉴스 인용 |제목= The Do-It-Yourself Supercomputer |work= [[Scientific American]] |author= William W. Hargrove, Forrest M. Hoffman and Thomas Sterling |volume= 265 |number= 2 |pages= 72–79 |date= 2001년 8월 16일 |url= http://www.sciam.com/article.cfm?id=the-do-it-yourself-superc |accessdate= 2011-10-18}}</ref> 비교적 낮은 비용으로 고성능을 이루기 위해 [[리눅스]]와 [[병렬 가상 머신]] 툴킷과 [[메시지 전달 인터페이스]] 라이브러리를 사용하였다.<ref name="extreme">{{뉴스 인용 |제목= Cluster Computing: Linux Taken to the Extreme |author= William W. Hargrove and Forrest M. Hoffman |work= Linux magazine |year= 1999 |url= http://climate.ornl.gov/~forrest/linux-magazine-1999/ |accessdate= 2011-10-18 |보존url= https://web.archive.org/web/20111018122713/http://climate.ornl.gov/~forrest/linux-magazine-1999/ |보존날짜= 2011-10-18 |url-status= dead }}</ref> 비록 클러스터들은 적은 수의 개인용 컴퓨터들을 단순한 네트워크로 연결되었지만 높은 수준의 성능을 이룰 수 있었다. 현재 해마다 두 번 발표하는 [[TOP500]]에 등재된 [[슈퍼컴퓨터]]들 가운데 상당수의 시스템은 컴퓨터 클러스터들이다.

== 클러스터의 특징 ==
컴퓨터 클러스터는 [[웹 서비스]]와 같은 일반적인 비즈니스 목적에 대한 요구부터 많은 계산이 요구되는 과학 계산에 이르기까지 다양한 용도로 구성될 수 있다. 이 모든 것들은 높은 가용성을 제공한다는 것이 장점이다.
[[파일:Balanceamento de carga (NAT).jpg|섬네일|2대의 서버와 4대의 사용자 시스템으로 구성된 작업 부하 분산용 클러스터]]
* "작업 [[부하분산|부하 분산]]"(Load-Balancing) 클러스터는 시스템의 전반적인 성능을 향상시키기 위해 계산 부하량을 여러 노드에서 분담하여 병렬 처리하도록 구성 하는 방식이다. 웹서버 클러스터의 예를 들면, 각기 다른 종류의 요구들을 각기 다른 노드에서 처리하도록 할당함으로써 전반적인 응답시간을 최소화 할 수 있다.<ref name="Sloan">''High Performance Linux Clusters'' by Joseph D. Sloan 2004 {{ISBN|0-596-00570-9}} page</ref> 그렇지만 애플리케이션에 따라 작업 부하를 분산하는 방법은 크게 다를 수 있다. 단순히 [[라운드 로빈]] 방식을 사용하는 웹 서버와 과학 계산을 하는데 사용되는 클러스터 시스템과의 방식은 다르다.

* "높은 [[가용성]]"(High-availability, HA) 클러스터는 시스템의 [[가용성]]을 높이기 위한 방법중 하나이다. 하나의 노드에 장애가 생겼을 때 연결된 다른 노드의 컴퓨터가 서비스를 이어받아(Failover) 계속해서 서비스되도록 한다.

== 설계 및 구성 ==
클러스터를 설계하는데 있어서 중요한 문제 중의 하나는 어떻게 각각의 노드들을 밀접하게 연결을 할 것인가이다. 처리할 하나의 컴퓨터 일(job)은 노드들 간에 빈번하게 통신을 해야 한다. 이것은 독립된 네트워크를 사용하여 동일한 아키텍처, 동일 기종의 노드들이 밀도있게 설치되어야 한다는 말이다. [[파일:beowulf.png|섬네일|240px|왼쪽|전형적인 베오울프 구성]]베오울프 시스템은 주(Master) 서버와 종속(Slave) 서버들로 구성되어 있다. 주 서버는 컴퓨터의 일들을 나누고 관리하며 종속 서버는 일을 처리하고 계산을 하는 서버들이다. 애플리케이션 프로그램은 주 서버와 통신을 할 뿐 종속 서버라고 불리는 계산 노드들과는 통신을 하지 않는다.<ref name="VECPAR">''High Performance Computing for Computational Science - VECPAR 2004'' by Michel Daydé, Jack Dongarra 2005 {{ISBN|3-540-25424-2}} pages 120-121</ref> 일반적으로 주 서버는 두 개의 네트워크 인터페이스를 가지고 있다. 하나는 종속 서버와의 통신을 위한 내부 네트워크이고 다른 하나는 외부 통신을 위한 범용 네트워크이다.<ref name=VECPAR /> 종속 서버는 일반적으로 자체의 [[운영 체제]]와 메모리 그리고 저장장치를 가지고 있다. 그러나 내부용 네트워크는 대용량 [[공유]] [[파일 서버]]와 연결될 수도 있다.<ref name=VECPAR /> 컴퓨터 클러스터는 전통적으로 동일 운영 체제 위에 물리적으로 분리된 컴퓨터들의 집합이라고 생각한다.

== 통신 서비스에서의 활용 ==
기존의 [[2-tier]] 클라이언트/서버 구조에서 서버는 수 백 명에서 수 천 명의 클라이언트를 처리하면 되었다. 그러나 웹을 기반으로 한 서비스가 많아지면서 동시에 수만에서 수백만의 클라이언트를 처리할 수 있는 서버가 필요하게 되었다. 이렇게 많은 클라이언트들의 요청을 동시에 처리하기 위해서 많은 서버들을 네트워크로 연결하여 클러스터 형태로 구성하는 것이 비용과 성능을 잘 절충한 일반적인 해결책이다.

== 클러스터의 구성 요소 ==
* 클러스터 노드 : 프로세싱 자원을 제공하는 시스템
* 클러스터 관리자 : 노드를 서로 연결하여 단일 시스템처럼 보이게 만드는 로직을 제공

== 데이터 공유 및 통신 ==
=== 데이터 공유 ===
[[파일:Nec-cluster.jpg|섬네일|[[NEC]]의 [[인텔]] [[네할렘]] 프로세서 기반 클러스터]]
1980년대에 컴퓨터 클러스터가 나오면서 [[슈퍼컴퓨터]]도 나왔다. 그 당시 초창기 슈퍼컴퓨터들은 [[공유 메모리]]를 많이 사용하였지만 지금의 클러스터들은 공유 메모리를 사용하지 않으며 많은 슈퍼컴퓨터들도 사용하지 않는다. 그렇지만 클러스터 파일 시스템은 현대 컴퓨터 클러스터에도 중요하게 사용된다. 예를 들면 공개 소프트웨어인 [[러스터 (파일 시스템)|러스터 파일 시스템]]은 [[TOP500]]의 컴퓨터에서 가장 많이 사용되는 병렬 분산 공유 파일 시스템이다.

=== 메시지 전달 통신 ===
가장 폭넓게 사용되는 2 가지 통신 방법은 MPI([[메시지 전달 인터페이스]])와 PVM([[병렬 가상 머신]])이다.<ref name="Gehrke">''Distributed services with OpenAFS: for enterprise and education'' by Franco Milicchio, Wolfgang Alexander Gehrke 2007, ISBN pages 339-341 [http://books.google.it/books?id=bKf4NBaIJI8C&pg=PA339&dq=%22message+passing%22+computer+cluster+MPI+PVM&hl=en&sa=X&ei=-dD7ToZCj_bhBOOxvI0I&redir_esc=y#v=onepage&q=%22message%20passing%22%20computer%20cluster%20MPI%20PVM&f=false] {{웨이백|url=http://books.google.it/books?id=bKf4NBaIJI8C&pg=PA339&dq=%22message+passing%22+computer+cluster+MPI+PVM&hl=en&sa=X&ei=-dD7ToZCj_bhBOOxvI0I&redir_esc=y#v=onepage&q=%22message%20passing%22%20computer%20cluster%20MPI%20PVM&f=false |date=20131216000232 }}</ref> PVM은 [[오크리지 국립 연구소]]에서 1989년도에 MPI가 사용되기 전에 개발되었다. PVM은 반드시 각각의 클러스터 노드에 설치되어야 하며 노드를 "병렬 가상 머신"으로 규정하는 소프트웨어 라이브러리의 집합을 제공한다. PVM은 메시지 전달과 테스크 그리고 자원 관리 및 오류 알림을 위한 실시간 환경을 제공한다. PVM은 [[C (프로그래밍 언어)|C]], [[C++]] 또는 [[포트란]] 등의 언어로 작성된 사용자 프로그램에서 사용된다.<ref name=Gehrke /><ref name=Prabhu />
MPI는 1990년대 초에 40개 조직들의 토론에 의해 태어났다. 초기에는 [[방위고등연구계획국|ARPA]] 및 [[미국 국립과학재단]](NSF)에 의해 주도 되었다. 아주 처음부터 새롭게 시작하는 것 대신에 MPI는 상용 시스템에서 사용되는 기능들 위에서 설계되었다. MPI 규격은 규격 보충으로 증가 되었으며 MPI는 일반적으로 [[TCP/IP]]와 소켓 연결을 사용한다.<ref name=Gehrke /> MPI는 지금 광범위하게 사용되는 통신 모델이며 C, 포트란, [[파이썬]]과 같은 언어를 사용하여 병렬 프로그래밍을 구현한다.<ref name=Prabhu >{{웹 인용 |url=http://books.google.it/books?id=EIVdVtGHv-0C&pg=PA112&dq=%22message+passing%22+computer+cluster+MPI+PVM&hl=en&sa=X&ei=-dD7ToZCj_bhBOOxvI0I&redir_esc=y#v=onepage&q=%22message%20passing%22%20computer%20cluster%20MPI%20PVM&f=false |제목=''Grid and Cluster Computing'' by Prabhu 2008 8120334280 pages 109-112 |확인날짜=2013-03-07 |보존url=https://web.archive.org/web/20131216001434/http://books.google.it/books?id=EIVdVtGHv-0C&pg=PA112&dq=%22message+passing%22+computer+cluster+MPI+PVM&hl=en&sa=X&ei=-dD7ToZCj_bhBOOxvI0I&redir_esc=y#v=onepage&q=%22message%20passing%22%20computer%20cluster%20MPI%20PVM&f=false |보존날짜=2013-12-16 |url-status=dead }}</ref> 따라서 PVM과는 다르게 MPI는 [[MPICH]]와 [[Open MPI]]과 같은 시스템에서 구현된다.<ref name=Prabhu /><ref name=Gropp>{{저널 인용
|last1=Gropp |first1=William |last2=Lusk |first2=Ewing |last3=Skjellum |first3=Anthony
|year=1996|id = {{citeseerx|10.1.1.102.9485}}
|제목=A High-Performance, Portable Implementation of the MPI Message Passing Interface
|journal=Parallel Computing |ref=harv}}</ref>

== 클러스터 관리 ==
컴퓨터 클러스터를 사용하는데 있어서 가장 어려운 점중의 하나는 시스템을 관리하는 것이다. 만약 N개의 노드로 구성된 클러스터 시스템이 있다고 한다면 관리비용은 N개의 독립된 컴퓨터들을 관리하는 것과 비슷한 비용이 든다.<ref name="patter641">''Computer Organization and Design'' by David A. Patterson and John L. Hennessy 2011 {{ISBN|0-12-374750-3}} pages 641-642</ref> 따라서 어떤 경우에는 [[공유 메모리 아키텍처]]가 관리비용 측면에서 클러스터 시스템 대비 유리한 측면이 있다.<ref name=patter641 /> 상대적으로 관리의 편리성은 [[가상 머신]]이 많이 활용되는 이유중의 하나이다.

=== 작업 스케줄링 ===
커다란 여러 사용자 클러스터가 매우 방대한 양의 데이터를 접근할 때 [[스케줄링 (컴퓨팅)|작업 스케줄링]]을 하는 것은 매우 어렵다. 애플리케이션의 환경이 복잡한 이기종 CPU-코프로세서 클러스터의 경우에 각 작업(job)의 성능은 클러스터의 특성에 의존적이기 때문에 CPU 코어와 코프로세서 장치에 작업을 할당하는 것은 매우 어렵다.<ref name="Shira">K. Shirahata, et al ''Hybrid Map Task Scheduling for GPU-Based Heterogeneous Clusters'' in: Cloud Computing Technology and Science (CloudCom), 2010 Nov. 30 2010-Dec. 3 2010 pages 733 - 740 {{ISBN|978-1-4244-9405-7}} [http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=5708524]</ref> 이 분야는 현재 진행되고 있는 연구 분야이기도 하다.

=== 노드 장애 관리 ===
클러스터의 한 노드에서 장애가 발생했을 때 나머지의 모든 시스템이 계속해서 동작하도록 하기 위한 방법으로 "펜싱"(fencing)과 같은 전략이 사용된다.<ref name="ARob">Alan Robertson ''Resource fencing using STONITH''. IBM Linux Research Center, 2010 [ftp://ftp.telecom.uff.br/pub/linux/HA/ResourceFencing_Stonith.pdf]{{깨진 링크|url=ftp://ftp.telecom.uff.br/pub/linux/HA/ResourceFencing_Stonith.pdf }}</ref><ref name=suncl >''Sun Cluster environment: Sun Cluster 2.2'' by Enrique Vargas, Joseph Bianco, David Deeths 2001 ISBN page 58</ref> 펜싱은 노드가 오동작을 할 때 공유된 자원을 보호하고 그 노드를 격리시키는 동작이다. 두가지의 펜싱 방법이 있는데 하나는 노드 자체를 비활성화 시키는 것이고 다른 방법은 공유 디스크와 같은 공유 자원에 대한 접근을 차단하는 것이다.<ref name=ARob /> 노드의 격리는 장애로 의심되는 노드를 비활성화 하거나 전원을 끈다는 의미이다.<ref name=ARob /> 예를 들면, 전원 펜싱은 전원 제어기가 동작하지 않는 노드의 전원을 끄는 것이다.
자원 펜싱은 노드의 전원을 끄지 않고 자원에 대한 접근을 막는 것이다. 이것은 [[SCSI3]]에서 ''persistent reservation fencing''이 있고, 파이버 채널 포트를 막기위한 파이버 채널 팬싱, [[global network block device]] (GNBD) 서버에 대한 접근을 막기위해 GNBD 팬싱이 있다.

== 소프트웨어 개발 및 관리 ==
=== 병렬 프로그래밍 ===
웹 서버와 같이 작업 부하를 조절해주는 클러스터들은 많은 사용자들을 지원하기 위해 각 사용자의 요구를 특정 노드에 연결을 해주는 구조를 사용한다. 이 방법은 여러 노드들간 상호 협력하지 않고서 사용자가 공유 데이터에 빠르게 접근할 수 있게 [[작업 병렬화]]를 구현한다. 그렇지만 적은 수의 사용자가 아주 복잡한 계산을 수행해야 하는 컴퓨터 클러스터는 클러스터의 병렬 처리 능력이 발휘되어야 한다.<ref name=Blum /> 프로그램을 자동으로 병렬화해주는 것은 기술적으로 극복해야 할 과제이다. 그렇지만 각기 다른 프로세서들에서 프로그램을 동시에 수행함으로써 더 높은 수준의 병렬화를 수행하기 위해서 [[병렬 프로그래밍 모델]]이 사용되어야 한다.<ref name="Blum">''Computer Science: The Hardware, Software and Heart of It'' by Alfred V. Aho, Edward K. Blum 2011 {{ISBN|1-4614-1167-X}} pages 156-166 [http://books.google.it/books?id=S7QU9RRLYIYC&pg=PA156&dq=%22parallel+programming%22+computer+cluster&hl=en&sa=X&ei=C_H8TqSRCobS4QSTmY2pCA&sqi=2&redir_esc=y#v=onepage&q=%22parallel%20programming%22%20computer%20cluster&f=false] {{웨이백|url=http://books.google.it/books?id=S7QU9RRLYIYC&pg=PA156&dq=%22parallel+programming%22+computer+cluster&hl=en&sa=X&ei=C_H8TqSRCobS4QSTmY2pCA&sqi=2&redir_esc=y#v=onepage&q=%22parallel%20programming%22%20computer%20cluster&f=false |date=20131216000535 }}</ref><ref>''Parallel Programming: For Multicore and Cluster Systems'' by Thomas Rauber, Gudula Rünger 2010 {{ISBN|3-642-04817-X}} pages 94–95 [http://books.google.it/books?id=wWogxOmA3wMC&pg=PA94&dq=%22parallel+programming+language%22+computer+cluster&hl=en&sa=X&ei=zfD8TpX_F5CQ4gSMvfXhBA&redir_esc=y#v=onepage&q=%22parallel%20programming%20language%22%20computer%20cluster&f=false] {{웨이백|url=http://books.google.it/books?id=wWogxOmA3wMC&pg=PA94&dq=%22parallel+programming+language%22+computer+cluster&hl=en&sa=X&ei=zfD8TpX_F5CQ4gSMvfXhBA&redir_esc=y#v=onepage&q=%22parallel%20programming%20language%22%20computer%20cluster&f=false |date=20131215235723 }}</ref>

== 같이 보기 ==
{{위키공용|Computer cluster}}
; 개념
* [[고성능 컴퓨팅]]
* [[그리드 컴퓨팅]]
* [[분산 컴퓨팅]]
* [[클라우드 컴퓨팅]]
* [[대칭형 다중 처리]]
* [[단일 시스템 이미지]]
; 컴퓨터 팜
* [[서버 팜]]
* [[렌더 팜]]
* [[컴파일 팜]]

== 각주 ==
{{각주}}

{{컴퓨터 과학}}
{{병렬 컴퓨팅}}

{{전거 통제}}

[[분류:클러스터 컴퓨팅| ]]
[[분류:병렬 컴퓨팅]]
[[분류:분산 컴퓨팅]]
[[분류:정보기술 용어]]
[[분류:장애 허용 컴퓨터 시스템]]