독일에 위치한 켐니츠 기술 대학교에서 기술자들이 대규모 리눅스 클러스터에서 작업하고 있다
**컴퓨터 클러스터**(영어: computer cluster)는 여러 대의 컴퓨터들이 연결되어 하나의 시스템처럼 동작하는 컴퓨터들의 집합을 말한다. 클러스터의 구성 요소들은 일반적으로 고속의 근거리 통신망으로 연결된다. 서버로 사용되는 노드에는 각각의 운영 체제가 실행된다. 컴퓨터 클러스터는 저렴한 마이크로프로세서와 고속의 네트워크, 그리고 고성능 분산 컴퓨팅용 소프트웨어들의 조합 결과로 태어났다. 클러스터는 일반적으로 단일 컴퓨터보다 더 뛰어난 성능과 안정성을 제공하며, 비슷한 성능과 안정성을 제공하는 단일 컴퓨터보다 비용 면에서 훨씬 더 효율적이다. 따라서 열 개 안팎의 중소 규모의 클러스터부터 수천 개로 이루어진 대형 슈퍼컴퓨터에 이르기까지 널리 사용되고 있다.

원리
--

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

컴퓨터 클러스터링 접근법은 일반적으로 시장에서 쉽게 가용한 제품들을 고속의 근거리 통신망으로 연결한다. 컴퓨팅 노드들을 "클러스터 미들웨어"라는 소프트웨어 계층에서 관리된다. 이 소프트웨어 계층은 노드들의 상부층에 위치하여 사용자들이 단일 시스템 이미지 개념으로 하나의 커다란 컴퓨팅 단위로 처리할 수 있도록 한다. 중앙 집중적인 관리 접근법은 노드들을 잘 조화된 공유 서버들로 만들어 준다. 이 방식은 많은 노드들을 사용하는 점대점이나 그리드 컴퓨팅과는 다르며 분산 컴퓨팅의 특성으로 차이점이 있다. 컴퓨터 클러스터는 간단히 두 개의 개인용 컴퓨터를 연결하는 두 노드 시스템일 수도 있고 수천 대를 연결한 매우 빠른 슈퍼컴퓨터일 수도 있다. 기본적인 클러스터 구성 방법은 전통적인 슈퍼컴퓨터를 비용 면에서 효율적인 제품으로 대체하기 위해 몇 개의 개인용 컴퓨터들을 이용하여 만든 베오울프(beowulf) 방식이다. 초창기 133개의 노드로 구성된 Stone Soupercomputer 프로젝트는 컴퓨터 클러스터 개념이 실현 가능하다는 것을 증명하였다. 비교적 낮은 비용으로 고성능을 이루기 위해 리눅스와 병렬 가상 머신 툴킷과 메시지 전달 인터페이스 라이브러리를 사용하였다. 비록 클러스터들은 적은 수의 개인용 컴퓨터들을 단순한 네트워크로 연결되었지만 높은 수준의 성능을 이룰 수 있었다. 현재 해마다 두 번 발표하는 TOP500에 등재된 슈퍼컴퓨터들 가운데 상당수의 시스템은 컴퓨터 클러스터들이다.

클러스터의 특징
--------

컴퓨터 클러스터는 웹 서비스와 같은 일반적인 비즈니스 목적에 대한 요구부터 많은 계산이 요구되는 과학 계산에 이르기까지 다양한 용도로 구성될 수 있다. 이 모든 것들은 높은 가용성을 제공한다는 것이 장점이다.

2대의 서버와 4대의 사용자 시스템으로 구성된 작업 부하 분산용 클러스터
* "작업 부하 분산"(Load-Balancing) 클러스터는 시스템의 전반적인 성능을 향상시키기 위해 계산 부하량을 여러 노드에서 분담하여 병렬 처리하도록 구성 하는 방식이다. 웹서버 클러스터의 예를 들면, 각기 다른 종류의 요구들을 각기 다른 노드에서 처리하도록 할당함으로써 전반적인 응답시간을 최소화 할 수 있다. 그렇지만 애플리케이션에 따라 작업 부하를 분산하는 방법은 크게 다를 수 있다. 단순히 라운드 로빈 방식을 사용하는 웹 서버와 과학 계산을 하는데 사용되는 클러스터 시스템과의 방식은 다르다.

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

설계 및 구성
-------

클러스터를 설계하는데 있어서 중요한 문제 중의 하나는 어떻게 각각의 노드들을 밀접하게 연결을 할 것인가이다. 처리할 하나의 컴퓨터 일(job)은 노드들 간에 빈번하게 통신을 해야 한다. 이것은 독립된 네트워크를 사용하여 동일한 아키텍처, 동일 기종의 노드들이 밀도있게 설치되어야 한다는 말이다. 

전형적인 베오울프 구성베오울프 시스템은 주(Master) 서버와 종속(Slave) 서버들로 구성되어 있다. 주 서버는 컴퓨터의 일들을 나누고 관리하며 종속 서버는 일을 처리하고 계산을 하는 서버들이다. 애플리케이션 프로그램은 주 서버와 통신을 할 뿐 종속 서버라고 불리는 계산 노드들과는 통신을 하지 않는다. 일반적으로 주 서버는 두 개의 네트워크 인터페이스를 가지고 있다. 하나는 종속 서버와의 통신을 위한 내부 네트워크이고 다른 하나는 외부 통신을 위한 범용 네트워크이다. 종속 서버는 일반적으로 자체의 운영 체제와 메모리 그리고 저장장치를 가지고 있다. 그러나 내부용 네트워크는 대용량 공유 파일 서버와 연결될 수도 있다. 컴퓨터 클러스터는 전통적으로 동일 운영 체제 위에 물리적으로 분리된 컴퓨터들의 집합이라고 생각한다.

통신 서비스에서의 활용
------------

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

클러스터의 구성 요소
-----------

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

데이터 공유 및 통신
-----------

### 데이터 공유

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

### 메시지 전달 통신

가장 폭넓게 사용되는 2 가지 통신 방법은 MPI(메시지 전달 인터페이스)와 PVM(병렬 가상 머신)이다. PVM은 오크리지 국립 연구소에서 1989년도에 MPI가 사용되기 전에 개발되었다. PVM은 반드시 각각의 클러스터 노드에 설치되어야 하며 노드를 "병렬 가상 머신"으로 규정하는 소프트웨어 라이브러리의 집합을 제공한다. PVM은 메시지 전달과 테스크 그리고 자원 관리 및 오류 알림을 위한 실시간 환경을 제공한다. PVM은 C, C++ 또는 포트란 등의 언어로 작성된 사용자 프로그램에서 사용된다.
MPI는 1990년대 초에 40개 조직들의 토론에 의해 태어났다. 초기에는 ARPA 및 미국 국립과학재단(NSF)에 의해 주도 되었다. 아주 처음부터 새롭게 시작하는 것 대신에 MPI는 상용 시스템에서 사용되는 기능들 위에서 설계되었다. MPI 규격은 규격 보충으로 증가 되었으며 MPI는 일반적으로 TCP/IP와 소켓 연결을 사용한다. MPI는 지금 광범위하게 사용되는 통신 모델이며 C, 포트란, 파이썬과 같은 언어를 사용하여 병렬 프로그래밍을 구현한다. 따라서 PVM과는 다르게 MPI는 MPICH와 Open MPI과 같은 시스템에서 구현된다.

클러스터 관리
-------

컴퓨터 클러스터를 사용하는데 있어서 가장 어려운 점중의 하나는 시스템을 관리하는 것이다. 만약 N개의 노드로 구성된 클러스터 시스템이 있다고 한다면 관리비용은 N개의 독립된 컴퓨터들을 관리하는 것과 비슷한 비용이 든다. 따라서 어떤 경우에는 공유 메모리 아키텍처가 관리비용 측면에서 클러스터 시스템 대비 유리한 측면이 있다. 상대적으로 관리의 편리성은 가상 머신이 많이 활용되는 이유중의 하나이다.

### 작업 스케줄링

커다란 여러 사용자 클러스터가 매우 방대한 양의 데이터를 접근할 때 작업 스케줄링을 하는 것은 매우 어렵다. 애플리케이션의 환경이 복잡한 이기종 CPU-코프로세서 클러스터의 경우에 각 작업(job)의 성능은 클러스터의 특성에 의존적이기 때문에 CPU 코어와 코프로세서 장치에 작업을 할당하는 것은 매우 어렵다. 이 분야는 현재 진행되고 있는 연구 분야이기도 하다.

### 노드 장애 관리

클러스터의 한 노드에서 장애가 발생했을 때 나머지의 모든 시스템이 계속해서 동작하도록 하기 위한 방법으로 "펜싱"(fencing)과 같은 전략이 사용된다. 펜싱은 노드가 오동작을 할 때 공유된 자원을 보호하고 그 노드를 격리시키는 동작이다. 두가지의 펜싱 방법이 있는데 하나는 노드 자체를 비활성화 시키는 것이고 다른 방법은 공유 디스크와 같은 공유 자원에 대한 접근을 차단하는 것이다. 노드의 격리는 장애로 의심되는 노드를 비활성화 하거나 전원을 끈다는 의미이다. 예를 들면, 전원 펜싱은 전원 제어기가 동작하지 않는 노드의 전원을 끄는 것이다.
자원 펜싱은 노드의 전원을 끄지 않고 자원에 대한 접근을 막는 것이다. 이것은 SCSI3에서 *persistent reservation fencing*이 있고, 파이버 채널 포트를 막기위한 파이버 채널 팬싱, global network block device (GNBD) 서버에 대한 접근을 막기위해 GNBD 팬싱이 있다.

소프트웨어 개발 및 관리
-------------

### 병렬 프로그래밍

웹 서버와 같이 작업 부하를 조절해주는 클러스터들은 많은 사용자들을 지원하기 위해 각 사용자의 요구를 특정 노드에 연결을 해주는 구조를 사용한다. 이 방법은 여러 노드들간 상호 협력하지 않고서 사용자가 공유 데이터에 빠르게 접근할 수 있게 작업 병렬화를 구현한다. 그렇지만 적은 수의 사용자가 아주 복잡한 계산을 수행해야 하는 컴퓨터 클러스터는 클러스터의 병렬 처리 능력이 발휘되어야 한다. 프로그램을 자동으로 병렬화해주는 것은 기술적으로 극복해야 할 과제이다. 그렇지만 각기 다른 프로세서들에서 프로그램을 동시에 수행함으로써 더 높은 수준의 병렬화를 수행하기 위해서 병렬 프로그래밍 모델이 사용되어야 한다.

참조
--

1. ↑  Bader, David; Robert Pennington (June 1996). "Cluster Computing: Applications". Georgia Institute of Technology College of Computing. 2007년 12월 21일에 원본 문서에서 보존된 문서. 2007년 7월 13일에 확인함.  다음 글자 무시됨: ‘Georgia Tech College of Computing’ (도움말); 더 이상 지원되지 않는 변수를 사용함 (도움말)
2. 1 2 3  *Network-Based Information Systems: First International Conference, NBIS 2007* ISBN 3-540-74572-6 page 375
3. ↑  William W. Hargrove, Forrest M. Hoffman and Thomas Sterling (2001년 8월 16일). "The Do-It-Yourself Supercomputer". 《Scientific American》 **265** (2). 72–79면. 2011년 10월 18일에 확인함.
4. ↑  William W. Hargrove and Forrest M. Hoffman (1999). "Cluster Computing: Linux Taken to the Extreme". 《Linux magazine》. 2011년 10월 18일에 원본 문서에서 보존된 문서. 2011년 10월 18일에 확인함.
5. ↑  *High Performance Linux Clusters* by Joseph D. Sloan 2004 ISBN 0-596-00570-9 page
6. 1 2 3  *High Performance Computing for Computational Science - VECPAR 2004* by Michel Daydé, Jack Dongarra 2005 ISBN 3-540-25424-2 pages 120-121
7. 1 2 3  *Distributed services with OpenAFS: for enterprise and education* by Franco Milicchio, Wolfgang Alexander Gehrke 2007, ISBN pages 339-341  Archived 2013년 12월 16일 - 웨이백 머신
8. 1 2 3  "*Grid and Cluster Computing* by Prabhu 2008 8120334280 pages 109-112". 2013년 12월 16일에 원본 문서에서 보존된 문서. 2013년 3월 7일에 확인함.
9. ↑  Gropp, William; Lusk, Ewing; Skjellum, Anthony (1996). "A High-Performance, Portable Implementation of the MPI Message Passing Interface". 《Parallel Computing》. CiteSeerX: 10.1.1.102.9485.
10. 1 2  *Computer Organization and Design* by David A. Patterson and John L. Hennessy 2011 ISBN 0-12-374750-3 pages 641-642
11. ↑  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
12. 1 2 3  Alan Robertson *Resource fencing using STONITH*. IBM Linux Research Center, 2010 [깨진 링크(과거 내용 찾기)]
13. ↑  *Sun Cluster environment: Sun Cluster 2.2* by Enrique Vargas, Joseph Bianco, David Deeths 2001 ISBN page 58
14. 1 2  *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  Archived 2013년 12월 16일 - 웨이백 머신
15. ↑  *Parallel Programming: For Multicore and Cluster Systems* by Thomas Rauber, Gudula Rünger 2010 ISBN 3-642-04817-X pages 94–95  Archived 2013년 12월 15일 - 웨이백 머신

| * v
* t
* e
컴퓨터 과학의 주요 분야 |
| --- |
| 수학적 기초 | 
* 수리논리학
* 집합론
* 정수론
* 그래프 이론
* 유형 이론
* 범주론
* 수치해석학
* 이산수학

 |
| 계산 이론 | 
* 오토마타 이론
* 계산 가능성 이론
* 계산 복잡도 이론
* 양자 계산 이론

 |
| 알고리즘 & 자료 구조 | 
* 알고리즘
* 알고리즘 설계
* 알고리즘 해석
* 자료 구조
* 계산기하학

 |
| 프로그래밍 언어 & 컴파일러 | 
* 구문 분석
* 컴파일러
* 인터프리터
* 프로그래밍 언어
* 구조적 프로그래밍
* 객체 지향 프로그래밍

 |
| 병렬 & 분산 시스템 | 
* 병렬 컴퓨팅
* 컴퓨터 클러스터
* 분산 컴퓨팅
* 그리드 컴퓨팅
* 클라우드 컴퓨팅
* IaaS
* PaaS
* SaaS

 |
| 소프트웨어 공학 | 
* 요구 분석
* 소프트웨어 설계
* 컴퓨터 프로그래밍
* 정형 기법
* 소프트웨어 테스트
* 소프트웨어 개발

 |
| 시스템 아키텍처 | 
* 컴퓨터 아키텍처
* 마이크로아키텍처
* 운영 체제

 |
| 통신 & 네트워크 | 
* 컴퓨터 오디오
* 라우팅
* 네트워크 토폴로지
* 암호학
* 차세대 통신망

 |
| 데이터베이스 | 
* 데이터 마이닝
* RDBMS
* SQL
* NoSQL
* 오라클 데이터베이스

 |
| 인공지능 | 
* 자동추론
* 전산언어학
* 컴퓨터 비전
* 진화 연산
* 기계 학습
* 자연 언어 처리
* 로봇학

 |
| 컴퓨터 그래픽 | 
* 시각화
* 영상 처리

 |
| 인간과 컴퓨터 상호 작용 | 
* 컴퓨터 접근성
* 사용자 인터페이스
* 착용 컴퓨터
* 유비쿼터스 컴퓨팅
* 가상현실

 |
| 계산과학 | 
* 인공생명
* 생물정보학
* 인지과학
* 계산화학
* 계산론적 신경과학
* 계산물리학
* 수치해석학
* 기호계산

 |
| 정보보호 | 
* 암호학
* 물리 보안
* 애플리케이션 보안
* 인터넷 보안
* 네트워크 보안
* 해킹
* 크래킹

 |

| * v
* t
* e
병렬 컴퓨팅 |
| --- |
| 일반 | 
* 클라우드 컴퓨팅
* 고성능 컴퓨팅
* 클러스터 컴퓨팅
* 분산 컴퓨팅
* 그리드 컴퓨팅

 |
| 병렬화 수준 | 
* 비트
* 명령어
* 데이터
* 테스크

 |
| 스레드 | 
* 슈퍼스레딩
* 하이퍼스레딩

 |
| 이론 | 
* 암달의 법칙
* 구스타프슨의 법칙
* 비용 효과
* 카프-플랫 척도
* 감속
* 스피드업

 |
| 구성 요소 | 
* 프로세스
* 스레드
* 파이버
* PRAM
* 명령어 윈도우

 |
| 조정 | 
* 멀티스레딩
* 메모리 일관성
* 캐시 일관성
* Barrier
* 동기화
* 애플리케이션 체크포인트

 |
| 프로그래밍 | 
* 모델(내재적 병렬성
* 외재적 병렬성
* 동시성)
* 플린의 분류학(SISD
* SIMD
* MISD
* MIMD)
* 스레드

 |
| 하드웨어 | 
* 다중 처리(대칭형
* 비대칭형)
* 메모리(NUMA
* COMA
* 분산
* 공유
* 분산 공유)
* SMT
* SMP
* MPP
* 슈퍼스칼라
* 벡터 프로세서
* 슈퍼컴퓨터
* 베어울프

 |
| API | 
* POSIX 스레드
* OpenMP
* PVM
* MPI
* UPC
* 스레딩 빌딩 블록
* Boost
* 전역 배열
* Charm++
* Cilk/실크 플러스
* Co-array Fortran
* OpenCL
* CUDA

 |
| 문제 | 
* 처치 곤란 병렬 문제
* 그랜드 챌린지 문제
* 소프트웨어 락아웃
* 확장성
* 경쟁 상태
* 교착 상태
* 라이브락
* 결정론적 알고리즘
* 병렬 감속

 |

|  |  |
| --- | --- |
| 전거 통제: 국가 위키데이터에서 편집하기 | 
* 독일

 |