본문 바로가기

computer/Server

클러스터링(Clustering) 이란...


클러스터란?

클러스터는 여러개의 시스템이 하나의 거대한 시스템으로 보이게 만드는 기술이다. 이렇게 하는 기술에는 여러 가지가 있기 때문에 각 기술의 특징을 잘 이해하는 것이 클러스터링 기술을 잘 활용할 수 있는 방법이다.

컴퓨터 클러스터링은 Digital VAX 플랫폼을 시초로 1980년대부터 다양한 형태로 만들어지기 시작했으며, 이러한 클러스터는 디스크 공간 같은 하드웨어 자원을 공유할 수 있었고, 여러 사용자에게 컴퓨팅 자원을 제공할 수 있었다.


클러스터의 구성요소

클러스터는 노드와 관리자로 구성되어 있다. 노드는 프로세싱 자원을 제공하는 시스템이고, 클러스터 관리자는 노드를 서로 연결하여 단일 시스템처럼 보이게 만드는 로직을 제공한다.

클러스터노드

클러스터 노드는 클러스터의 실질적인 작업을 처리하는 것을 말한다. 일반적으로 클러스터 노드는 클러스터에 속하도록 구성해야 한다. 클러스터의 역할과 업무에 따라 해당 소프트웨어는 독특하게 제작된 것일 수도 있고, 일반적인 소프트웨어 일 수도 있다. 역할에 따른 특정 소프트웨어라면 공학 계산을 위한 각 노드에 맞는 프로그램일 수도 있으며, 일반적인 소프트웨어는 로드밸런싱을 위한 클러스터라면 아파치 같은 소프트웨어를 들 수 있을 것이다.

클러스터관리자

리눅스의 커널이 모든 프로세서에 대한 스케쥴과 자원관리를 하는 것처럼 클러스터 관리자 역시 이런 관리자의 역할로써 각 노드에 대한 자원분배 및 관리를 할 수 있는 기능을 가지고 있다. 기본적으로 하나의 관리자가 필요하지만 때에 따라서는 클러스터 노드가 클러스터 관리자 기능을 하기도 하며, 대규모 환경의 경우에는 여러대의 클러스터 관리자가 있기도 하다.

 

클러스터의 종류

클러스트의 정의는 매우 광범위하다. 리눅스에서는 LVS(Linux Virtual Server) 라는 이름으로 불리기도 한다. 또한 앞에서 설명한 여러 가지들도 하나의 클러스터 기술이다. 그 만큼 클러스터는 여러 가지 기능을 하고 있으며, 시스템관리자의 고민을 해결해 주고 있다. 클러스터의 주요 목적은 CPU자원을 공유하거나, 여러 컴퓨터간의 부하 조정, 가용성이 높은 시스템을 구축, 주 시스템이 다운 되었을 때를 대비한 Fail-Over 기능을 제공하는 것이다.


공유 프로세싱 : HPC(High Performance Computing)

일반적으로 리눅스 클러스터링이라고 불리는 클러스터링이다. beowulf 프로젝트로도 유명하다. beowulf는 여러 시스템의 프로세싱 능력을 조합하여 대용량의 프로세싱 능력을 갖는 하나의 시스템을 제공한다.

이것은 원래 과학용 시스템이나 CPU 위주의 용도로 설계된 것인데, 이 시스템에서는 API에 따라 특별히 작성된 프로그램만 자신의 작업을 여러 시스템 사이에 분배할 수 있다. 즉, 프로그밍을 별도로 해야할 경우가 많아진다는 것이다.

beowulf에 관한 자료는 http://www.beowulf.org/ 에 가면 얻을 수 있다.

[리눅스원 HFC 와 아발론 HFC]

   

부하조정 : Load Balancing

최근에 대규모 웹사이트 구축에 필수적으로 사용되는 기술로 여러대의 웹서버 노드를 두고 중앙의 관리툴에서 부하를 분산하게 해주는 기술이다. 이 기술의 특징은 노드 간 통신이 필요 없다는 것이다. 부하 조정을 이용하면 각 노드는 자신의 용량이나 로드에 맞게 요청을 처리할 수 있기도 하고, 클러스터 관리자에서 할당한 양의 프로세스를 처리할 수도 있다.


Fail-Over

Fail-Over는 부하조정과 비슷하다. 하지만 조금 틀린 것이 있는데 부하조정의 경우에는 모든 노드가 한꺼번에 동작을 하는 것이고, Fail-OVer의 경우에는 평소엔 동작을 하지 않고 Primary 서버가 문제가 발생했을 시에 백업서버로써 가동을 하는 것이다. 부하조정을 응용하면 부하조정과 Fail-Over 기능을 동시에 하게 할 수가 있다.


높은 가용성

아무리 시스템 관리자가 뛰어난 실력을 지니고, 부지런하다고 해도, 서버는 기계이기 때문에 간혹 문제를 발생하기도 한다. 어떤 경우에는 관리자도 어떻게 할 수 없는 상황이 발생하기도 한다. 이런 경우에 최대한 가용성을 높이기 위한 방법이 바로 클러스터링이다. 이런 높은 가용성을 만들기 위해 위의 Fail-Over 기술을 사용한다.
가용성은 업타임(작동가능시간)의 백분율로 계산된다. 일반 서버의 경우 99%의 업타임을 갖지만, 높은 가용성을 목적으로 하는 시스템은 최대 99.99%의 업타임을 가질 수 있다. 이 시간은 일년을 기준으로 했을 때 52분 미만이면 되는 수치이다. 52분 다운이면 어머어마한 시간 인 것 같지만 실제로 이정도의 가용성을 보이는 서버는 굉장히 중요하고 손이 많이간 서버일 것이다.


클러스터 작동 방법

클러스터 관리자는 클러스터 시스템에서 가장 중요한 역할을 하는 것이다. 실제로 여기서 다룰 클러스터링은 부하분산 즉 로드밸런싱에 관한 부분이다. 이것은 관리자의 부하 분산 방식에 따라 그 효과는 천차만별로 달라진다. 부하 분산 작동 방식에는 직접포워딩, IP터널링, NAT의 세가지 방식이 있다. 이 세가지에 대해서 자세히 알아보도록 하겠다.

 

직접포워딩 (Direct Routing)


    1. 사용자가 서버 클러스터에서 제공하는 서비스에 접근할때, 가상 IP 주소(가상 서버의 IP 주소)로 향하는 요구 패킷이 부하분산서버로 간다.
    2. 부하분산서버(LinuxDirector)에서 패킷의 목적지 주소와 포트 번호를 검사한다.
    3. 내용이 가상 서버 서비스와 일치하면 스케쥴링 알고리즘에 따라 클러스터에서 실제 서버를 선택하고, 접속을 기록하는 해쉬 테이블에 새로운 접속을 추가한다.
    4. 부하분산서버에서 선택한 서버로 직접 패킷을 전송한다.
    5. 들어오는 패킷이 이러한 접속에 해당하고 해쉬 테이블에서 선택한 서버를 찾을 수 있으면 패킷은 다시 서버로 직접 전송된다.
    6. 서버에서 전송(포워딩)된 패킷을 받으면, 서버는 패킷에서 알리아스 인터페이스나 지역 소켓의 주소를 찾아서 요청을 처리한다.
    7. 결과를 사용자에게 직접 전송한다.
    8. 접속이 해제되거나 시간을 초과하면, 해쉬 테이블에서 연결 기록을 제거한다.

부하분산 서버는 단순히 데이터 프레임의 MAC 주소만 선택한 서버로 바꾸며 이를 다시 LAN에 재전송한다. 이런 이유 때문에 부하분산 서버와 각 서버가 단일한 물리적 세그먼트안에서 연결되어야한다. 부하분산 서버를 통해 전달될 필요가 없기 때문에 빠르고 오버헤드가 적다.


IP 터널링

IP 터널링 (IP encapsulation)은 IP 데이터그램안에 IP 데이터그램을 넣는 기술로서, 어떤 IP 주소를 향하는 데이터그램을 감싸 다른 IP 주소로 재지향할 수 있다. IP encapsulation은 현재 엑스트라넷, 모빌-IP, IP-멀티캐스트, tunnled 호스트나 네트웍 등에 일반적으로 사용되고 있다.


    1. 사용자가 서버 클러스터에서 제공하는 서비스에 접근할때, 가상 IP 주소(가상 서버의 IP 주소)로 향하는 요구 패킷이 부하분산서버로 간다.
    2. 부하분산서버에서 패킷의 목적지 주소와 포트 번호를 검사한다.
    3. 내용이 가상 서버 서비스와 일치하면 스케쥴링 알고리즘에 따라 클러스터에서 실제 서버를 선택한다.
    4. 접속을 기록하는 해쉬 테이블에 새로운 접속을 추가한다.
    5. 부하분산서버에서 IP 데이터그램안에 패킷을 감싸 넣고(encapsulate) 실제 서버로 전송한다.
    6. 들어오는 패킷이 이러한 접속에 해당하고 해쉬 테이블에서 선택한 서버를 찾을 수 있으면 패킷을 감싸넣어 선택한 서버로 전송을 할 것이다.
    7. 서버에서 감싸넣어진 패킷을 받으면 패킷을 다시 풀고 요청을 처리한다음 최종적으로 실제 서버의 라우팅 테이블에 따라 사용자에게 직접 결과를 돌려준다.
    8. 접속이 해제되거나 시간을 초과하면, 해쉬 테이블에서 연결 기록을 제거한다.

IP터널링을 이용하는 경우, 부하분산서버는 단지 들어오는 요청에 대하여 각기 다른 실제 서버로 할당만을 할 뿐이고 실제 서버가 사용자에게 직접 응답을 보낸다. 그래서 부하분산서버에서 더 많은 요청를 처리할 수 있으며 100개 이상의 실제 서버를 다룰 수 있다. 또한 부하분산서버자체가 시스템의 병목지점이 되는 현상도 없앨 수 있다. 이렇게 IP 터널링을 이용하면 부하분산서버에서 사용할 수 있는 서버 노드의 수를 크게 늘릴 수 있다. 설사 부하분산서버가 100Mbps full-duplex(전복조) 네트웍 어댑터를 가졌어도 가상 서버의 최대 처리량은 1Gbps에 달할 수 있다.

IP 터널링의 이러한 특성을 이용하면 아주 높은 성능의 가상 서버를 구축할 수 있으며, 특히 가상 프록시 서버에 적합하다. 프록시 서버에서 요청을 받는 경우, 인터넷에 직접 연결하여 개체를 가져오고 그것을 바로 사용자에게 보내줄 수 있다. 그러나, 모든 서버에서 "IP 터널링"(IP Encapsulation)을 지원해야한다.

NAT (Network address translation)

IPv4에서는 IP주소가 부족하고 보안상에 몇가지 문제가 있어서, 점점 더 많은 네트웍에서 인터넷에서 사용할 수 없는 사설 IP(10.0.0.0/255.0.0.0, 172.16.0.0/255.240.0.0 , 192.168.0.0/255.255.0.0)를 사용하고 있다. 사설망에 있는 호스트에서 인터넷에 접속을 하거나 인터넷망에서 사설망의 호스트에 접속하기 위해서 NAT(network address translation)기능이 필요하다.

NAT는 특정한 IP 주소를 한 그룹에서 다른 그룹으로 매핑하는 기능이다. 주소를 N-to-N 형태로 매핑하는 경우를 정적 NAT라 하고 M-to-N(M>N)를 동적 NAT라고 한다. 네트웍 주소 포트 변환은 기본 NAT의 확장기능으로 여러 가지 네트웍 주소와 TCP/UDP 포트를 단일의 네트웍 주소와 TCP/UDP 포트로 변환한다. N-to-1 매핑이라고 하며 리눅스에서 IP 마스커레이딩도 이러한 방식을 이용한다.

리눅스에서 NAT를 통한 가상 서버는 네트웍 주소 포트 변환을 통해 수행한다. 리눅스 IP 마스커레이딩 코드를 이용하며, 스티븐 클락(Steven Clarke)의 포트 포워딩 코드를 재사용하고 있다.


    1. 사용자가 서버 클러스터에서 제공하는 서비스에 접근할 때, 가상 IP 주소(부하분산서버의 외부 IP 주소)로 향하는 요구 패킷이 부하분산서버로 간다.
    2. 부하분산서버에서 패킷의 목적지 주소와 포트 번호를 검사한다.
    3. 내용이 가상 서버 규칙 테이블에 따른 가상 서버 서비스와 일치하면 스케쥴링 알고리즘에 따라 클러스터에서 실제 서버를 선택한다.
    4. 접속이 이루어진 것을 기록하는 해쉬 테이블에 새로운 접속을 추가한다.
    5. 패킷의 목적지 주소와 포트가 선택한 서버에 맞게 변경되고 패킷을 해당 서버로 전송한다.
    6. 들어오는 패킷이 이러한 접속에 해당하고 해쉬 테이블에서 선택한 서버를 찾을 수 있으면 패킷을 재작성하여 선택한 서버로 전송을 할 것이다. 응답패킷이 돌아오면, 부하분산서버는 패킷의 출발 주소와 포트를 가상 서비스로 변경한다.
    7. 접속이 해제되거나 시간을 초과하면, 해쉬 테이블에서 연결 기록을 제거한다.

NAT를 이용하면 실제서버가 TCP/IP를 지원만 하면 모두 가능하고, 실제서버를 완벽하게 숨길 수 있어 보안성을 향상 시킬 수 있으나, 확장성에 제한이 있다.일반적인 PC서버 기준으로 했을 때 서버노드가 20개 이상으로 증가할 경우 부하분산서버에서 병목이 생길 수 있다. 왜냐하면 패킷이 들어오고 나갈때마다 부하분산서버에서 패킷을 변경해야하기 때문이다. 다음과 같이 가정해보자. TCP 패킷의 평균 길이가 536Bytes 이다. 패킷 변경에 의한 지연시간은 60us(펜티엄 프로세서 기준이며 이보다 더 뛰어난 프로세서를 쓰면 지연시간이 감소될 것이다)이고 부하분한서버의 최대 처리량이 8.93MBytes/s이다. 실제 서버의 평균 처리량이 400Kbytes/s 일때 부하분산서버는 22개의 실제 서버를 스케쥴링할 수 있다.

 

클러스터 부하조정 스케쥴링 알고리즘

무지 어려운 말이다. 스케쥴링 알고리즘. 스케쥴이라는 말은 모두 잘 알고 있을 것이다. 시간표도 하나의 스케쥴링 이니까. 실제로 클러스터 관리자의 가장 중요한 역할이다. 아무리 많은 클러스터 노드가 있다고 해도 관리자가 실제로 일을 배분하는데 뇌물을 먹고 한 노드에게만 준다던지, 아니면 아예 주지 않는 다면 그건 무용지물 인 것이다. 이렇게 일을 주는 방법에도 여러 가지가 있다 이번에는 그런 스케쥴링 알고리즘에 대해서 설명하겠다. 실제로 클러스터 관리자는 뇌물을 먹지 않으니 걱정 안해도 된다.

 

Round-Robin Scheduling (라운드 로빈 스케쥴링)

말 그대로 라운드 로빈 방식이며, 서버의 상황이나 네트웍 상황, 모든 상황을 무시한채 단순하게 요청을 전달해주는 형태이다. 실제로 서버의 사양이 모두 동일하고, 같은 네트웍 상이라면 가장 단순하고 효율적일 수도 있다.

 

Weighted Round-Robin Scheduling (가중치기반 라운드 로빈 스케쥴링)

가중치란 것은 어떤 특정한 것에 가중치를 둔다는 말이다. 서버에서도 특정서버의 스펙이 굉장히 뛰어나다던지 아니면 다른 서버보다 기타 환경이 나아 더 많은 요청을 전달하고 싶을 때 해당 서버에 가중치를 주어 더 많은 요청을 처리할 수 있도록 하는 방식이다.

가중치가 있는 라운드 로빈 스케쥴링을 사용하면 실제 서버에서 네트웍 접속을 셀 필요가 없고 동적 스케쥴링 알고리즘보다 스케쥴링의 과부하가 적으므로 더 많은 실제 서버를 운영할 수  있다. 그러나 요청에 대한 부하가 매우 많을 경우 실제 서버사이에 동적인 부하 불균형 상태가 생길 수 있다.

 

Least-Connection Scheduling (최소 접속 스케쥴링)

최소 접속 스케쥴링은 가장 접속이 적은 서버로 요청을 직접 연결하는 방식을 말한다. 각 서버에서 동적으로 실제 접속한 숫자를 세어야하므로 동적인 스케쥴링 알고리즘중의 하나이다. 비슷한 성능의 서버로 구성된 가상 서버는 아주 큰 요구가 한 서버로만 집중되지 않기 때문에, 접속부하가 매우 큰 경우에도 아주 효과적으로 분산을 한다.

가장 빠른 서버에서 더 많은 네트웍 접속을 처리할 수 있다. 그러므로 다양한 처리 용량을 지닌 서버로 구성했을 경우에도 훌륭하게 작동 한다는 것을 한눈에 알 수 있을 것이다. 그렇지만 실제로는 TCP의 TIME_WAIT 상태 때문에 아주 좋은 성능을 낼 수는 없다. TCP의 TIME_WAIT는 보통 2분이다. 그런데 접속자가 아주 많은 웹 사이트는 2분동안에 몇천개의 접속을 처리해야 할 경우가 있다. 서버 A는 서버 B보다 처리용량이 두배일 경우 서버 A는 수천개의 요청을 처리하고 TCP의 TIME_WAIT 상황에 직면하게 된다. 그렇지만 서버 B는 몇천개의 요청이 처리되기만을 기다리게 된다. 그래서 최소 접속 스케쥴링을 이용할 경우 다양한 처리용량을 지닌 서버로 구성 되었을 경우 부하분산이 효율적으로 되지 못할 수 있는 것이다.

 

Weighted Least-Connection Scheduling (가중치 기반 최소 접속 스케쥴링)

가중치 기반 최소 접속 스케쥴링은 최소 접속 스케쥴링의 한 부분으로서 각각의 실제 서버에 성능 가중치를 부여할 수 있다. 언제라도 가중치가 높은 서버에서 더 많은 요청을 받을 수 있다. 가상 서버의 관리자는 각각의 실제 서버에 가중치를 부여할 수 있다. 가중치의 비율인 실제 접속자수에 따라 네트웍 접속이 할당된다. 기본 가중치는 1이다.

 

공유 데이터 저장장치 및 시스템

클러스터의 기본적인 개념과 기타 필요한 지식을 알아보았다. 그리고 이제 마지막으로 공유 데이터 저장장치에 대해서 알아보겠다. 많은 서버가 있으면 모든 서버에 데이터가 동일한 데이터이어야 할 필요가 있다. 실제로 고객이 접속할 때마다 각 노드의 자료가 달라 다른 페이지가 보이거나 접속이 되었다 안되었다 한다면 그것은 클러스터링을 했다는 의미가 없을 것이다.

하지만 일반적인 생각으로 데이터를 모두 동일하게 한다는 것은 때마다 데이터를 백업해서 옮겨놓는 방식이 있는데 일방적인 자료 제공이라면 상관없지만 고객의 자료 업로드가 필요한 경우는 막막하게 된다. 이런 문제점을 해결하기 위해 많은 방식들이 논의되어 왔는데 이런 기술들을 소개하겠다.


NFS (Network File System)

NFS는 UNIX에서는 널리 알려진 시스템으로 내부적으로 다소 불안하고 여러 시스템으로 데이터를 복제하는 방법이 제공되지 않는다는 단점이 있다. 따라서 NFS를 사용할 경우 기본으로 지정된 파일서버가 죽을 경우  모든 클러스터링 서버가 죽을 수 있다는 단점이 있다.


AFS (Andrew File System)

http://www.angelfire.com/hi/plutonic/afs-faq.html

AFS는 피츠버그에 위치한 Carnegie Mellon 대학의 Andrew Project에서 개발된 상업용 소프트웨어이다. NFS와 많은 공통점을 가지고 있지만, NFS의 최대 단점인 인증 부분을 Keberos 프로토콜을 기반으로 안정된 메카니즘을 제공한다.


Coda

http://www.coda.cs.cmu.edu/

Coda 파일 시스템은 현재 리눅스 커널과 함께 제공되는 Open Source 분산 파일 시스템이다. Coda는 AFS와 비슷한 시스템을 유지하면서도 단속적인 연산, 서버 측 복제, 부분적인 네트워크 실패시 연속 연산, 그리고 확장성, 대역폭 조정 기능을 제공하여 몇 가지 가용성 문제를 해결했다.


Intermezzo

http://www.inter-mezzo.org/

이 파일 시스템도 역시 Open Source 분산 파일 시스템이며, 고유 파일 시스템의 상위 계층에 위치하여 사용자가 고유 파일 시스템을 사용하여 데이터를 저장할 수 있게 해준다. Intermezzo는 Coda보다 최신 컴퓨팅 환경과 장비의 능력을 더 잘 이해하며, Coda와 마찬가지로 높은 가용성, 대규모 복제, 분리된 네트워크에 중점을 둔다. 하지만 아직은 베타 개발 단계에 있다는 점을 명심해야 할 것이다.


GFS

http://www.sistina.com/gfs/

리눅스를 위한 최고의 분산 파일 시스템 솔루션 중 하나로써 이 솔루션은 파일 시스템 소프트웨어뿐 아니라 하드웨어 지원을 요구한다. 그리고 클라이언트의 장애로 인한 저널링 및 복구기능을 지원한다.


RAID

http://www.terms.co.kr/RAID.htm

하나의 디스크 장치가 여러대에 연결되어 있다면 공유되어있는 네트웍 뿐만이 아니라 물리적인 디스크 자체에도 많은 부하가 걸리게 되어 있다. 이런 점을 보완하기 위한 장치로써 여러개의 디스크를 하나의 디스크처럼 만들어주는 장치로, 디스크 장애로 인한 복구, 빠른 액세스, 백업등을 지원한다. 레벨에는 0,1,2,3,4,5 등이 있으며, RAID 5 가 가장 많이 쓰인다.

RAID 각 레벨에 관한 설명 보기


참고자료

 

글쓴이 : 정순권 님 ( fuga@hostinglove.com )


클러스터링은 어떻게 보면 병렬 처리 기술의 일부에 속한다. 다른 기술과의 차이점은 자원을 공유하거나 복제하는 수준에 달려 있다. 가장 단순한 구조는 한 마더보드에 여러개의 프로세서를 유지하고 다른 기술을 공유하는 것이다. 가장 높은 수준은 분산프로세싱이 여러개의 컴퓨터를 사용하되, 시스템이 단일 서버로 취급되지 않는 것이다. 다음에 병렬프로세싱에 관련된 비슷한 기술들이 있다.

  • SMP
  • NUMA
  • MPP
  • 분산프로세싱

 

SMP(Symmetric Multiprocessing) : 대칭형 다중처리

SMP는 운영체계와 메모리를 공유하는 여러 프로세서가 프로그램을 수행하는 것을 말한다. SMP에서는 프로세서가 메모리와 입출력 버스 및 데이터 path를 공유하며, 또한 하나의 운영체계가 모든 프로세서를 관리한다. 보통 2개부터 32개의 프로세서로 이루어지며, 어떤 시스템은 64개까지 프로세서를 공유한다.

SMP시스템은 보통 MPP시스템에 비하여 병렬 프로그래밍이 훨씬 쉽고, 프로세서간 작업을 분산(workload balance)시키는 것은 훨씬 용이하지만, 확장성은 MPP에 비하여 취약하다. 또한 많은 사용자가 동시에 데이터베이스에 접근하여 일을 처리하는 OLTP 작업에서도 강점을 보인다.

SMP 컴퓨터에서 운영체계 자체는 애플리케이션을 구성하는 개별적인 프로세스를 사용 가능한 CPU간에 분배한다. Windows NT는 가중치가 매우 높은 스레드를 기반으로 하고, 리눅스는 가중치가 매우 적으므로, 두가지 모두 SMP하드웨어에 아주 적합하다.

2~4개의 프로세서를 가지는 SMP 시스템은 구축하기 쉬우나 그 이상은 힘든데, 이것은  SMP 시스템자체가 단일의 I/O와 메모리를 공유해야 하기 때문이다. 이것이 바로 시스템의 병목현상을 일으키는 주 원인이기 때문에 오히려 이 이상의 CPU확장은 성능 저하의 원인이 될 수도 있다. 실제로 2CPU SMP 시스템과 4CPU SMP 시스템의 성능차이는 크지 않다.

위와 같이 설명되어지는 것이 일반적인 서적이나 매뉴얼에 나와 있는 설명이다. 실제로 이런 설명을 이해할 수 있는 사람은 몇 명되지 않을 것이다. 그럼 SMP는 무엇인가? 하나의 일을 여럿이서 나누어서 하는 것이다. 그러나 일을 주는 사람과 일을 받아 나가는 사람은 한 사람밖에 없는 것이다. 그러므로 중간에 일을 실제로 하는 사람이 많으면 일을 주고 받는 사람이 지치게 될 수밖에 없을 것이다.

* OLTP : OLTP[오엘티피]는 일반적으로 은행이나, 항공사, 우편주문, 슈퍼마켓, 제조업체 등을 포함한 많은 산업체에서 데이터 입력이나 거래조회 등을 위한 트랜잭션 지향의 업무을 쉽게 관리해주는 프로그램이다.

[대칭형 다중처리]

 

NUMA (Non-Uniform Memory Access) : 비균등 메모리 억세스

SMP System에서 가장 큰 문제점은 I/O와 메모리 엑세스의 병목 현상이었다. 즉 일주는 사람과 다 된 일을 받아 가는 사람이 너무 바빠서 중간에 실제적으로 많이 확보된 인부를 활용하지 못하는 상황이다. 하지만 이런 경우 각각의 인부에게 한사람씩 더 주어 자신의 일을 미리 미리 받고 자신이 하고 난 일을 임시로 보관해 둘 수 있는 장소가 있다면 이런 문제는 해결 될 수 있을 것이다.

바로 이런 SMP의 단점을 해결한 것이 바로 NUMA 기술이다. NUMA는 몇 개의 마이크로프로세서들 간에 중간 단계의 공유 메모리를 추가함으로써, 모든 데이터 액세스가 주버스 상에서 움직이지 않아도 되도록 하는 것이다.

NUMA는 하나의 상자 속에 있는 클러스터로 생각할 수 있다. 클러스터는 대체로 마더보드 상의 하나의 공유 메모리 (L3 캐시라고도 부른다)로 향하는 로컬버스에, 서로 연결된 네 개의 마이크로프로세서들로 구성된다. 이 유니트는 모든 클러스터들을 서로 연결하는 공용 버스 내에서 SMP를 구성하기 위하여 비슷한 유니트에 추가될 수 있다. 이러한 시스템은 대체로 16~256개의 마이크로프로세서를 가지고 있다. SMP 시스템에서 실행되는 응용프로그램에게는, 모든 개별 프로세서 메모리들이 하나의 단일 메모리인 것처럼 비쳐진다.

프로세서가 어떤 메모리 주소에 있는 데이터를 찾을 때, 그것은 마이크로프로세서 그 자체에 붙어 있는 L1 캐시를 먼저 찾은 다음, 근처에 있는 다소 큰 L2 캐시 을 찾는다. 그 다음에는 다른 마이크로프로세서 인근에 있는 원격 메모리의 데이터를 찾기 전에, NUMA 구성에 의해 제공되는 제3의 캐시를 찾는다. NUMA에게는, 이러한 클러스터들 각각이 서로 연결된 네트웍 내에 있는 하나의 노드들 처럼 비쳐진다. NUMA는 모든 노드들 상에 있는 데이터를 계층 체계로 유지한다.


MPP (Massive Parallel Processing)

MPP 시스템은 보통 하나의 CPU, 하나의 Memory, 하나의 OS로 구성된 여러 Node들의 집합으로 구성되어 있다. MPP 시스템은 단일 OS하에서 운영되지 않으므로 Hardware Coherency를 사용할 수 없으며 Message-passing방법을 사용한 Software Coherency를 사용한다. Software Coherency는 Hardware Coherency에 비해 수백 내지는 수천배의 지연시간(latency)을 허용하며, 따라서 수백 내지 수천개의 프로세서를 사용하여 시스템을 구성하기가 쉽다. 이러한 지연시간으로 인해 MPP 시스템상에서 높은 Performance를 얻을 수 있는 어플리케이션은 각 노드간에 교환되는 데이터를 최소화 할 수 있도록 잘 분리되는 것이라야 한다.

MPP 시스템은 Hardware Coherency나 Shared Memory를 구현해야 할 필요가 없기 때문에 시스템 개발자에게는 구현하기 쉬운 장점이 있으나 어플리케이션 개발자는 Coherency구현을 위한 Message Passing 및, 퍼포먼스를 위한 어플리케이션 분산등을 고려하여 작성해야 하는 어려움이있다. 이러한 이유로 인해 데이터 공유가 필수적이고 빠른 응답시간을 요구하는 OLTP 어플리케이션들은 MPP 시스템에 적합하지 않으며, 빠른 응답시간을 요구하지 않고 어플리케이션의 각 시스템에서 데이터 요구가 분리되어 있는 의사결정 지원 시스템(DSS : Decision Support System), VOD(Video On Demand) 시스템등에 MPP시스템이 유용하다.

대규모의 병렬 시스템은 주로 계산 위주의 고급 연산에 사용되고, 현재 세계에서 가장 빠른 컴퓨터는 수학적 모델을 통해 핵 폭발을 시뮬레이터하는 MPP 시스템이다.

[MPP]


 비 교 항 목

    S M P

    M P P

    N U M A

 구  조

시스템 버스와 같은 인터커넥션을 통해 프로세스, 메모리, I/O 등의 시스템 자원을 균등하게 공유하는 구조

개별 프로세스, 메모리, I/O 등의 시스템 자원을 가지는 노드들을 독점된 상호 연결로 결합한 구성

복수개의 CPU 보드를 연결하여 통합된 멀티 프로세서 시스템을 만드는 구조

 운영 형태

하나의 OS 커널이 존재
표준 개방형 OS 지원

각 노드별로 OS 커널 존재
표준 개방형 OS 지원 안함.

표준의 개방형 OS 지원

InterConnection

멀티 프로세싱, 멀티 쓰레드 , 메모리 공유 프로그래밍 / 통신 방식

데이터 병렬 처리 또는 메시지 패싱 프로그래밍 방식

글로벌 메모리 공유 방식

데이터 전달방식

공유 메모리에 직접 접근

명시적인 메시지 전달

공유 메모리 접근 및 로컬 캐쉬 메모리 사용

원격데이터 접근

 자동

주소 변환, 메시지 전달

 패킷 전송

 프로그래밍

프로그래밍 용이
표준화된 개발 툴이 다양

프로그래밍이 어려움.
불완전한 병렬 SW 제공

프로그래밍이 용이

 확장성

업무량 증가 또는 추가시 단위 SMP 내에서 CPU, 메모리 등을 증설 가능

일정 규모까지 시스템 노드 내에서 증설 가능 또는 시스템 노드를 증가

일정 규모까지 시스템 노드 내에서 증설 가능 또는 시스템 노드 증가

 안정성

HW 이중화 및 이중 운영 기능
장애 발생의 자동 감지 및 장애 부분 절단 가능
디스크 미러링

HW 이중화 및 상호 감시
장애의 자동 감지 및 자동 절환
디스크 미러링


 Application

다양한 유틸리티 지원

극히 제한됨


 가  격

 저, 중가

 고가

 중, 고가

RAID 0

RAID-0는 전형적인 Parity가 없는 striped disk drive들의 non-redundant group으로 정의된다. RAID-0 array는 보통 I/O intensive application을 위한 large stripes로 구성되는데, 종종 data intensive application의 single-user를 위한 synchronized spindle drive들을 이용한 sector-stripe으로 구성할 수도있다.

RAID-0는 redundancy를 지원하지 않기 때문에 만일 Array내의 하나의 drive가 장애를 일으키면, Array 전체가 장애를 일으키게 된다. 그러나 RAID-0는 모든 Array type중 가장 빠르고 data저장 효율이 높다.


RAID 1

Disk Mirroring이라 불리는 RAID-1은 data를 중복 저장하도록 디스크드라이브들을 쌍으로 구성한 것으로 서버쪽으로는 하나의 드라이브로 인식된다. RAID-1은 striping은 사용되지 않는 반면, 여러개의 RAID-1 array들이 서로 striped되어 mirrored drives pair들로 구성된 하나의 대용량 array로 구성 시킬 수 있으며, 이를 "Dual-level array" 또는 RAID-10이라 부른다.

Write는 Mirrored Pair인 두개의 Drive에 동시에 저장되어 각 Drive가 동일한 정보를 저장하게 된다. 그러나 각 Drive는 Simultaneous Read Operation을 수행할 수 있다. 따라서, 각 Drive의 Read Performance는 두배로 되고 Write Performance는 변화가 없게 된다. RAID-1은 Redundant를 가진 Array중에서는 최고의 Performance를 보이며, 특히 Multi-user Environment에서 유용하다.


RAID 3

RAID-3는 RAID-2처럼 Sector-striped data를 Drive Group에 걸쳐 저장하지만, Group내의 하나의 Drive는 Parity Information만을 저장하도록 지정된다. RAID-3는 Error Detection을 위해서는 각 sector에 embbed된 ECC에 의존한다.

Hard Drive가 장애를 일으킬 경우, Data 복구는 남아 있는 Drive상에 기록된 Information의 Exclusive OR(XOR)연산을 통하여 이루어진다.

Records는 전형적으로 모든 Drive에 걸쳐 있기 때문에, Data Intensive 환경에 적합하다. 각 I/O은 Array내의 모든 Drive들을 액세스하기 때문에, RAID-3 Array는 I/O을 Overlap시킬 수가 없고 따라서, RAID-3는 long record의 Single-user, Single-tasking 환경에 적합하다. 그러므로 Short record에서의 성능 저하를 피하기 위해서는, RAID-3는 Synchronized-spindle drives가 필요하다.


RAID 5

종종 Rotating Parity Array라 불리는 RAID-5는 RAID-4에서 하나의 전용Parity Drive를 설정함으로써, Parity Update가 한 Drive에서 이루어지므로 생기는 Write Bottleneck을 피하기 위하여 만들어진 RAID Array이다.

RAID-5는 RAID-4처럼 large-stripe이 사용되어 multiple I/O operation이 overlap되도록 하고 있다. 그러나, RAID-4와는 다르게, 각 Drive들이 일련의 서로 다른 stripes들에 대한 parity를 돌아가면서 저장하게 된다.

따라서, 전용 parity Drive가 없기 때문에 모든 drive들이 데이타를 저장할 수 있고, Read operation이 모든 drive에 걸쳐 overlap될 수 있다.Write Operation은 전형적으로 single data drive를 액세스하며 그 record에 대한 parity drive를 액세스한다.

따라서, RAID-4와는 달리 서로 다른 records들이 해당 parity들을 서로 다른 drive들에 저장하기 때문에, Write Operation도 overlap이 가능하다. RAID-5는 RAID-1이 모든 데이타를 redundant copy하는 것과는 달리, parity information만을 저장하기 때문에 RAID-1에 비하여 Storage Efficiency를 높일 수 있다. 결과적으로 RAID-5 Array는 어떤 수의 Drive도 연결이 가능하고, 각 Drive들은 Parity information 저장 부분만을 제외하고는 모두 data storage로 활용될 수 있다. 즉, RAID-5는 RAID-1보다 저장 장치를 효율적으로 극대화 시킬 수 있다. 그러나 performance에서는 손실을 감수 하여야 한다.

Data가 RAID-5 Array에 쓰여질 때, Parity information 또한 Update되어야 하는데, 이는 Write Operation에 의하여 어떤 data bit들이 바뀌었는지를 찾아내어 이에 해당하는 parity bits들을 바꿈으로써 Update된다.

이는 overwritten될 old data를 먼저 읽고, 이것이 새로 overwrite될 새로운 데이타와 XOR 연산을 함으로써 수행된다. 이것은 바뀐 모든 bit의 position에서 1이 되는 bit mask를 만들게 되고, 이 bit mask가 parity drive로부터 읽어 들인 old parity information과 XOR연산을 수행한다. 이 결과, Parity information내에 있는 해당 bit를 변화 시킨다. 이렇게 하여 Update된 Parity는 Parity Drive에 write back된다.

그러므로, write-request하는 모든 Application에 대하여 RAID-5 Array는 두개의 Read, 두개의 Write와 두개의 XOR operation을 수행하여야만이 원래의 write가 완료된다.

RAID-1에서의 redundant data에 비하여, Parity를 저장하는 RAID-5는 위와 같이 보다 많은 연산을 행하게 되며, write operation 중에 parity information을 재생하는데 추가적으로 시간이 소요된다. 이러한 이유 때문에 RAID-5는 RAID-1에 비하여 write performance가 약 3/5~1/3 수준밖에 되지 않는다. 이 때문에, RAID-5 Array는 결코 Software적으로 사용되지 않으며, 아울러 디지탈 비디오 캡쳐와 같이 write performance가 중요한 Application에는 사용되지 않는다.


 

Level 0

Level 1

Level 5

Level 0 + 1

장점

  • DISK I/O가 분산이 된다.
  • RAID level 중 가장 빠르다.
  • DATA 저장 효율이 높다.
  • 안정적이다.
  • redundant해서 Fault Tolerance를 보장한다.
  • simultaneous-read가 되기 때문에 기존의 방법에 2배정도 읽기 효과를 준다.
  • Write-bottleneck 현상을 줄일 수 있다.
  • 안정적이다.
  • disk I/O를 줄일 수 있다.
  • hot-swap, hot-fix, hot-spare, hot-plug등이 가능하다.
  • Level 0과 Level 1의 장점을 가진다.

단점

  • Fault Tolerance가 보장되지 않는다.
  • 안정적이지 못하다.
  • redundant가 없다.
  • 비용이 비싸다.
  • Striping이 되지를 않기 때문에 disk I/O bottleneck 현상에 대해 효율적이지 못하다.
  • level 1에 비해서 읽기 성능이 떨어진다.
  • level 0에 비해 저장효율이 떨어진다.
  • 비용이 비싸다.
  • disk 저장 효율성이 그리 높지 않다.