아키텍처

GritDB는 트랜잭션 엔진(PostgreSQL 17.11)과 분석 엔진(GritDB 엔진), 두 엔진으로 동작합니다. 분석 엔진은 PLUG · UNIFY · BURST로 되어 있고, PLUG가 트랜잭션 엔진과 연결됩니다. 두 엔진은 서버 한 대에서 함께 실행되고, 응용 프로그램에는 데이터베이스 하나로 보입니다. 도입 방식은 두 가지입니다. 운영 DB 옆에 분석계로 붙이거나, 한 데이터베이스로 씁니다.

응용 프로그램 · BI 도구
SQL

GritDB

트랜잭션 엔진 PostgreSQL 17.11 SQL 접속 지점 · 쓰기 · 트랜잭션 행 저장 · WAL
분석 엔진 GritDB 엔진 · GritSurfer

PLUG 트랜잭션 엔진과 연결

UNIFY 하이브리드 저장 · 읽기

BURST 최적화 · 병렬 실행

grit_admin이 두 엔진과 카탈로그 프로세스를 함께 띄우고 지켜봅니다.

GritDB 이중 엔진(HTAP) 구성과 쿼리 경로

두 엔진

쿼리 경로 보기쿼리 경로 접기
일반 세션 (기본값)
모든 쿼리를 트랜잭션 엔진이 실행합니다.
분석 세션
서브쿼리, CTE, 뷰 안에서도 등록한 테이블만 읽는 SELECT 문은 한 행 조회라도 분석 엔진이 실행합니다. PLUG가 이 조회를 받아 BURST로 넘깁니다. 기본 제공이 아닌 함수나 연산자를 쓰는 조회, 결과 열이 1.1이 받는 15가지 형식 밖인 조회, 커서로 읽는 조회는 분석 엔진이 실행하지 못합니다. 이런 조회는 메시지 없이 트랜잭션 엔진이 실행합니다.

분석 세션은 접속을 시작할 때 접속 옵션으로 켭니다(예: libpq 접속 문자열 options='-c gritsurfer_session_mode=surfer'). 접속한 뒤에는 바꿀 수 없고, 계정이나 데이터베이스의 기본값으로도 켤 수 없습니다. 분석 세션에서는 문장 힌트(/*+ engine=pg */ 또는 /*+ engine=burst */)로 엔진을 지정할 수 있습니다. 어느 엔진이 실행하는지는 분석 세션에서 EXPLAIN으로 확인합니다. 분석 엔진이 실행하는 조회는 EXPLAIN 결과 첫 줄에 engine: GritBurst가 나옵니다.

프로세스 구성 보기프로세스 구성 접기
  • grit_admin

    감독 프로세스

    두 엔진과 카탈로그 프로세스를 순서대로 띄우고 지켜봅니다. 기동은 gritdb-start, 정지는 gritdb-stop 명령으로 합니다.

  • postgres

    트랜잭션 엔진

    PostgreSQL 17.11에 GritSurfer의 확장(gritsurfer)을 올린 프로세스입니다. 확장에는 PLUG의 트랜잭션 엔진 쪽 연결과 테이블 등록 함수가 있습니다.

  • grit_catalog_process

    카탈로그 프로세스

    GritDB 카탈로그를 맡습니다. 등록 테이블과 열 기반 파일의 정보를 읽고 씁니다. 트랜잭션 엔진이 준비된 뒤에 뜹니다.

  • grit_surfer_process

    분석 엔진

    GritDB 엔진입니다. PLUG의 분석 엔진 쪽 연결과 UNIFY, BURST가 이 프로세스 안에서 실행됩니다.

도입 방식

분석계로 붙이는 과정은 제품 홈의 시연 영상에서 볼 수 있습니다.

운영 DB에 생기는 일

분석계로 붙일 때 운영 DB에서 달라지는 것과 분석계가 멈췄을 때 살펴볼 것을 정리했습니다.

설정할 때 (PostgreSQL)
wal_level을 logical로 바꾸고 publication을 만듭니다. wal_level을 바꾸면 운영 DB를 한 번 재시작해야 합니다. REPLICATION 권한과 게시한 테이블을 읽을 권한이 있는 복제 계정이 필요하고, GritDB 서버에서 오는 접속도 pg_hba.conf와 방화벽에서 허용해야 합니다. GritDB에서 subscription을 만들면 운영 DB에 복제 슬롯이 하나 생기고, 처음 한 번 초기 복사로 테이블 전체를 읽습니다. 초기 복사 동안에는 운영 DB에 긴 읽기 트랜잭션이 열려 있어 정리(VACUUM)가 늦어집니다. 그래서 큰 테이블은 한가할 때 붙입니다. 초기 복사 동안에는 테이블 복사용 슬롯과 복제 접속이 잠시 더 생겼다가 저절로 지워지므로, 운영 DB의 max_replication_slots와 max_wal_senders에 여유를 둡니다. 이 둘도 재시작해야 바뀌므로 wal_level을 바꿀 때 함께 정합니다. 기본 키가 없는 테이블은 publication에 넣기 전에 REPLICA IDENTITY를 정합니다. 정하지 않으면 운영 DB에서 그 테이블의 수정과 삭제가 오류로 멈춥니다.
평소
운영 DB는 commit한 변경을 WAL에서 꺼내 GritDB로 보냅니다(논리 디코딩). 무거운 리포트 질의는 운영 DB가 아니라 GritDB가 실행합니다.
분석계가 멈추면
복제 슬롯 때문에 운영 DB가 WAL을 지우지 않아 디스크 사용량이 늘어납니다. 운영 DB의 max_slot_wal_keep_size로 상한을 두면 디스크는 지킬 수 있습니다. 하지만 상한을 넘으면 복제 슬롯이 무효가 되어 다시 쓸 수 없고, 분석계의 테이블을 처음부터 다시 복사해야 합니다.
치울 때
GritDB에서 subscription을 지우면 운영 DB의 복제 슬롯도 함께 지워집니다. 운영 DB의 pg_replication_slots에서 슬롯이 사라졌는지 확인합니다. 운영 DB에서 바꾼 wal_level, max_replication_slots, max_wal_senders, publication, 복제 계정, 접속 허용, REPLICA IDENTITY는 그대로 남으므로 필요하면 되돌립니다. 앞의 세 설정을 되돌리면 재시작이 한 번 필요하고, 접속 허용은 설정을 다시 읽으면 바뀝니다.
지켜볼 것
운영 DB의 pg_replication_slots에서 슬롯 상태(wal_status)와 슬롯이 붙잡은 WAL 양을 봅니다. WAL 양은 현재 WAL 위치에서 restart_lsn을 뺀 값입니다. 디스크 여유도 함께 봅니다.
분석 결과에 보이기까지
GritDB가 받은 변경은 자체 시험에서 보통 12초 뒤에 분석 세션의 조회 결과에 보였고, 100번 중 99번은 22초 안에 보였습니다. 여기에 운영 DB에서 GritDB로 복제되는 시간이 더해집니다. 최신 값이 꼭 필요한 조회는 운영 DB에서 합니다.
다른 데이터베이스 (CDC · ETL 도구)
운영 DB 쪽 설정과 부담, 멈췄을 때의 동작은 그 도구를 따릅니다.

PLUG: 트랜잭션 엔진과 잇는 연결 엔진

PLUG는 분석 엔진(GritSurfer) 안에서 트랜잭션 엔진과 연결되는 엔진입니다. 1.1에서 PLUG가 하는 일은 네 가지입니다.

UNIFY · BURST

변경 저장

PLUG 등록한 테이블의 입력 · 수정 · 삭제
UNIFY 메모리에 행으로 쌓기
UNIFY 디스크의 열 기반 파일로 저장

조회

PLUG 분석 세션의 조회
BURST 분석용 실행 계획 세우기
UNIFY 열 기반 파일에서 필요한 열만 읽기
BURST 여러 CPU 코어에서 묶음 단위로 병렬 처리
PLUG 조회 결과를 트랜잭션 엔진으로

1.1의 조회는 열 기반 파일을 읽습니다. 메모리에 쌓인 행은 열 기반 파일로 옮겨진 뒤 조회에 보입니다.

UNIFY(하이브리드 저장 엔진)와 BURST가 나눠 맡는 일: 변경 저장과 조회
UNIFY · BURST 자세히 보기UNIFY · BURST 자세히 접기
  • UNIFY

    하이브리드 저장 엔진

    메모리에는 행으로, 디스크에는 열 기반 파일로 저장합니다. PLUG로 받은 입력, 수정, 삭제를 메모리에 행으로 쌓았다가 열 기반 파일로 옮기고, 수정과 삭제도 파일에 반영합니다. 조회 때는 열 기반 파일에서 필요한 열만 읽어 BURST로 넘깁니다. 조건에 맞지 않는 행 묶음은 묶음마다 적어 둔 최솟값 · 최댓값을 보고 읽지 않습니다. 변경은 행으로 받고 분석은 열로 읽는 이 구조가 트랜잭션과 분석을 한 데이터베이스에서 처리하는 바탕입니다.

  • BURST

    최적화 · 병렬 실행 엔진

    분석 세션의 조회를 분석에 맞는 실행 계획으로 다시 세우고, UNIFY가 읽어 온 데이터를 여러 CPU 코어에서 병렬로 처리합니다. 행을 하나씩 처리하는 트랜잭션 엔진과 달리, 값을 수천 개씩 묶어 한 번에 계산합니다.

BURST가 분석 세션의 조회를 빠르게 처리하는 방법은 네 가지입니다.

  • 묶음 단위 계산: 값을 수천 개씩 묶어 한 번에 계산합니다. 행마다 실행 단계를 오가지 않고, 같은 계산을 묶음 전체에 이어서 합니다.
  • 병렬 실행: 조회 하나를 여러 CPU 코어가 나눠 실행합니다. 데이터를 작은 묶음으로 나눠 코어마다 읽기부터 조인과 집계까지 맡기고, 마지막에 결과를 합칩니다.
  • 분석용 실행 계획: 조건으로 먼저 걸러 처리할 데이터를 줄입니다. 상위 몇 건만 필요한 조회(ORDER BY … LIMIT)는 전체를 정렬하지 않고 필요한 만큼만 남깁니다.
  • 서브쿼리 펴기: 바깥 행마다 다시 실행해야 하는 서브쿼리(상관 서브쿼리)를 조인으로 바꿔 한 번에 처리합니다.

같은 서버 사양에서 22개 분석 질의 시간을 잰 결과는 TPC-H 벤치마크 기반 분석 성능 비교에 있습니다.

1.1에서 알아 둘 것

설치와 운영 절차는 QuickStart에 있습니다.

GritDB를 직접 확인해 보세요

사전 상담이나 PoC를 요청하시면 담당자가 연락드립니다.