시작하며
데이터베이스를 공부하다 보면 '클러스터'라는 용어가 여러 맥락에서 다르게 사용되는 것을 발견했다. 특히 '클러스터링 인덱스'와 '데이터베이스 클러스터링'은 같은 '클러스터'라는 단어를 사용하지만 완전히 다른 개념이었다. 이 두 개념의 차이점을 명확히 이해해보자.
클러스터링 인덱스 (Clustered Index)
클러스터링 인덱스는 데이터의 물리적 저장 구조에 관한 개념이다. 이는 단순한 분류가 아니라 데이터가 실제로 저장되는 방식을 결정한다.
주요 특징:
- 테이블의 데이터 행들이 인덱스 키 값을 기준으로 물리적으로 정렬되어 저장된다.
- 하나의 테이블에는 단 하나의 클러스터링 인덱스만 가질 수 있다.
- 인덱스의 리프 페이지가 실제 데이터 페이지다.
- MySQL의 InnoDB 엔진에서는 기본키(Primary Key)가 자동으로 클러스터링 인덱스가 된다.
넌클러스터드 인덱스 (Non-Clustered Index)
클러스터링 인덱스와 비교해서 넌클러스터드 인덱스는 다음과 같은 차이가 있다.
주요 특징:
- 데이터와 별도로 존재하는 인덱스 구조다.
- 인덱스의 리프 노드는 실제 데이터가 아니라 데이터 위치를 가리키는 포인터다.
- 테이블에 여러 개를 생성할 수 있다.
- 데이터 접근 시 한 번 더 참조(룩업) 과정이 필요하다.
중요한 점:
- 클러스터드 인덱스가 있는 테이블에서는 넌클러스터드 인덱스의 리프 노드가 해당 로우의 클러스터드 인덱스 키 값을 포함한다.
- 클러스터드 인덱스가 없는 테이블(힙 테이블)에서는 넌클러스터드 인덱스의 리프 노드가 로우 식별자(RID)를 포함한다.
데이터베이스 클러스터링 (Database Clustering)
데이터베이스 클러스터링은 데이터 구조가 아닌 시스템 아키텍처에 관한 개념이다.
주요 특징:
- 여러 서버나 노드를 하나의 논리적 시스템처럼 작동하게 구성하는 기술이다.
- 주요 목적은 고가용성(High Availability), 부하 분산(Load Balancing), 확장성(Scalability)이다.
- 단일 장애점(Single Point of Failure)을 제거한다.
- 데이터 처리량과 저장 용량의 수평적 확장이 가능하다.
예시:
- Redis Cluster: 여러 Redis 노드가 함께 동작하여 마치 하나의 Redis 서버처럼 보이게 한다. 데이터는 여러 노드에 분산(샤딩)되어 저장된다.
- Oracle RAC, MariaDB Galera Cluster, PostgreSQL의 스트리밍 복제 등도 데이터베이스 클러스터링의 예다.
정리
두 개념 모두 "클러스터링"이라는 용어를 사용하지만 초점이 완전히 다르다:
- 클러스터링 인덱스: 데이터 구조화와 물리적 저장 방식에 초점
- 데이터베이스 클러스터링: 시스템 구성과 아키텍처에 초점
클러스터링 인덱스는 데이터를 특정 순서로 "구조화하여 저장"하는 것이고, 데이터베이스 클러스터링은 여러 서버를 "하나의 시스템처럼 동작"하게 하는 것이다. 둘 다 성능과 관련이 있지만, 접근 방식과 해결하려는 문제가 다르다.