컴퓨터 클러스터

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

원리

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

설계 및 구성

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

통신 서비스에서의 활용

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

데이터 공유

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, 포트란, Python과 같은 언어를 사용하여 병렬 프로그래밍을 구현한다. 따라서 PVM과는 다르게 MPI는 MPICH 와 Open MPI과 같은 시스템에서 구현된다.

클러스터 관리

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

작업 스케줄링

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

노드 장애 관리

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

병렬 프로그래밍

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