클러스터
클러스터는 여럿을 하나로 묶어 부르는 말입니다. 서버 여러 대의 묶음을 클러스터라고 부릅니다. 데이터베이스 여러 개의 묶음도 클러스터라고 부릅니다. 그래서 어느 자리의 이야기인지 모른 채 이 말만 들으면 엉뚱한 그림을 떠올리게 됩니다.
쉽고 빠른 이해
클러스터는 여럿을 하나로 묶어 부르는 말입니다. 무엇을 묶었는지는 쓰는 자리마다 다릅니다. 쿠버네티스에서는 여러 대의 서버를 묶은 것입니다. PostgreSQL 에서는 한 서버가 관리하는 데이터베이스들을 묶은 것입니다.
왜 헷갈리나 — 낱말 하나가 자리마다 다른 것을 가리키는데, 클러스터라는 말만으로는 어느 쪽인지 안 정해집니다.
어떻게 가르나
- 어느 시스템·문서 이야기인지 맥락 이름부터 봅니다
- 그 맥락에서 클러스터가 무엇을 묶은 것인지 찾습니다
- 그 뜻으로 나머지 문장을 읽습니다
- 이름만 같고 아예 다른 걸 가리키는 경우도 있습니다. 그때는 문서를 따로 봐야 합니다
대가 — 맥락을 안 가르면 다른 자리의 뜻으로 읽게 됩니다. 엉뚱한 그림을 떠올리는 것이 그 결과입니다. 그래서 클러스터라는 말을 맥락 이름 없이 단독으로 쓰지 않습니다. "쿠버네티스 클러스터"·"PostgreSQL 클러스터"처럼 어느 자리의 클러스터인지 붙여 씁니다.
상세
여러 정의가 공유하는 뼈대는 하나입니다. 낱개 여럿을 하나의 단위로 묶어 다룬다는 것입니다. 갈리는 자리는 묶이는 낱개가 무엇인가입니다.
오케스트레이션(쿠버네티스처럼 여러 대의 머신을 하나처럼 다루도록 조율하는 것)에서 묶이는 것은 머신입니다. PostgreSQL 에서 묶이는 것은 데이터베이스입니다. 파일시스템에서 묶이는 것은 섹터(디스크가 데이터를 읽고 쓰는 최소 단위)입니다. 머신러닝에서 묶이는 것은 데이터 점입니다. 맥락마다 무엇을 근거로 그렇게 정의하는지는 아래 맥락별 뜻이 나눠 담습니다.
네 맥락의 문서들 중 어느 쪽이 원래 뜻인지는 아무 데도 적혀 있지 않습니다. PostgreSQL 문서가 SQL(Structured Query Language, 구조화 질의 언어) 표준은 catalog cluster 라는 말을 쓴다고 괄호로 덧붙일 뿐, 다른 맥락과 견주지는 않습니다. 그래서 클러스터라는 말만으로는 무엇이 묶였는지가 정해지지 않습니다. 맥락 이름을 먼저 대야 뜻이 섭니다.
맥락별 뜻
| 맥락 | 뜻 | 출처 |
|---|---|---|
| 오케스트레이션 · 분산 시스템 | 하나처럼 다루는 머신들의 묶음. 낱개는 노드(워커 머신) | Kubernetes Documentation, Cluster Architecture · Elastic Docs, Clusters, nodes, and shards |
| PostgreSQL | 서버 인스턴스 하나가 관리하는 데이터베이스들의 집합. 파일시스템으로는 디렉터리 하나 | PostgreSQL Documentation, Creating a Database Cluster |
| 파일시스템 · 디스크 | 연속된 섹터를 묶은 저장 할당 단위 | exFAT(Extended File Allocation Table, 확장 파일 할당 테이블) file system specification 3.1.15 · 5.1.1 · NTFS(New Technology File System, 새 기술 파일 시스템) overview |
| 머신러닝 · 데이터 분석 | 라벨(데이터가 어느 무리에 속하는지 미리 붙여 둔 값) 없는 데이터를 묶어낸 무리 | scikit-learn User Guide, 2.3. Clustering |
오케스트레이션과 분산 시스템
쿠버네티스 문서는 클러스터를 제어 평면(클러스터의 상태를 관리하고 무엇을 어디서 실행할지 정하는 부분) 하나와 컨테이너화된 애플리케이션을 실행하는 워커 머신 집합으로 정의합니다. 워커 머신의 이름이 노드입니다. 노드가 컨테이너화된 애플리케이션을 실행합니다.
Elasticsearch 문서도 같은 뜻으로 씁니다. 용량을 늘리려면 클러스터에 서버를 더합니다. 그 서버가 노드입니다. Elasticsearch 는 데이터와 쿼리 부하를 사용 가능한 노드 전체에 자동으로 분산합니다. 데이터를 노드에 나눠 놓는 방식은 검색 대상 문서 모음인 인덱스를, 그 문서 일부씩을 담은 조각인 샤드로 쪼개는 것입니다.
두 문서가 가리키는 것은 같습니다. 여러 대를 붙여 놓고 하나처럼 다루는 묶음입니다.
자리 배치로 그리면 이렇습니다. 클러스터는 제어 평면과 노드를 담고, 이건 쿠버네티스와 Elasticsearch 둘 다에서 같은 뜻입니다. 인덱스와 샤드는 Elasticsearch 에만 있는 물건이고, 그 샤드가 클러스터 안의 노드 위에 놓입니다.
flowchart TD
subgraph cluster_sg["클러스터 · 쿠버네티스와 Elasticsearch 공통"]
cp["제어 평면"]
n1["노드"]
n2["노드"]
end
subgraph index_sg["인덱스 · Elasticsearch 전용"]
s1["샤드"]
s2["샤드"]
end
s1 -. 놓인다 .-> n1
s2 -. 놓인다 .-> n2
노드나 샤드도 클러스터라고 부르나. 아닙니다. 노드는 클러스터에 속한 머신 한 대이고, 샤드는 인덱스를 쪼갠 조각입니다. 둘 다 클러스터를 이루는 부분이지 클러스터 자신이 아닙니다.
PostgreSQL
PostgreSQL 문서에서 클러스터는 머신의 묶음이 아닙니다. 문서는 데이터베이스 클러스터를 돌고 있는 데이터베이스 서버 인스턴스 하나가 관리하는 데이터베이스들의 집합이라고 적습니다. 그리고 SQL 표준은 이것을 catalog cluster 라고 부른다고 덧붙입니다.
파일시스템으로 보면 데이터베이스 클러스터는 모든 데이터가 저장될 디렉터리 하나입니다. 문서는 이 디렉터리를 데이터 디렉터리 또는 데이터 영역이라고 부릅니다. 어디에 둘지는 전적으로 사용자가 정합니다. 기본값은 없습니다. 문서는 /usr/local/pgsql/data 나 /var/lib/pgsql/data 같은 자리가 흔히 쓰인다고 적습니다. 데이터 디렉터리는 쓰기 전에 초기화되어야 하고, 그 일은 PostgreSQL 과 함께 설치되는 initdb 프로그램이 합니다.
파일시스템
exFAT 명세에서 클러스터는 저장 공간을 떼어 주는 단위입니다. 클러스터 하나는 연속된 섹터들의 나열입니다. 크기는 SectorsPerClusterShift 필드가 정합니다. 이 필드는 클러스터당 섹터 수를 log2(n) 으로 적습니다. 클러스터당 섹터가 8개면 값은 3입니다.
자리 배치로 그리면 이렇습니다. 클러스터 하나는 이어진 섹터 여덟 개를 그대로 감싼 칸입니다.
block-beta columns 10 space:1 cl["클러스터 · SectorsPerClusterShift = 3"]:8 space:1 e0["…"] s0["섹터"] s1["섹터"] s2["섹터"] s3["섹터"] s4["섹터"] s5["섹터"] s6["섹터"] s7["섹터"] e1["…"]
SectorsPerClusterShift 값의 범위는 최소 0 입니다. 이때 클러스터는 섹터 하나입니다. 이것이 가능한 가장 작은 클러스터입니다. exFAT 명세는 이 필드의 최댓값이 클러스터 크기 32MB 에 해당하는 값이라고 적습니다.
저장 공간을 포맷해서 하나의 단위로 쓰는 것을 볼륨이라고 부릅니다. 그 상한이 클러스터 크기를 따라 움직입니다. NTFS 문서는 볼륨 최대 크기가 윈도우 버전과 고른 클러스터 크기 둘 다에 따라 정해진다고 적습니다. NTFS 가 감당하는 클러스터 수는 2^32 − 1 개까지입니다. 문서가 적어 둔 표를 보면 기본 크기인 4KB 클러스터에서는 볼륨 최대 크기가 16TB 이고, 최대 크기인 2048KB 클러스터에서는 8PB 입니다.
머신러닝
scikit-learn 문서는 라벨이 없는 데이터를 묶는 일, 즉 군집화를 sklearn.cluster 모듈로 수행할 수 있다고 적습니다.
여기서 클러스터는 알고리즘이 만들어 낸 데이터 점들의 무리입니다. KMeans(k-평균) 알고리즘은 데이터 점 전체를 미리 정한 개수만큼 겹치지 않는 무리로 나누고, 각 무리를 그 안 데이터 점들의 평균 하나로 나타냅니다. 무리를 나눌 때 목표로 삼는 것은 각 무리의 분산(값이 퍼진 정도)이 서로 비슷해지는 것입니다. 앞서 오케스트레이션 맥락에서 쓴 "분산"(데이터를 여러 노드에 나눠 보내는 것)과는 다른 뜻입니다. 이 알고리즘은 관성이라고도 부르는 클러스터 내 제곱합을 최소화하려 합니다. 클러스터 내 제곱합은 각 데이터 점과 자신이 속한 클러스터의 평균 사이 거리를 제곱해서 더한 값입니다.
경계
CLUSTER 명령
PostgreSQL 에서 CLUSTER 명령을 돌리면 데이터베이스 클러스터가 만들어지나. 아닙니다. 이름만 같습니다. 다루는 대상이 다릅니다.
문서는 CLUSTER 를 테이블 하나에 거는 명령으로 적습니다. table_name 으로 지정한 테이블을 index_name 으로 지정한 인덱스를 기준으로 클러스터하라는 지시입니다. 여기서 인덱스는 테이블의 컬럼에 만든 데이터베이스 인덱스입니다. 앞서 오케스트레이션 맥락에서 쓴 인덱스(검색 대상 문서 모음)와는 다른 뜻입니다. 그 인덱스는 그 테이블에 이미 정의되어 있어야 합니다. 테이블이 클러스터되면 인덱스 정보를 기준으로 물리적으로 재배치됩니다. 이것은 한 번뿐인 작업입니다. 이후에 테이블이 갱신되면 그 변경분은 클러스터되지 않습니다. 물리적 재배치는 명령을 돌린 그 순간 한 번뿐이고, 그 뒤에 쌓이는 갱신은 다시 정렬되지 않습니다.
데이터베이스 클러스터를 만드는 것은 이 명령이 아니라 initdb 입니다. 같은 제품 안에서 한 말이 두 자리에 붙어 있는 셈입니다.
관련 항목
쿠버네티스·Elasticsearch 클러스터를 이루는 구성 요소
제어 평면 · 노드 · 워커 머신 · 컨테이너 · 파드 · 샤드 · 레플리카 샤드 · 인덱스 · Lucene · 부하 분산 · 쿠버네티스 · Elasticsearch
PostgreSQL 클러스터를 만드는 프로그램과 저장 위치
데이터 디렉터리 · 데이터 영역 · 카탈로그 클러스터 · initdb · 인스턴스 · 데이터베이스 서버 · template1
exFAT·NTFS 클러스터를 이루는 구성 요소와 표준
섹터 · 클러스터 힙 · 할당 단위 · SectorsPerClusterShift · BytesPerSectorShift · 볼륨 · exFAT · NTFS
머신러닝에서 클러스터를 만드는 알고리즘과 지표
군집화 · 비지도학습 · k-평균 · 중심점 · 관성 · 클러스터 내 제곱합 · 라벨
다른 이름: cluster