목차
클러스터형 시스템
클러스터형 시스템은 여러 대의 독립적인 컴퓨터를 네트워크를 통해 연결하여 하나의 시스템처럼 작동하게 만든 컴퓨팅 아키텍처입니다.
이러한 시스템은 고성능, 고가용성, 확장성을 제공하는 데 목적을 두고 있습니다.
클러스터형 시스템의 특징
1.
고가용성 : 하나의 노드가 실패하더라도 다른 노드가 그 역할을 대체할 수 있어 시스템 전체의 가동 중단 시간을 최소화할 수 있습니다.
2.
부하 분산 : 작업을 여러 노드에 분산시켜 전체적인 시스템의 효율성과 성능을 향상시킬 수 있습니다.
위 두 부분이 클러스터형 시스템의 핵심입니다. 추가로 확장성처럼 노드를 쉽게 추가할 수 있는 특징도 있지만, 개인적으로는 고가용성과 부하 분산이 클러스터형 시스템의 핵심 기술이라고 생각합니다.
예시 : 구글의 검색 엔진 클러스터
구글은 전 세계에 분산된 수천 대의 서버를 클러스터로 구성하여 사용자의 검색 요청을 처리합니다. 사용자가 검색 쿼리를 입력하면, 이 정보는 여러 서버에 걸쳐 있는 인덱스와 데이터베이스를 통해 빠르게 처리됩니다. 이 클러스터는 부하 분산, 데이터 복제 및 실시간 데이터 처리 기능을 통해 높은 가용성과 빠른 응답 시간을 제공합니다. 이를 통해 구글 검색 엔진은 전 세계 어디서나 높은 성능으로 서비스를 제공할 수 있습니다.
NUMA
NUMA(Non-Uniform Memory Access)는 멀티프로세서 시스템에서 각 프로세서가 로컬 메모리에는 빠르게 접근할 수 있는 반면, 다른 프로세서의 메모리인 원격 메모리에 접근할 때는 더 느린 속도를 갖는 메모리 아키텍처입니다.
제가 개인적으로 NUMA와 클러스터형 시스템이 매우 비슷하다고 생각해서 같은 페이지에 구성했습니다.
이를 활용하는 예시는 조금 어려울 수 있지만, 최대한 비슷한 예를 들어보겠습니다.
NUMA 활용 예시 : 게임 서버
게임 서버는 전 세계의 여러 지역을 대표하는 맵 데이터를 관리하고, 각 맵은 서로 다른 메모리 영역에 저장될 수 있습니다. 이를 NUMA 아키텍처로 설계한다고 가정해봅시다.
1.
로컬 메모리 접근
•
서버에 여러 프로세서가 있고, 각 프로세서는 자신이 담당하는 특정 맵의 데이터를 로컬 메모리에 저장합니다. 예를 들어, 프로세서 B는 '맵 B'의 데이터를 관리합니다.
•
플레이어가 '맵 B'에 있는 동안, 프로세서 B는 자신의 로컬 메모리에서 데이터를 빠르게 접근하여 처리할 수 있어 성능이 향상됩니다.
2.
원격 메모리 접근
•
플레이어가 '맵 B'에서 활동하다가 갑작스럽게 전체 게임 세계에 영향을 미치는 이벤트(예: 전체 서버 점수 업데이트, 글로벌 이벤트 발생 등)에 대한 정보를 요청하는 경우가 있습니다. 이 정보는 '메모리 A'에 저장되어 있습니다.
•
이때, 프로세서 B는 자신의 로컬 메모리가 아닌 '메모리 A'에 저장된 데이터에 접근해야 하며, 이는 원격 메모리 접근에 해당합니다. 이 과정에서 데이터 접근 시간이 길어져 성능이 저하될 수 있습니다.
DLM
DLM(Distributed Lock Manager)은 다중 컴퓨터 시스템에서 데이터에 대한 동시 접근을 조정하기 위해 사용되는 소프트웨어입니다.
즉, DLM은 클러스터 시스템 내의 노드들 사이에서 자원을 안전하고 효율적으로 공유할 수 있도록하는 소프트웨어입니다.
DLM의 주요 기능
1.
락 : DLM은 다양한 종류의 락(읽기 락, 쓰기 락 등)을 관리하며, 각 노드가 자원에 대해 적절한 권한을 가지고 접근할 수 있도록 조정합니다.
읽기 락 : 자원을 읽을 수 있지만 수정은 할 수 없습니다. 여러 노드가 동시에 읽기 락을 얻을 수 있습니다.
쓰기 락 : 자원을 수정할 수 있는 권한을 제공합니다. 쓰기 락이 활성화되어 있는 동안 다른 노드는 해당 자원을 읽거나 쓸 수 없습니다.
2.
동시성 제어 : 여러 노드가 동시에 같은 자원을 사용하고자 할 때, DLM은 동시성 문제를 해결하고 데이터의 일관성을 유지하기 위해 작업 순서를 조정합니다.
동시성 제어 예시
1.
쓰기 락 요청 : 노드 A가 특정 자원에 대해 쓰기 락을 요청합니다. 이 자원은 현재 다른 노드들에 의해 읽고 있을 수 있습니다.
2.
대기 상태 진입: DLM은 쓰기 락 요청을 받고, 해당 자원에 이미 활성화된 읽기 락들을 확인합니다. 노드 A의 쓰기 락 요청은 이 읽기 락들이 모두 해제될 때까지 대기 상태로 전환됩니다.
3.
읽기 락 해제 감지 : DLM은 활성화된 읽기 락들이 해제되는 것을 감시합니다. 모든 읽기 락이 해제되면, DLM은 대기 중인 쓰기 락 요청을 활성화할 준비를 합니다.
4.
쓰기 락 부여 : 모든 읽기 락이 해제되면, DLM은 노드 A에게 쓰기 락을 부여합니다. 이 시점에서 노드 A는 해당 자원을 수정할 수 있는 권한을 갖게 됩니다.
5.
자원 수정 : 노드 A는 이제 자원을 자유롭게 수정할 수 있습니다. 수정 과정에서는 다른 노드들이 이 자원에 접근하여 읽거나 쓰는 것이 불가능합니다.
6.
쓰기 락 해제 : 작업이 완료되면, 노드 A는 쓰기 락을 해제하고 DLM에 이를 알립니다. 이후 다른 노드들이 다시 자원에 접근할 수 있게 됩니다.
3.
교착 상태 감지 및 해결 : 두 노드 이상이 서로의 자원을 기다리며 무한 대기에 빠지는 교착 상태를 감지하고, 이를 해결하기 위한 메커니즘을 제공합니다.