  7일 24시간 지속적인 서비스를 제공해야 하는 인터넷 관련 시스템들이 증가하면서 Windows 2000에서 제공하는 클러스터 서비스를 이용한 고가용성 구축에 많은 관심이 늘고 있다. 하지만 의외로 주변에서 Windows 2000 서버 클러스터과 관련해 잘못된 오해를 가지고 있는 경우가 의외고 많다.
그럼 Windows 2000 클러스터 서비스(MSCS)에 대한 어떤 오해가 있는지 알아보자.
1. Active/Active 구현을 이용하면 응용 프로그램이 양 노드에서 로드 분산을 통한 병렬 처리가 가능하다.
아니다. 필자도 그게 가능했으면 좋겠다. ^^;
가끔씩 다음과 같은 질문을 받곤 한다. "SQL Server를 Node A와 Node B에서 동시에 운영하기 위해서 MSCS를 Active/Active로 구현 했는데요. 외장 하드 디스크에 데이터베이스를 생성하고 이 데이터베이스를 양 노드에서 동작하는 SQL Server가 동시에 접근할 수 있도록 설정해서 양 노드의 SQL Server가 사용자의 로드를 분산해서 병렬 처리하게 할 수 있나요?" 이런 질문을 한다는 것은 MSCS가 Shared-Nothing 클러스터라는 사실과 가상 서버의 동작 원리에 대한 정확한 이해가 부족하기 때문이다.
 그림 1. 2-노드 서버 클러스터와 가상 서버 |
그럼 먼저 Shared-Nothing 클러스터에 대해 알아보자. Shared-Nothing 클러스터는 어떠한 하드웨어나 소프트웨어 리소스도 양 노드에서 공유하지 않는 방식이다. <그림 1>에서 얼핏 보기에는 두 노드가 외장 저장 장치에 있는 외장 하드 디스크를 서로 공유하여 동시에 접근할 수 있는 것처럼 보이지만 내부 동작 원리는 물리적인 외장 하드 디스크별로 소유권을 가지고 있는 노드만이 접근할 수 있다. 따라서 특정 외장 하드 디스크에 소유권이 없는 다른 노드는 그 외장 하드 디스크에 접근할 수 없다. 따라서 이 Shared-Nothing 클러스터에서는 어떠한 리소스도 공유하는 것이 없는 방식으로 MSCS가 바로 이 Shared-Nothing 클러스터 방식으로 동작한다.
그럼 MSCS의 동작을 이해 하는데 중요한 가상 서버가 무엇인지 알아보자. 일반적으로 Windows 2000 운영체제를 설치한 시스템을 서버라고 부른다. 서버라는 의미는 컴퓨터 시스템이 가지고 있는 리소스를 클라이언트들이 접근해서 사용할 수 있다는 의미이다.
근데 왜 클러스터를 구성하는 컴퓨터 시스템은 서버라고 부르지 않고 노드라고 정의할까? 이유는 서버 클러스터 동작 원리와 깊은 관계가 있다. 사용자들은 서버 클러스터 환경하에서 노드의 컴퓨터 이름을 사용하지 않고 노드 안에서 동작하는 가상 서버의 컴퓨터 이름을 사용하게 된다. 노드는 직접적으로 사용자에게 리소스를 제공하는 서버의 역할을 수행하지 않고 가상 서버가 정상적으로 동작 할 수 있는 환경을 제공하는 Host OS 역할을 담당하게 되는 것이다. 가상 서버는 노드안에서 동작하는 Guest OS가 되며 이 가상 서버 안에서 실제 사용자에게 서비스를 제공하는 응용 프로그램이 동작하게 된다.
 그림 2. 실제 시스템과 그룹과의 연계성 |
MSCS에서 가상 서버를 만드는 과정은 하나의 서버를 구매하고 운영체제를 설치하는 과정과 유사하다.
일반 서버에 SQL Server를 운영할 계획이라 가정해 보자. 가장 먼저 해야 할 것은 적절한 성능을 갖춘 시스템을 구매하는 것이고 그 다음에는 Windows 2000 운영 체제를 시스템에 설치할 것이다. Windows 2000의 설치가 완료되고 네트워크가 정상적으로 설정되었다면 그 후 SQL Serve를 설치하게 된다.
그럼 가상 서버를 만드는 과정과 비교해 보자. SQL Server를 운영할 가상 서버를 만들어야 한다면 가장 먼저 해야 할 일은 가상 서버가 동작하는데 필요한 리소스를 관리할 그룹을 생성해야 한다. 그리고 SQL Server가 사용하는 데이터베이스 파일을 저장할 외장 하드 디스크를 실제 디스크 리소스를 이용해서 추가한다. 그룹을 만들고 실제 디스크 리소스를 포함함으로써 <그림 2>의 1번 과정처럼 하나의 시스템을 구매한 것이 된다.
시스템을 구매하면 그 다음에 해야 할 일은 운영 체제를 설치하는 것이고 이 과정을 MSCS에서는 <그림 2>의 2번 과정처럼 그룹에 IP 주소 리소스와 네트워크 이름 리소스를 추가해서 설정함으로써 대신할 수 있다. 여기까지 진행 하게 되면 마치 시스템에 운영체제만 설치된 것과 같은 상태가 되고 이 후 SQL Server를 설치하여 <그림 2>의 3번 과정처럼 관련 리소스를 추가하면 원하는 가상 시스템을 구축한 것이다.
그럼 여기서 모든 끝난 것일까? 아니다. 그룹을 온라인을 시켜야 한다. 이는 마치 모든 서버에 필요한 모든 응용 프로그램과 설정을 마친 후 부팅하지 않은 것과 같은 것이다. 부팅되지 않은 서버를 클라이언트가 무슨 수로 접근 할 수 있겠는가!!!
이렇게 일련의 과정이 끝나고 가상 서버가 운영되면 사용자들은 가상 서버가 동작하고 있는 노드의 컴퓨터 이름이 아닌 가상 서버의 컴퓨터 이름으로 접근하게 되는 것이다.
따라서 위의 내용들을 종합하면 MSCS는 Shared-Nothing 방식이기 때문에 양 노드에서 동작하는 가상 서버의 SQL Server가 동시에 같은 외장 하드 디스크에 접근할 수 없다. <그림 1>의 각 가상 서버에 추가된 물리적 하드 디스크 리소스를 보면 각기 다른 하드 디스크를 접근하도록 설정되어 있는 것을 볼 수 있을 것이다. 따라서 절대로 Active/Active 클러스터는 하나의 가상 서버를 생성해서 양 노드에서 동시에 실행 시키는 구성이 아니라 완전히 독립적으로 동작하는 두개의 가상 서버를 각 노드에서 운영하는 방식이다. 그렇기 때문에 질문과 같은 구성은 불가능하다.
2. Windows 2000 클러스터 서비스는 응용 프로그램에 대해 완벽한 내결함성을 제공한다.
아니다. MSCS에서 지원하는 것은 응용 프로그램에 대한 완벽한 내결함성이 아니라 빠른 복구다.
그럼, 이 말뜻을 이해하기 위해 먼저 내결함성(Fault Tolerance)이 무엇인지에 대해 알아보자. 대표적인 내결함성을 제공하는 것은 하드 디스크 RAID다. 두개의 하드 디스크를 이용해서 RAID 1을 구성했을 경우에, 둘 중에 하나의 하드 디스크에 오류가 발생해도 전혀 서비스에 지장 없이 지속적인 서비스가 가능하다. 만약, MSCS도 사용자에게 서비스를 제공하는 응용 프로그램에 완벽한 내결함성을 제공한다면 Node A에서 동작하다가 Node A에 오류가 생겨 Node B로 장애 조치가 발생 했을 때 전혀 서비스 중지가 없어야 한다. 하지만 불행히도 장애 조치가 발생하면 짧게는 수십초에서 몇분까지 가상 서버가 재시작하는 동안에 서비스는 중지된다.
이 때문에 몇몇 독자들은 MSCS에 실망을 느낄지도 모르겠다. 하지만 이 한가지만 상상해 보라. 만약 당신이 인터넷 전자상거래의 SQL 서버를 관리하는 관리자인데, 전자 상거래에 필요한 모든 데이터가 저장되어 있는 SQL 서버를 MSCS로 구축하지 않고 성능 좋은 한대의 시스템에서 운영하다가 이 서버가 갑자기 내부 과열로 완전히 시스템이 망가졌고, 불행히도 다른 백업 시스템도 없을 경우에 당신은 어떤 조치를 취하겠는가? 적절한 시스템을 수배하고 Windows 2000을 설치하고 SQL 서버 설치하고 데이터베이스를 복원하고 등등등..… 아마 당신은 다른 직장을 구해야 할 처지에 빠질 것이다. ㅠㅠ
하지만 MSCS는 특정 노드에 오류가 발생하면 자동으로 오류를 인지하여 오류가 발생한 노드에서 동작하는 가상 서버를 정상적으로 동작하는 노드에서 재시작 시킴으로써 최소한의 복구 시간만으로 서비스를 재개할 수 있다. 이것을 바로 MSCS가 고가용성을 위해 제공하는 주요 기능인 장애 조치(Failover)이다.
3. Windows 2000 클러스터 서비스를 구축하면 가용성 100%를 구현할 수 있다.
아니다. MSCS만으로는 응용 프로그램의 서비스 중단을 일으키는 단일 지점 오류(Single point of failure)들을 막기에 역부족이다. 사용자에게 서비스를 제공하는 응용 프로그램의 가용성을 100%로 유지하는 작업은 에베레스트와 같은 높은 산을 오르는 것처럼 시스템 엔지니어들에게는 멀고도 힘든 여정이다. 오죽하면 가용성 100%를 제공하는 Compaq의 High-End 서버의 이름을 Nonstop Himalaya라고 했을까. ^^
MSCS를 구축한 서버 클러스터의 고가용성을 위협하는 단일 지점 오류에는 3가지를 들 수 있다.
첫번째, 노드 대 클라이언트 네트워크 패킷을 전송하는 혼합 네트워크가 단일 지점 오류로 동작할 수 있다. 네트워크에 오류가 발생하면 MSCS가 동작중이어도 사용자의 요구 사항을 받아 들일 수 없어 서비스를 제공할 수 없다.
두번째, 노드와 외장 저장 장치를 연결하는 미디어다. 일반적으로 SCSI나 Fibre Channel을 이용한 SAN을 구성하여 각 노드와 외장 저장 장치를 연결한다. 만약 이 미디어에 문제가 생겨 노드와 외장 저장 장치의 접속이 실패했을 경우에는 MSCS가 완전히 정지하게 된다.
왜냐하면 가상 서버에서 동작하는 응용 프로그램들은 필요한 모든 데이터를 가상 서버에 포함된 외장 하드 디스크에 저장하기 때문에 외장 저장 장치에 데이터에 접근을 할 수 없으면 어느 노드에서 가상 서버가 시작되더라도 결국에는 동작할 수 없게 된다.
세번째, 외장 저장 장치 자체다. 바로 앞에서 설명했듯이 외장 저장 장치 자체에 오류가 발생해도 역시 가상 서버에서 동작하는 응용 프로그램들이 필요로 하는 데이터를 접근할 수 없기 때문에 결국 MSCS가 정지하게 된다.
따라서 MSCS만으로 고가용성을 유지하기는 힘들다. 위에서 제시한 단일 지점 오류들에 대한 충분한 대책도 고가용성 설계 단계에서 같이 고려해야 가용성 100%라는 높은 산을 정복할 수 있다.
MSCS를 이용한 고가용성 설계시에는 정확한 동작 원리를 이해하고 설계를 해야지만 차후에 잘못된 설계로 인한 중복 투자와 문제 발생의 소지를 없앨 수 있다. 잘못된 설계로 인해 멀고도 힘든 고가용성의 높은 산을 오른 후 다음과 같은 명언을 남기고 쓸쓸히 사라진 시스템 엔지니어들의 전철을 밟지 말기 바라며 본 컬럼을 마치겠다.
명언이 뭐냐구?.. 바로 이말이다.. "이 산이 아닌가벼" ㅋㅋㅋ ^^
글, 지란지교소프트 최철원 이사, MCT, TechNet Advisor Group |