10.2 클러스터 시작·정지·재시작
PostgreSQL 클러스터 라이프사이클 명령은 세 단계의 인터페이스가 있다 — pg_ctl(공식), systemctl(OS 통합), OS 패키지가 제공하는 헬퍼 명령. 운영에서는 systemd가 표준이지만 옛 패턴·디버깅에서는 pg_ctl로 직접 다룹니다.
명령 비교
| 작업 | pg_ctl | systemctl (PGDG RHEL) | pg_ctlcluster (Debian) |
|---|---|---|---|
| 시작 | pg_ctl -D <PGDATA> start | systemctl start postgresql-17 | pg_ctlcluster 17 main start |
| 정지 | pg_ctl -D <PGDATA> stop -m fast | systemctl stop postgresql-17 | pg_ctlcluster 17 main stop |
| 재시작 | pg_ctl -D <PGDATA> restart | systemctl restart postgresql-17 | pg_ctlcluster 17 main restart |
| reload (config) | pg_ctl -D <PGDATA> reload | systemctl reload postgresql-17 | pg_ctlcluster 17 main reload |
| 상태 | pg_ctl -D <PGDATA> status | systemctl status postgresql-17 | pg_ctlcluster 17 main status |
운영 표준: systemctl. 부팅 시 자동 시작, 로그 통합, 종속성 관리 등 OS 통합 이점.
정지 모드 — pg_ctl -m
| 모드 | 동작 |
|---|---|
smart (기본) | 모든 클라이언트가 연결을 끊을 때까지 기다림 — 운영에서는 영원히 안 끝남 |
fast | 활성 트랜잭션을 rollback하고 정지. 운영 표준 |
immediate | crash recovery와 동일 — WAL 재생 필요. 비상용 |
pg_ctl -D /var/lib/pgsql/17/data stop -m fastsystemctl은 내부적으로 fast를 씁니다.
시그널 직접 보내기
postmaster는 시그널을 받습니다. 디버깅에 가끔 사용합니다.
| 시그널 | 효과 |
|---|---|
SIGTERM | fast shutdown |
SIGINT | smart shutdown |
SIGQUIT | immediate shutdown |
SIGHUP | reload |
sudo -u postgres kill -HUP $(head -1 $PGDATA/postmaster.pid)postmaster.pid 첫 줄에 PID가 들어 있습니다.
reload vs restart 결정
| 파라미터 변경 | 필요 |
|---|---|
| 옵티마이저 비용·로깅·autovacuum 등 | reload |
pg_hba.conf·pg_ident.conf | reload |
| 메모리·WAL·shared 영역 | restart |
pg_settings.pending_restart로 확인:
SELECT name, setting FROM pg_settings WHERE pending_restart;systemd 유닛 파일
PGDG 패키지의 postgresql-17.service:
[Unit]
Description=PostgreSQL 17
After=syslog.target network-online.target
[Service]
Type=notify
User=postgres
Environment=PGDATA=/var/lib/pgsql/17/data
ExecStart=/usr/pgsql-17/bin/postmaster -D ${PGDATA}
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
KillSignal=SIGINT
TimeoutSec=300
[Install]
WantedBy=multi-user.target| 항목 | 의미 |
|---|---|
Type=notify | systemd가 postgres의 “준비 완료” 신호 대기 (--with-systemd 빌드 필요) |
TimeoutSec=300 | 5분 안에 시작 못 하면 실패 처리 — 큰 WAL 재생에서는 늘려야 |
KillSignal=SIGINT | smart shutdown — 운영에서는 fast(SIGTERM)로 변경 권장 |
override
배포 표준 유닛을 직접 수정하지 말고 systemctl edit 사용:
sudo systemctl edit postgresql-17[Service]
KillSignal=SIGTERM
TimeoutSec=900
Environment=PG_OOM_ADJUST_FILE=/proc/self/oom_score_adj
Environment=PG_OOM_ADJUST_VALUE=-1000PG_OOM_ADJUST_*은 OOM killer가 postmaster를 우선 후순위로 두도록 함 (1.4 참고).
자식 프로세스 보호 (OOM)
기본적으로 backend는 OOM killer가 죽일 수 있다 — postmaster는 무사해도 한 backend가 죽으면 다른 모든 backend 강제 재기동(3.1). PGDG 패키지는 postmaster만 보호하는 게 표준입니다.
세밀히 하려면:
# postgresql.conf
oom_score_adj = 0 # backend 기본postmaster 자체는 systemd 유닛의 PG_OOM_ADJUST_VALUE로 보호. backend가 죽는 건 자연스러운 동작 (3.1 참고).
Debian/Ubuntu의 다중 클러스터
Debian 계열은 한 호스트에 여러 클러스터 운영을 정식 지원합니다.
# 클러스터 목록
pg_lsclusters
# Ver Cluster Port Status Owner Data directory Log file
# 17 main 5432 online postgres /var/lib/postgresql/17/main ...
# 17 staging 5433 online postgres /var/lib/postgresql/17/staging ...
# 새 클러스터 만들기
sudo pg_createcluster 17 reporting --start
# 정지
sudo pg_ctlcluster 17 reporting stop
# 삭제
sudo pg_dropcluster 17 reporting각 클러스터의 systemd 유닛: postgresql@17-main.service. 그룹 postgresql.service가 모두 시작/정지.
시작 시 진단
# 시작 실패 시
sudo journalctl -u postgresql-17 -n 200
sudo tail -200 /var/lib/pgsql/17/data/log/postgresql-*.log흔한 시작 실패 원인:
| 메시지 | 원인 |
|---|---|
could not bind ... Address already in use | 다른 프로세스가 포트 점유 |
database files are incompatible with server | 버전 mismatch — pg_upgrade 필요 |
directory ... is not empty (initdb) | 옛 데이터 디렉토리 |
lock file already exists | crash 후 stale postmaster.pid — 안전 확인 후 수동 삭제 |
could not load library | shared_preload_libraries에 존재하지 않는 모듈 |
정상 종료의 의미
PostgreSQL이 정상 종료(fast shutdown)되면:
- 새 연결 거부
- 활성 트랜잭션 rollback
- dirty page를 디스크에 모두 flush
- WAL 안전 위치까지 fsync
postmaster.pid삭제- exit
postmaster.pid가 남아 있으면 죽지 않았거나 비정상 종료합니다. 운영 시 systemctl이 이걸 자동 정리하지만, 수동 정리가 필요한 경우 프로세스 모두 죽은 것 확인 후.
ps -ef | grep postgres # 잔존 프로세스 확인
# 모두 없으면
sudo rm $PGDATA/postmaster.pid정상 종료의 비용 — 큰 클러스터
종료 시점에 dirty page가 매우 많으면 flush가 수 분 걸립니다. 운영 점검 시간 잡을 때 고려.
대응:
- 종료 전
CHECKPOINT;명시 호출 checkpoint_completion_target을 평소 0.9로 두어 dirty 페이지 누적 줄임
강제 종료가 필요한 경우
- 클러스터가 응답 없음, 핵심 무관 작업
- 디스크 풀로 백그라운드 작업 실패
- 백업·복구 절차의 한 단계
# 정지 못 하면 kill -9 (immediate)
sudo systemctl kill -s SIGQUIT postgresql-17
# 또는
sudo pkill -9 postgres # 매우 위험immediate 종료 후 재기동 시 WAL 재생 — 시간 걸림. 일관성은 유지합니다.
kill -9 postmaster는 마지막 수단. 데이터 손상은 안 되지만 이후 재기동이 한참 걸리고, 인덱스·통계가 일시 불일치 상태일 수 있습니다.정리
- 표준은 systemctl (RHEL) 또는 pg_ctlcluster (Debian)
- 정지 모드는 fast — smart는 운영에서 영원히 안 끝남
- reload vs restart는
pg_settings.pending_restart로 판단 - systemd 오버라이드로 OOM 보호·timeout 조절
- 시작 실패 진단은
journalctl+ PostgreSQL 로그 - 비정상 종료 후 stale
postmaster.pid는 잔존 프로세스 확인 후 수동 정리
다음 절(10.3)에서는 운영자의 눈인 로깅을 봅니다.