사전 데이터베이스 클러스터
용어함정

데이터베이스 클러스터

gabury1고친 사람 github-actions[bot]

데이터베이스 클러스터는 서버 프로그램 하나가 여러 데이터베이스를 한꺼번에 맡게 묶어 줍니다. PostgreSQL 이 이 말을 이 뜻으로 씁니다. 이름과 달리 이 뜻에는 서버 여러 대가 들어 있지 않습니다. 서버 여러 대의 묶음을 같은 이름으로 부르는 제품도 있어서 두 뜻이 자주 엇갈립니다.

쉽고 빠른 이해

무슨 일을 하나 — 서버 프로그램 하나가 맡는 데이터베이스 전부를 한 묶음으로 관리합니다. PostgreSQL 을 설치해 처음 띄우면 postgres 라는 데이터베이스가 이미 들어 있는 묶음 하나가 생깁니다. 이 묶음이 클러스터입니다.

왜 이렇게 하나 — 서버 프로그램 하나에 여러 서비스의 데이터베이스를 올려도 로그인 계정은 한 번만 만들면 됩니다. 계정 목록을 클러스터 전체가 함께 쓰기 때문입니다. 데이터도 디스크의 디렉터리 하나에 모여 있습니다.

어떻게 도나

  1. 빈 디렉터리 하나를 클러스터로 초기화합니다
  2. 서버 프로그램이 그 디렉터리를 가리키게 해서 띄웁니다
  3. 접속할 때마다 그 안의 데이터베이스 이름 하나를 고릅니다

대가 — 연결 하나로는 데이터베이스 하나만 볼 수 있습니다. 클러스터 안의 데이터베이스들은 변경 기록도 함께 씁니다. 그래서 데이터베이스 하나만 골라 파일째 백업하거나 복제할 수 없습니다.

상세

이 절은 PostgreSQL 의 데이터베이스 클러스터를 다룹니다. 안에 무엇이 담기는지부터 봅니다. 이어서 디스크 위의 모습과 만드는 법으로 넘어갑니다. 끝에서는 같은 이름이 서버 여러 대를 가리키는 다른 뜻과 견줍니다.

서버 하나가 맡는 데이터베이스 묶음

데이터베이스 클러스터는 실행 중인 서버 프로그램 하나가 관리하는 데이터베이스들의 모음입니다. 서버 프로그램은 기계가 아니라 기계 위에서 도는 프로그램입니다. 인스턴스라고도 부릅니다. 이 문서에서 기계는 「서버 한 대」처럼 대로 셉니다.

예를 들어 서버 한 대에 PostgreSQL 서버 프로그램을 띄웠다고 해 봅시다. 거기에 shop 과 blog 데이터베이스를 만들었습니다. 이 둘과 처음부터 들어 있던 데이터베이스들이 함께 클러스터 하나를 이룹니다. 데이터베이스를 하나 더 만들면 같은 클러스터 안에 하나가 늘어납니다.

SQL(Structured Query Language) 표준에서는 데이터베이스를 카탈로그라고 부릅니다. 같은 묶음도 카탈로그 클러스터라고 부릅니다. 이름이 다를 뿐입니다. 가리키는 것은 같습니다.

클러스터 안의 계층

클러스터 안에는 데이터베이스가 여럿 들어갑니다. 데이터베이스 안에는 스키마가 들어갑니다. 스키마는 테이블과 함수 같은 객체를 이름별로 담는 칸입니다. 위에서부터 적으면 클러스터, 데이터베이스, 스키마, 테이블 순입니다.

몇몇 객체는 데이터베이스 안이 아니라 클러스터에 바로 붙습니다. 대표가 롤입니다. 롤은 로그인 계정과 권한 묶음을 함께 가리키는 이름입니다. 롤을 한 번 만들면 클러스터 안 어느 데이터베이스에서든 같은 롤로 접속할 수 있습니다.

덕분에 데이터베이스가 열 개여도 서버 프로그램 하나와 계정 목록 하나로 관리합니다. 서비스마다 서버 프로그램을 따로 띄우고 계정을 따로 만들 필요가 없습니다.

테이블스페이스와 데이터베이스 이름 목록도 클러스터에 붙습니다. 테이블스페이스는 데이터 파일을 둘 디스크 경로에 붙인 이름입니다. 큰 테이블만 다른 디스크에 두고 싶을 때 씁니다.

아래 그림은 앞의 shop·blog 예를 펼친 것입니다. shop 에는 sales 스키마와 orders 테이블을, blog 에는 content 스키마와 posts 테이블을 넣었습니다. 맨 위 상자는 두 데이터베이스가 함께 쓰는 객체입니다. 화살표는 「안에 담는다」는 뜻입니다.

flowchart TD
    subgraph C["데이터베이스 클러스터"]
        subgraph G["클러스터 전체가 함께 쓰는 객체"]
            R["롤"]
            TS["테이블스페이스"]
            DL["데이터베이스 이름 목록"]
        end
        D1["데이터베이스 shop"] --> S1["스키마 sales"] --> T1["테이블 orders"]
        D2["데이터베이스 blog"] --> S2["스키마 content"] --> T2["테이블 posts"]
    end

연결 하나가 보는 데이터베이스

클라이언트가 서버에 접속할 때는 데이터베이스 이름을 하나 적어야 합니다. 그 연결로는 그 데이터베이스 하나에만 들어갈 수 있습니다. 같은 클러스터 안이라도 다른 데이터베이스의 테이블은 보이지 않습니다.

아래는 shop 에 접속한 연결에서 두 테이블을 조회하는 모습입니다. blog.content.posts 는 데이터베이스, 스키마, 테이블 이름을 점으로 이은 것입니다.

SQL
SELECT * FROM sales.orders;       -- 된다
SELECT * FROM blog.content.posts; -- 오류

첫 줄은 접속한 데이터베이스 안의 테이블이라 됩니다. 둘째 줄은 다른 데이터베이스를 가리켜서 서버가 거부합니다. 롤은 클러스터가 함께 씁니다. 테이블은 데이터베이스마다 갈라져 있습니다.

다른 데이터베이스의 데이터가 꼭 필요하면 연결을 하나 더 엽니다. 아니면 확장을 씁니다. 확장은 서버에 기능을 덧붙이는 추가 모듈입니다.

postgres_fdw 가 이럴 때 쓰는 확장입니다. 다른 데이터베이스나 다른 클러스터의 테이블을 내 데이터베이스의 테이블처럼 보이게 해 줍니다.

여기서 나누는 기준이 생깁니다. 서로 모르고 지내야 하는 서비스는 데이터베이스로 나눕니다. 서로의 데이터를 함께 조회해야 하는 서비스는 한 데이터베이스 안에서 스키마로 나눕니다.

디스크 위의 데이터 디렉터리

파일로 보면 클러스터는 디렉터리 하나입니다. 클러스터의 데이터는 기본으로 전부 이 디렉터리 아래에 저장됩니다. 이 디렉터리를 데이터 디렉터리라고 부릅니다. 테이블스페이스로 다른 경로를 잡아 둔 데이터만 그 경로에 따로 놓입니다.

어디에 둘지는 설치하는 사람이 정합니다. 정해진 기본 경로는 없습니다. /var/lib/pgsql/data 같은 경로를 흔히 씁니다.

PostgreSQL 의 서버 프로그램은 이름이 postgres 입니다. 앞에 나온 데이터베이스 postgres 와 이름만 같고 다른 것입니다.

postgres 를 띄울 때 -D 옵션으로 이 경로를 넘기면 서버 프로그램이 그 클러스터를 맡습니다. -D 대신 PGDATA 환경 변수에 경로를 적어 두어도 됩니다. 서버 프로그램 하나는 클러스터 하나만 맡습니다.

그래서 한 기계에 클러스터를 둘 두려면 서버 프로그램도 둘 띄웁니다. 둘이 부딪히지 않게 데이터 디렉터리와 포트를 서로 다르게 줍니다. 포트는 서버가 접속을 받는 번호입니다.

initdb 로 만드는 클러스터

클러스터는 initdb 로 만듭니다. initdb 는 PostgreSQL 과 함께 설치되는 프로그램입니다. 빈 디렉터리를 받아 데이터 디렉터리로 초기화합니다. 경로는 서버 프로그램처럼 -D 옵션으로 받습니다.

터미널
initdb -D /var/lib/pgsql/data

위 명령 한 줄로 그 경로에 클러스터 하나가 생깁니다.

갓 만든 클러스터에도 데이터베이스가 셋 들어 있습니다. 셋은 저마다 맡은 일이 다릅니다.

데이터베이스 하는 일
postgres 도구와 사용자가 기본으로 접속하는 데이터베이스
template1 새 데이터베이스를 만들 때 복사해 쓰는 틀
template0 처음 상태를 보존해 두는 틀. 손대지 않는다

새 데이터베이스는 template1 을 복사해서 만들어집니다. 그래서 template1 에 넣어 둔 테이블이나 확장은 이후에 만드는 데이터베이스에 모두 따라 들어갑니다.

함께 묶여서 생기는 대가

사용자가 보기에 클러스터 안의 데이터베이스들은 서로 갈라져 있습니다. 관리하는 쪽에서 보면 단단히 묶여 있습니다. 변경 기록 하나를 클러스터 전체가 함께 쓰기 때문입니다.

그 변경 기록이 WAL(Write-Ahead Logging, 미리 쓰기 로그)입니다. 서버는 데이터를 바꾸기 전에 무엇을 바꿀지 이 로그에 먼저 적습니다. 서버가 갑자기 꺼져도 다시 켤 때 이 로그를 읽어 데이터를 맞춥니다.

WAL 이 클러스터에 하나뿐이라서, WAL 을 이용하는 작업은 클러스터 단위로만 돕니다. 백업과 복제가 그렇습니다.

물리 백업은 데이터 디렉터리를 파일째 복사하는 백업입니다. 복사하는 동안에도 데이터는 바뀌므로, 복구할 때 그 사이에 쌓인 WAL 을 다시 적용해 파일을 맞춥니다. 그런데 이 WAL 에는 모든 데이터베이스의 변경이 섞여 있어서 데이터베이스 하나만 골라낼 수 없습니다. shop 만 어제 시점으로 되돌리려 해도 blog 까지 함께 되돌아갑니다.

스트리밍 복제도 마찬가지입니다. 스트리밍 복제는 WAL 을 다른 서버로 흘려보내 사본을 맞추는 방식입니다. 흘려보내는 WAL 이 클러스터 전체의 것이라 사본도 클러스터 전체로 생깁니다.

데이터베이스 하나만 백업하려면 논리 백업을 씁니다. 논리 백업은 파일 대신, 데이터를 다시 만드는 SQL 문으로 내보냅니다. pg_dump 가 이 일을 하는 도구입니다.

데이터베이스 하나만 다른 서버로 계속 옮겨 주려면 논리 복제를 씁니다. 논리 복제는 WAL 을 그대로 보내지 않고, 어느 테이블의 어느 행이 바뀌었는지로 풀어서 보냅니다. 그래서 옮길 데이터를 골라 보낼 수 있습니다.

복구 시점을 서비스마다 따로 정해야 한다면 클러스터를 나눠 두면 됩니다. 대신 서버 프로그램과 계정 목록도 그만큼 늘어납니다.

서버 여러 대를 뜻하는 데이터베이스 클러스터

같은 낱말이 다른 곳에서는 전혀 다른 묶음을 가리킵니다. 서버 여러 대가 데이터를 나눠 갖거나, 복사해 갖거나, 저장소 하나를 함께 쓰는 구성입니다. 묶인 서버 한 대 한 대를 노드라고 부릅니다.

이렇게 묶는 까닭은 한 대가 멈춰도 서비스를 이어 가기 위해서입니다. 멈춘 서버의 일을 다른 서버가 넘겨받는 것을 페일오버라고 합니다.

Amazon Aurora 가 이 뜻으로 씁니다. Aurora 의 데이터베이스 클러스터는 데이터베이스 인스턴스 하나 이상과 클러스터 볼륨 하나로 이루어집니다. 클러스터 볼륨은 그 인스턴스들이 함께 쓰는 저장 공간입니다. 앞의 세 갈래 가운데 저장소 하나를 함께 쓰는 쪽입니다.

쓰기는 주 인스턴스 하나가 맡습니다. 나머지 인스턴스는 같은 볼륨을 읽기만 합니다. 이렇게 읽기만 하는 인스턴스를 복제본이라고 부릅니다.

두 뜻을 나란히 놓으면 묶는 것과 서버 프로그램 수가 다릅니다.

맥락 묶는 것 서버 프로그램
PostgreSQL 서버 프로그램 하나가 맡는 데이터베이스들 하나
Amazon Aurora 인스턴스 여럿과 함께 쓰는 저장 볼륨 하나 이상

어느 뜻인지는 함께 나온 낱말로 가립니다. initdb · 데이터 디렉터리 · 롤이 같이 나오면 PostgreSQL 의 뜻입니다. 복제본 · 페일오버 · 노드가 같이 나오면 서버 여러 대의 뜻입니다.

PostgreSQL 안에도 이름이 겹치는 것이 하나 더 있습니다. CLUSTER 명령은 테이블 하나를 인덱스 순서대로 다시 정렬합니다. 데이터베이스 클러스터를 만드는 일과는 상관이 없습니다.

관련 항목

데이터베이스 클러스터 안에 담기는 객체

데이터베이스 · 스키마 · 테이블 · 함수 · 롤 · 테이블스페이스 · pg_global · 시스템 카탈로그 · template1 · template0

데이터베이스 클러스터를 만들고 띄우는 프로그램

initdb · pg_ctl · postmaster · psql · PostgreSQL

데이터베이스 클러스터가 저장되는 디렉터리와 설정 파일

데이터 디렉터리 · 데이터 영역 · PGDATA · postgresql.conf · pg_hba.conf

데이터베이스 클러스터를 맡아 돌리는 서버와 그 접속 수단

인스턴스 · 데이터베이스 서버 · 포트 · 연결 문자열 · 커넥션 풀

데이터베이스 클러스터를 표준에서 부르는 이름

카탈로그 클러스터 · 카탈로그 · SQL 표준 · SQL

데이터베이스 클러스터 단위로 도는 백업·복제 수단

WAL · 물리 백업 · pg_basebackup · 스트리밍 복제 · 시점 복구 · pg_upgrade · 백업과 복구

데이터베이스 하나씩 옮기거나 잇는 수단

pg_dump · 논리 백업 · 논리 복제 · postgres_fdw · dblink

같은 이름으로 서버 여러 대를 가리키는 구성

클러스터 · Amazon Aurora · 클러스터 볼륨 · 복제본 · 복제 · 페일오버 · 고가용성 · 노드

데이터베이스 클러스터와 이름이 겹치는 명령

CLUSTER (SQL) · 인덱스 · 클러스터드 인덱스 · VACUUM FULL

다른 이름: database cluster · 카탈로그 클러스터 · catalog cluster