데이터베이스 클러스터링
더 많은 작업
- Database Clustering; DB 클러스터링
- 여러 대의 서버를 하나의 데이터베이스 시스템처럼 묶어 가용성과 처리 성능을 높이는 기술. 디스크를 공유하는지에 따라 공유 디스크 방식과 무공유 방식으로 나뉜다
데이터베이스 서버 한 대로는 처리량에 한계가 있고, 그 서버가 멈추면 서비스 전체가 멈춘다. 데이터베이스 클러스터링은 여러 서버(노드)를 묶어 이 두 문제를 함께 다룬다. 목적은 크게 두 가지다.
- 고가용성: 노드 하나가 고장 나도 다른 노드가 서비스를 이어 간다.
- 확장성(성능): 여러 노드가 작업을 나눠 처리해 전체 처리량을 늘린다.
ADP 교재는 분산 데이터 저장 기술의 하나로 데이터베이스 클러스터를 다루며, 데이터를 저장하는 디스크를 노드끼리 공유하느냐에 따라 공유 디스크(Shared Disk) 방식과 무공유(Shared Nothing) 방식으로 나눈다.
| 구분 | 공유 디스크(Shared Disk) | 무공유(Shared Nothing) |
|---|---|---|
| 구조 | 모든 노드가 하나의 공유 저장 장치(SAN 등)에 있는 데이터 전체에 접근 | 노드마다 자기 메모리와 디스크를 따로 가지고, 데이터를 나눠(파티션) 맡음 |
| 데이터 접근 | 어느 노드든 모든 데이터를 읽고 쓸 수 있음 | 각 노드는 자기가 맡은 데이터만 직접 처리하고, 나머지는 다른 노드에 요청 |
| 노드 간 조정 | 같은 데이터 블록을 여러 노드가 캐시하므로 캐시 일관성과 잠금 조정이 필요하고, 이를 위한 고속 전용 네트워크(인터커넥트)가 필요 | 노드끼리 자원을 공유하지 않으므로 조정 부담이 적음. 여러 노드에 걸친 트랜잭션은 분산 트랜잭션 처리가 필요 |
| 장애 시 | 한 노드가 멈춰도 다른 노드가 같은 데이터에 접근할 수 있어 서비스가 이어짐 | 고장 난 노드가 맡은 데이터는 복제본이 없으면 쓸 수 없으므로, 보통 복제본을 다른 노드에 둠 |
| 확장성 | 노드를 늘려도 공유 디스크와 노드 간 조정이 병목이 될 수 있음 | 노드를 늘리는 만큼 용량과 처리량이 늘어나는 수평 확장(scale-out)에 유리 |
| 하드웨어 | 공유 저장 장치와 전용 인터커넥트가 필요해 비용이 큼 | 값싼 범용 서버로 구성 가능 |
| 대표 예 | Oracle RAC | MySQL NDB Cluster |
Oracle Real Application Clusters(RAC)는 여러 서버의 Oracle 인스턴스가 하나의 데이터베이스를 함께 여는 구조다. Oracle 문서는 RAC를 "shared everything" 데이터베이스라고 부르며, 데이터 파일, 컨트롤 파일, SPFILE, 리두 로그 파일이 모두 클러스터가 인식하는 공유 디스크에 있어야 한다고 설명한다. 인스턴스 사이에서는 캐시 퓨전(Cache Fusion)이 각 인스턴스의 버퍼 캐시를 자동으로 동기화하며, 노드끼리는 인터커넥트라는 전용 사설 네트워크로 통신한다. 클러스터 기반 소프트웨어로는 Oracle Clusterware를 쓴다.
MySQL 문서는 NDB Cluster를 "무공유(shared-nothing) 시스템에서 인메모리 데이터베이스를 클러스터링하는 기술"이라고 설명한다. 무공유 시스템에서는 각 구성 요소가 자기 메모리와 디스크를 가져야 하며, 네트워크 공유 폴더·네트워크 파일 시스템·SAN 같은 공유 저장 장치는 권장되지도 지원되지도 않는다. 단일 장애점이 없도록 설계되었고, 노드는 세 종류다.
- 관리 노드: 다른 노드에 구성 정보를 주고, 노드를 시작·중지하며 백업을 수행한다.
- 데이터 노드: 클러스터 데이터를 저장한다. 데이터를 조각(fragment)으로 나누고 복제본을 다른 데이터 노드에 둔다.
- SQL 노드: NDB 스토리지 엔진을 쓰는 MySQL 서버로, 애플리케이션의 SQL 요청을 받는다.
클러스터를 운영하는 방식은 노드가 동시에 일하는지에 따라서도 나뉜다.
| 구분 | 액티브-액티브(Active-Active) | 액티브-스탠바이(Active-Standby) |
|---|---|---|
| 동작 | 모든 노드가 동시에 요청을 처리 | 한 노드만 요청을 처리하고, 대기 노드는 장애가 나면 넘겨받음(failover) |
| 자원 활용 | 모든 노드를 쓰므로 효율적이고 처리량이 늘어남 | 평소 대기 노드의 자원이 놀게 됨 |
| 장애 시 | 남은 노드가 계속 처리하므로 중단이 짧음. 다만 남은 노드에 부하가 몰림 | 대기 노드가 서비스를 넘겨받는 동안 잠시 중단될 수 있음 |
| 복잡도 | 노드 간 데이터 일관성과 잠금 조정이 필요해 복잡 | 구조가 단순 |
| 예 | 공유 디스크 클러스터(예: Oracle RAC) | 공유 저장 장치를 두고 장애 시 대기 서버가 저장 장치를 넘겨받는 HA 구성 |
대기 노드를 늘 켜 두고 바로 넘겨받는 방식을 핫 스탠바이(hot standby), 장애가 난 뒤에야 대기 시스템을 기동하는 방식을 콜드 스탠바이(cold standby)라고 부르기도 한다.
- 공유 디스크: 노드 고장에 강하고 모든 노드가 같은 데이터를 보므로 애플리케이션 변경이 적다. 그러나 공유 저장 장치 자체가 고장 나면 전체가 멈출 수 있어 저장 장치도 이중화해야 하고, 노드가 늘수록 캐시 일관성 유지 비용이 커진다.
- 무공유: 노드를 늘리면 성능이 거의 그만큼 늘고 범용 서버로 만들 수 있다. 그러나 데이터를 어떻게 나눌지(파티셔닝·샤딩) 설계해야 하고, 여러 노드에 걸친 조인과 트랜잭션은 비용이 크며, 고장 대비를 위해 복제본을 관리해야 한다.
- 공유 디스크와 무공유 방식의 정의와 대표 예(공유 디스크: Oracle RAC, 무공유: MySQL NDB Cluster)를 짝지을 수 있어야 한다.
- 무공유 방식은 노드마다 독립된 메모리와 디스크를 가지며 수평 확장에 유리하고, 공유 디스크 방식은 노드 장애에 강하지만 공유 디스크와 노드 간 조정이 병목이 될 수 있다는 장단점을 구분한다.
- 공유 디스크 방식에서 노드 간 캐시 일관성을 위한 고속 인터커넥트가 필요하다는 점, 무공유 방식에서 노드 장애에 대비한 복제본이 필요하다는 점이 보기로 나온다.
- 액티브-액티브와 액티브-스탠바이의 차이(동시 처리 여부, 자원 활용률, 장애 전환)를 구분한다.