1. 설치 계획
이 장을 마치면: 구성 방식과 서버 사양, OS 설정, 디스크 배치, 반입물을 정한다.
1.1 구성 방식
| 구성 | 흐름 | 쓰는 곳 |
|---|---|---|
| 분석계(권장) | 운영 DB → 내장 복제(PostgreSQL 논리 복제, publication → subscription), CDC 또는 ETL → GritDB → 리포트와 BI 도구(분석 세션) | 1.1에서 권하는 도입 방식. 운영 DB의 실행 파일, 데이터, 업무 프로그램은 그대로 둔다 |
| 한 데이터베이스 | 응용 프로그램 → GritDB(쓰기와 조회 모두) | QuickStart 설치 구성, 시험, 검증 |
- 한 데이터베이스 구성에서는 등록 테이블에 쓸 때마다 GritDB 엔진이 받았다는 확인을 기다린다. 그래서 운영 업무의 쓰기 부하에는 권하지 않는다.
- 분석계 구성에서는 운영 DB 쪽에도 할 일이 있다.
wal_level, publication, 복제 계정,pg_hba.conf, 방화벽, 운영 DBpg_wal여유,max_slot_wal_keep_size는 6.4.1과 6.4.3을 본다. 감시는 7.5를 본다. - 분석계 GritDB를 멈춰 둔 동안 운영 DB의 복제 슬롯이 WAL을 붙잡는다. 그래서 멈춰 둘 수 있는 시간과 운영 DB 디스크 여유를 미리 정한다(4.7).
- 운영 DB의 물리 복제(스트리밍 대기 서버)로는 받지 않는다. 분석계는 PostgreSQL 논리 복제, CDC 또는 ETL로 받는다(6.4).
- 1.1에 없는 구성은 GritDB 이중화(standby, HA), 다중 노드, 이미 쓰는 PostgreSQL에 GritDB 붙이기다. 설치 스크립트가 initdb로 데이터 디렉토리를 새로 만들므로 기존 PostgreSQL에는 붙일 수 없다. 자세한 것은 10.6을 본다.
1.2 지원 플랫폼
| 항목 | 요구 | 확인 |
|---|---|---|
| CPU | x86-64, cx16과 sse4_2 명령어(없으면 GritDB가 기동하지 않는다) |
QuickStart 2.4 점검표 3 |
| glibc | 설치 파일 manifest.json의 min_glibc 이상 |
QuickStart 2.4 점검표 4 |
| OS | Ubuntu 24.04 LTS | grep PRETTY_NAME /etc/os-release |
| 가상 서버 | 같은 OS면 된다 | — |
| PostgreSQL | 17.11(설치 파일에 들어 있어 따로 설치하지 않는다) | 0장 근거 버전 |
- 지원 OS는 Ubuntu 24.04 LTS 하나다. 그 밖의 OS와 컨테이너는 지원 환경 밖이다. 설치와 기동이 되어도 보증하지 않는다.
- RHEL 9와 Rocky Linux 9는 glibc가
min_glibc보다 낮아 설치 점검(QuickStart 2.4 점검표 4)에서 막힌다. - 설치 스크립트는 glibc나 CPU 명령어가 모자라도 경고만 내고 설치를 이어 간다. 아래 경고가 보이면 설치를 멈추고 QuickStart 2.4 점검표 3과 4로 돌아간다.
[WARN] Host glibc <판> is older than required <판>; binaries may not start.[WARN] CPU may lack required flags (cx16, sse4.2); startup guard will refuse if so.
- 컨테이너에서는 GritDB 엔진이 메모리와 vCPU를 호스트 값으로 잡는다. 컨테이너 한도를 보지 않는다. 한도에 걸리면 OS가 GritDB 프로세스를 강제로 끝내고, GritDB 전체가 멈춘다(4.3).
설치 전에 공유 라이브러리를 점검한다. 압축을 푼 디렉토리에서 실행한다.
cd ~/pkg/gritdb-*/
ldd bin/postgres bin/grit_admin bin/grit_surfer_process bin/grit_catalog_process | grep 'not found'
출력이 없으면 정상이다. 빠진 라이브러리가 있으면 설치는 끝나도 기동에서 멈춘다. 이때는 그 라이브러리를 OS 패키지로 설치한 뒤 다시 점검한다.
1.3 사양 산정
| 항목 | 값 | 모자라면 |
|---|---|---|
| 최소 사양(구독 최소 사양) | vCPU 16, 메모리 64 GB | 설치와 운영 지원은 받는다. 성능 문의는 서버를 최소 사양으로 올린 뒤 받는다(QuickStart 2.4 점검표 5) |
| 메모리 하한 | OS가 보는 전체 메모리(free -m의 Mem: 줄 total) 8192 이상 |
GritDB 엔진이 기동하지 않는다. 중단 기록 log/GRIT_SURFER_ASSERT.log에 system memory too small과 Required system memory >= 8192 MB가 남는다(9.1) |
| 디스크 하한 | 적재할 데이터 크기 + 200 GB(max_wal_size 64 GB 기준) |
데이터 볼륨을 분리한다(1.5, 2.4, QuickStart 2.4 점검표 6) |
- 이름이 8 GB인 서버는 보통
total이 8192보다 작게 보인다. 커널과 펌웨어 예약분이 빠지기 때문이다. 그래서 하한에 모자란다. - 1.1에는 GritDB가 쓰는 vCPU와 메모리를 줄이는 설정이 없다. GritDB는 서버(가상 서버) 크기만큼 쓴다. 그래서 크기는 서버를 고를 때 정한다.
메모리 나눔:
| 몫 | 크기 |
|---|---|
| GritDB 엔진 저장 | 물리 메모리의 절반 |
| GritDB 엔진 질의 | 4 GB와 물리 메모리의 15% 중 큰 값 |
shared_buffers |
엔진 두 몫을 빼고 남은 메모리(PostgreSQL 몫)의 25%. 설치 스크립트가 정한다(5.5) |
| 접속 | 접속한 PostgreSQL 세션 수만큼 |
디스크 나눔:
| 자리 | 늘어나는 이유 |
|---|---|
datafiles/pgdata |
테이블과 인덱스 데이터 |
datafiles/pgdata/pg_wal |
max_wal_size(기본 64 GB) + 복구용 복제 슬롯(gritsurfer_slot, 복제 슬롯)이 붙잡는 WAL |
datafiles/cold_file |
cold file(GritDB 엔진이 분석 조회용으로 열 단위로 저장한 파일). 갱신과 삭제 이력이 남는 몫을 포함한다(7.4) |
datafiles/queue, datafiles/buffer_spill |
GritDB 엔진 대기열, 메모리가 모자랄 때 밀어낸 데이터 |
log/ |
GritDB 로그와 postgresql.log(9.3과 9.4) |
| core 파일 | 하나가 수십 GB(9.6). 자리는 kernel.core_pattern이 정한다(1.4) |
등록 테이블에 한 트랜잭션으로 쓰는 행 수(한 트랜잭션 크기)에는 상한이 있다. 상한은 서버 메모리에 따라 다르고, 바꾸는 설정은 없다. 설치한 뒤 6.8로 확인한다.
- 분석계로 큰 테이블을 받거나 운영 DB에 큰 배치가 있으면 서버를 고르기 전에 지원 문의(0장)를 한다.
계산 예:
| 몫 | 메모리 64 GB 서버, 데이터 100 GB | 메모리 128 GB 서버, 데이터 1 TB |
|---|---|---|
| GritDB 엔진 저장 | 약 32 GB | 약 64 GB |
| GritDB 엔진 질의 | 약 10 GB | 약 19 GB |
shared_buffers |
5 GB | 10 GB |
| 남는 몫(OS, 접속, 파일 캐시) | 약 17 GB | 약 35 GB |
| 디스크 하한 | 300 GB | 1,200 GB |
- 디스크 하한은 하한일 뿐이다. cold file의 크기는 부하에 따라 다르므로 운영 초기부터 추이를 잰다(7.4).
1.4 OS 설정
| 항목 | 확인(gritdb) |
정상 | 설정(root) |
|---|---|---|---|
| 서비스 계정 | id gritdb |
계정이 있다 | useradd -m gritdb(QuickStart 2.1) |
| 파일 열기 한도 | ulimit -n과 ulimit -Hn |
둘 다 65536 이상 | 아래 ① |
| core 파일 | ulimit -c, ulimit -Hc, cat /proc/sys/kernel/core_pattern |
정한 한도와 정한 자리(9.6) | 아래 ② |
/dev/shm |
df -h /dev/shm |
줄여 두지 않았다. Ubuntu 기본값은 메모리의 절반이다 | 줄였으면 되돌린다 |
로그아웃 때 공유 메모리 지우기(RemoveIPC) |
systemd-analyze cat-config systemd/logind.conf | grep -E '^RemoveIPC' |
RemoveIPC=no |
아래 ⑤ |
| 시간 동기화 | timedatectl |
System clock synchronized: yes |
timedatectl set-ntp true |
| clocksource | cat /sys/devices/system/clocksource/clocksource0/current_clocksource |
tsc |
아래 ③ |
/tmp 실행 권한 |
findmnt -n -o OPTIONS --target /tmp |
noexec가 없다 |
아래 ④ |
① 파일 열기 한도 — root가 /etc/security/limits.conf에 두 줄을 더한다.
cat >> /etc/security/limits.conf <<'EOF'
gritdb soft nofile 65536
gritdb hard nofile 65536
EOF
- 새로 로그인한
gritdb셸에서ulimit -n과ulimit -Hn을 다시 실행해 둘 다 65536 이상인지 확인한다. - QuickStart 2.1(계정 만들기)이 같은 두 줄을 넣는다. 그대로 설치했으면 이미 올라가 있으므로 확인만 한다.
- 서버 부팅 때 서비스로 띄우면 이 파일이 적용되지 않는다. 이때는 4.6의
LimitNOFILE을 본다.
② core 파일 — GritDB 엔진은 core 크기 한도를 hard 값까지 올린다. 즉시 정지나 비정상 종료 때 core 1개가 수십 GB일 수 있다(9.6).
- core를 남길지와 어디에 둘지를 정한다. 설정할 것은 hard 한도(
/etc/security/limits.conf의core줄)와kernel.core_pattern의 자리다. kernel.core_pattern이|로 시작하면(Ubuntu 기본) OS의 core 수집 프로그램이 core를 받는다. 이때는 그 프로그램의 자리와 설정을 먼저 본다(9.6).- 자리는 데이터 볼륨이 아니면서 core 여러 개를 둘 공간이 있는 곳이다(1.5).
③ clocksource — tsc가 아니면 GritDB는 기동하지만 log/grit_admin_main.log에 kernel clocksource is 경고가 남는다. 바꾸기는 root가 한다.
cat /sys/devices/system/clocksource/clocksource0/available_clocksource
echo tsc > /sys/devices/system/clocksource/clocksource0/current_clocksource
- 첫 줄 출력에
tsc가 있을 때만 바꾼다. 없으면 지원 문의(0장)를 한다. - 다시 부팅해도 남기려면 커널 명령줄에
clocksource=tsc를 더한다.
④ 임시 디렉토리(TMPDIR)
-
설치 때는 설치 스크립트가 임시 디렉토리에 단계별 스크립트를 만들어 실행한다.
/tmp가noexec이면 모든 단계가 실패할 수 있다. 이때는 실행할 수 있는 디렉토리를 준다.mkdir -p ~/tmp cd ~/pkg/gritdb-*/ TMPDIR=~/tmp ./install_gritdb.sh -
실행 중에는 GritDB 엔진이 정리 작업 임시 파일(
__tkidx_spill_*.tmp)을 쓴다. 쓰는 곳은 기동한 셸의TMPDIR(없으면/tmp)이다./tmp가 tmpfs이거나 작으면 데이터 볼륨 안 디렉토리를 주고 기동한다. 이 디렉토리는datafiles/밖에 두고, 기동할 때마다 같은 값을 준다.TMPDIR=<데이터 볼륨 안 디렉토리> ~/gritdb1/bin/gritdb-start -
비정상 종료 뒤 남은 임시 파일은 GritDB를 정지한 상태(4.5)에서 지운다. 자세한 것은 7.6을 본다.
<임시 디렉토리>는 기동 때 준TMPDIR이고, 주지 않았으면/tmp다.ls -l <임시 디렉토리>/__tkidx_spill_*.tmp rm -f <임시 디렉토리>/__tkidx_spill_*.tmp- 설치본이 여럿이고 같은 임시 디렉토리를 쓰면 모든 설치본을 정지한 뒤 지운다(2.9).
⑤ RemoveIPC — Ubuntu에서 systemd는 기본으로 일반 계정의 마지막 로그인 세션이 끝날 때 그 계정의 공유 메모리를 지운다. useradd -m으로 만든 서비스 계정(QuickStart 2.1)은 일반 계정이다. 그래서 gritdb로 로그인했다 나가면 실행 중인 GritDB의 공유 메모리(/dev/shm, 1.4 표)가 지워진다. root가 아래처럼 끈다.
mkdir -p /etc/systemd/logind.conf.d
printf '[Login]\nRemoveIPC=no\n' > /etc/systemd/logind.conf.d/gritdb.conf
systemctl restart systemd-logind
- 위 표의 확인 명령을 실행해
RemoveIPC=no가 나오는지 확인한다. - QuickStart 2.1(계정 만들기)이 같은 세 줄을 실행한다. 그대로 설치했으면 이미 꺼져 있으므로 확인만 한다.
- 서비스 계정을 시스템 계정(
useradd -r)으로 만들었으면 지워지지 않는다. 근거는 systemd RemoveIPC에 있다.
큰 페이지 설정인 PostgreSQL huge_pages는 기본값(try) 그대로 둔다. GritDB 엔진은 큰 페이지를 따로 잡지 않는다.
1.5 디스크 배치
데이터 전용 볼륨을 두고 datafiles/를 통째로 그 볼륨에 두기를 권한다(2.4의 --datafiles). datafiles/는 한 묶음이므로 일부만 다른 볼륨에 두지 않는다.
~/gritdb1/ 설치 경로 (OS 볼륨)
├── bin/ · lib/ · share/ … 설치 파일
├── config/ GritDB 엔진 설정
├── log/ 로그
├── run/ 실행 중 상태 파일
└── datafiles → /data/gritdb/datafiles 심링크
/data/ 데이터 전용 볼륨 (mount 지점 · root 소유)
└── gritdb/ 서비스 계정 소유 (재초기화 · 복원이 이 안에서 이름을 바꾼다)
└── datafiles/
├── pgdata/ PostgreSQL 데이터 · WAL
├── checkpoint/ unify checkpoint (GritDB 엔진이 영구 반영을 마친 WAL 위치 · PostgreSQL checkpoint 와 다르다)
├── queue/ GritDB 엔진 대기열
├── buffer_spill/ 메모리가 모자랄 때 밀어낸 데이터
└── cold_file/ cold file
⚠ 설치한 뒤
datafiles/의 실경로(재배치 대상과 mount 지점 포함)를 바꾸지 않는다
- 이유: 바꾼 채 기동하면 cold file을 잃는다. 되돌릴 수 없다.
- 대신: 처음 설치 때 데이터 볼륨을 정한다(2.4). 디스크가 모자라면 경로를 그대로 두고 볼륨만 늘린다. 복구도 같은 실경로로 한다(8.1과 10.5).
--datafiles에는 mount 지점 자체가 아니라 그 아래 디렉토리를 준다(2.4). 예:/data가 mount 지점이면 서비스 계정 소유의/data/gritdb를 만들고/data/gritdb/datafiles를 준다. 그러면 재초기화와 복원이 같은 볼륨 안, 서비스 계정이 쓸 수 있는 자리에서 이름만 바꾼다. mount 지점 자체를 주면 재초기화가 옛 데이터를 상위 파일시스템으로 옮기므로 그 파일시스템이 찰 수 있다(3.1).log/는 설치 경로 아래에 있고 옮기는 옵션이 없다. 그래서 설치 경로 볼륨에 로그 자리를 둔다.postgresql.log는 회전을 설정하지 않으면 계속 커진다(9.4).- core 파일은
kernel.core_pattern이 정한 자리에 쌓이므로 그 자리를 데이터 볼륨이 아닌 곳으로 정한다(1.4와 9.6). - 디스크를 늘릴 때는 경로를 그대로 두고 볼륨만 늘린다(위 경고).
1.6 포트 · 네트워크
| 방향 | 출발 | 도착 | 포트 | 쓰임 |
|---|---|---|---|---|
| 들어옴 | 응용 프로그램, 리포트, BI 도구 | GritDB 서버 | PostgreSQL 포트(기본 5432) | 조회와 쓰기 |
| 들어옴 | CDC와 ETL 도구 | GritDB 서버 | PostgreSQL 포트 | 분석계(도구로 받을 때, 6.4) |
| 나감 | GritDB 서버 | 운영 DB | 운영 DB 포트 | 분석계 subscription(6.4.1의 4번) |
- 들어오는 TCP 접속을 받는 포트는 PostgreSQL 포트 하나다. 그 밖의 GritDB TCP 포트는 없다.
- 유닉스 소켓은 PostgreSQL
/tmp/.s.PGSQL.<포트>(unix_socket_directories)와 감독 프로세스~/gritdb1/run/grit_admin.sock이다. 감독 프로세스 소켓은 정지 명령용이다(11.7). - GritDB는 스스로 바깥으로 통신하지 않는다. 사용권 통신이나 통계 통신이 없다. 바깥으로 나가는 접속은 분석계 subscription이 운영 DB로 여는 것 하나다.
- 설치 기본값으로는
localhost에서만 접속을 받는다. 원격 접속은 11.4를 본다.
1.7 인터넷이 없는 망 반입
| 반입물 | 비고 |
|---|---|
설치 파일(gritdb-<...>.tar.gz) |
배포 매체 |
SHA256SUMS |
설치 파일과 다른 경로로 받는다 |
jq |
OS 패키지. OS 설치 매체나 기관 내부 저장소에서 의존 패키지와 함께 받는다 |
- 반입 검수는 QuickStart 2.3 그대로 한다(
sha256sum -c SHA256SUMS→install_gritdb.sh --verify-only). - 설치 스크립트는
SHA256SUMS를 읽지 않으므로sha256sum -c를 빼먹지 않는다. - 자동화로 판정할 때는
--verify-only의 종료 코드가 0이면 통과다. 0이 아니면 화면 문구로 가른다.jq is required to read the manifest가 나오면jq를 반입한다(GDB-INSTALL-002).hash mismatch나dist verification FAILED가 나오면 반입을 다시 받는다(GDB-INSTALL-003).
- 패치나 업그레이드 때도 새 설치 파일을 같은 절차로 검수한다(3.4).
1.8 문자셋 · 정렬 · 시간대
-
데이터베이스 문자셋은
UTF8이고, 정렬(collation)은C다. 문자 분류(ctype)는C.UTF-8이다. 설치가 정하고 바꿀 수 없다. GritDB 엔진과 PostgreSQL의 정렬 결과를 맞추려고 고정했다.~/gritdb1/bin/psql -p 5432 -d postgres -Atc "SELECT datname, pg_encoding_to_char(encoding), datcollate, datctype FROM pg_database;"모든 데이터베이스가
UTF8|C|C.UTF-8이면 정상이다. -
정렬 결과는 바이트 순서다.
ko_KR이나en_US정렬과 다르다. 예:ORDER BY에서 대문자가 먼저 오므로B가a보다 앞이다. 한글(완성형)은 가나다 순서로 정렬된다. -
다른 정렬이나 ICU 정렬로 데이터베이스를 만들지 않는다(10.3).
-
서버 시간대는 설치 때의 OS 시간대다(
TimeZone).SHOW timezone;을 실행해 확인한다. 바꾸려면 5.3을 본다. -
분석 세션의 조회는 세션 시간대(
SET timezone)를 쓰지 않는다. 그래서 응용 프로그램의 시간대를 서버 시간대와 맞춘다(10.3). 분석 세션은 OS 시간대로 계산하므로 서버 시간대를 OS 시간대와 같게 둔다(5.3).
1.9 설치 계획 점검표
| # | 정할 것 | 정한 값 | 볼 곳 |
|---|---|---|---|
| 1 | 구성 | <분석계 · 한 데이터베이스> |
1.1 |
| 2 | 서버 | <vCPU · 메모리 · OS> |
1.2와 1.3 |
| 3 | 서비스 계정 | <계정 · 기본 gritdb> |
1.4 |
| 4 | 설치 경로 | <기본 ~/gritdb1 · 80 자 이하> |
2.2 |
| 5 | 데이터 볼륨 | <--datafiles 경로 · 볼륨 크기> |
1.5와 2.4 |
| 6 | 포트와 방화벽 | <포트 · 접속을 열 주소> |
1.6, 2.5, 11.4 |
| 7 | 반입물 | 설치 파일, SHA256SUMS(다른 경로), jq |
1.7 |
| 8 | 공유 라이브러리 | ldd 점검 출력 없음 |
1.2 |
| 9 | 파일 열기 한도 | soft와 hard 65536 이상 | 1.4 |
| 10 | TMPDIR |
<설치 · 기동 때 쓸 디렉토리> |
1.4 |
| 11 | core | <한도 · kernel.core_pattern 자리> |
1.4와 9.6 |
| 12 | 백업 자리와 주기 | <datafiles/ 를 통째로 담을 자리 · 주기 = 잃어도 되는 기간> |
8.2, 8.3, 8.4(복구 때 데이터 볼륨 여유) |
| 13 | 시간대 | <서버 시간대>(문자셋과 정렬은 고정) |
1.8 |
| 14 | 한 트랜잭션 크기 | <가장 큰 적재 · 배치의 행 수>(설치 뒤 6.8로 대조) |
1.3과 6.8 |
| 15 | 분석계 운영 DB 준비 | <wal_level · max_slot_wal_keep_size · 운영 DB pg_wal 여유 · 멈춰 둘 수 있는 시간> |
1.1, 4.7, 6.4.1, 6.4.3 |
| 16 | OS 설정(1.4 표의 다른 항목) | RemoveIPC=no, System clock synchronized: yes, clocksource tsc, /dev/shm 그대로 |
1.4 |
-
설치 명령은 4, 5, 6, 10번이 모두 기본값이면 QuickStart 3.1 그대로 쓴다. 하나라도 다르면 그 값을 한 명령에 모아 첫 설치 때 준다(2.1의 “같이 쓰는 옵션 예”).
cd ~/pkg/gritdb-*/ TMPDIR=<디렉토리> ./install_gritdb.sh --datafiles /data/gritdb/datafiles --pgport 5433- 설치 경로와 데이터 볼륨은 설치한 뒤 바꿀 수 없다(1.5, 2.2, 2.4).
- QuickStart 3.2와 3.3으로 확인한다. 경로와 포트만 바꿔 읽는다. 그다음 2.10으로 간다.
문제가 생기면
- 설치가 실패하면 QuickStart 7장의 GDB-INSTALL 계열과 TroubleShooting을 본다.