📌 1. 서론 — 왜 PostgreSQL 최적화가 중요한가
MSA 환경에서는 서비스 수가 늘어나면서 DB는 단순 저장소가 아니라 병목의 중심이 된다.
특히 PostgreSQL은 강력하지만, 기본 설정 그대로 쓰면 성능을 못 뽑는다.
👉 결론 먼저:
- PostgreSQL 성능 = 설정 + 쿼리 + 아키텍처
- MSA에서는 DB 튜닝이 아니라 DB 전략 설계까지 포함된다
📌 2. PostgreSQL 핵심 최적화 설정
2.1 메모리 튜닝 (가장 영향 큼)
shared_buffers = 25% of RAM
work_mem = 16MB ~ 64MB
maintenance_work_mem = 256MB ~ 1GB
effective_cache_size = 50~75% of RAM
work_mem = 16MB ~ 64MB
maintenance_work_mem = 256MB ~ 1GB
effective_cache_size = 50~75% of RAM
✔ 핵심 포인트
- shared_buffers: DB 캐시 → 너무 작으면 디스크 IO 폭발
- work_mem: 정렬/조인 → 쿼리 성능 직결
- effective_cache_size: 옵티마이저 판단 기준
👉 실무 기준:
- shared_buffers 8GB 이상이면 대부분 충분
- work_mem 과도 설정하면 커넥션 수 × 메모리 터짐
2.2 WAL / 체크포인트 튜닝
wal_buffers = 16MB
checkpoint_completion_target = 0.9
max_wal_size = 2GB ~ 8GB
min_wal_size = 1GB
checkpoint_completion_target = 0.9
max_wal_size = 2GB ~ 8GB
min_wal_size = 1GB
✔ 핵심 포인트
- WAL은 쓰기 성능 핵심
- checkpoint 자주 발생하면 성능 급락
👉 실무 기준:
- TPS 높은 시스템 → WAL 튜닝 필수
- 특히 결제/정산 시스템에서 중요
2.3 커넥션 관리 (MSA에서 매우 중요)
max_connections = 100~300
👉 하지만 진짜 핵심은:
✔ PgBouncer 사용
이유
- MSA → 서비스 수 많음 → DB 커넥션 폭증
- PostgreSQL은 커넥션 비용이 비쌈
👉 결론:
- max_connections 늘리는 게 아니라
- connection pool 계층 추가가 정답
2.4 Autovacuum 튜닝
autovacuum = on
autovacuum_max_workers = 5
autovacuum_naptime = 10s
autovacuum_max_workers = 5
autovacuum_naptime = 10s
✔ 핵심 포인트
- PostgreSQL은 MVCC 구조 → dead tuple 발생
- vacuum 안 돌면 성능 계속 떨어짐
👉 실무 팁:
- 대용량 테이블은 manual vacuum 전략 필요
2.5 인덱스 전략
✔ 필수
- B-tree (기본)
- Partial Index
- Composite Index
✔ 고급
- GIN (Full-text / JSONB)
- BRIN (대용량 로그 테이블)
👉 실무 핵심:
- 인덱스 = 성능이 아니라 쓰기 비용과 트레이드오프
📌 3. MSA에서 PostgreSQL의 역할 변화
MSA에서는 DB가 단순 저장소가 아니라
👉 서비스 경계(boundary)의 핵심 요소
3.1 Database per Service
구조
User Service → user_db
Order Service → order_db
Payment Service → payment_db
Order Service → order_db
Payment Service → payment_db
✔ 장점
- 서비스 독립성 확보
- 장애 격리
- 스키마 충돌 없음
✔ 단점
- 데이터 조인 불가
- 분산 트랜잭션 필요
3.2 스키마 분리 vs DB 분리
방식특징
| DB 분리 | 완전 격리, 운영비 증가 |
| Schema 분리 | 비용 절감, 격리 약함 |
👉 실무 기준:
- 초기: schema 분리
- 확장: DB 분리
3.3 트랜잭션 전략 변화
MSA에서는 ACID 대신:
👉 Eventually Consistent
사용 패턴
- Saga Pattern
- Outbox Pattern
- Event-driven (Kafka)
📌 4. PostgreSQL + MSA 조합의 장점
4.1 강력한 JSON 지원
SELECT data->>'name' FROM users;
👉 장점:
- 스키마 유연성 확보
- NoSQL 일부 대체 가능
4.2 확장성 (Extension)
- pg_stat_statements → 쿼리 분석
- PostGIS → 위치 기반
- TimescaleDB → 시계열
👉 즉:
- PostgreSQL = 단순 RDB가 아니라 플랫폼
4.3 Read Replica 전략
Primary → Write
Replica → Read
Replica → Read
👉 MSA에서:
- 조회 서비스 분리 가능
- CQRS 구조에 적합
📌 5. 실무 아키텍처 예시
[API Gateway]
↓
[Service Layer]
├ auth-service → PostgreSQL (auth_db)
├ order-service → PostgreSQL (order_db)
├ payment-service → PostgreSQL (payment_db)
↓
[PgBouncer]
↓
[PostgreSQL Cluster]
├ Primary
├ Replica 1
├ Replica 2
↓
[Service Layer]
├ auth-service → PostgreSQL (auth_db)
├ order-service → PostgreSQL (order_db)
├ payment-service → PostgreSQL (payment_db)
↓
[PgBouncer]
↓
[PostgreSQL Cluster]
├ Primary
├ Replica 1
├ Replica 2
📌 6. 결론 — PostgreSQL은 설정이 아니라 전략이다
정리하면:
✔ 단일 서비스:
- 튜닝 중심 (메모리, WAL, 인덱스)
✔ MSA:
- 설계 중심 (DB 분리, 트랜잭션 전략, 커넥션 관리)
📌 핵심 한 줄
👉 “PostgreSQL 성능은 설정이 아니라 아키텍처에서 결정된다”
LIST
'Platform > Database' 카테고리의 다른 글
| 관계형 데이터베이스와 비관계형 데이터베이스에 대해 설명해주세요. (0) | 2026.03.20 |
|---|---|
| Kysely 언제 써야 하는가 — QueryDSL 대안으로서 Node 백엔드에서의 정확한 사용 시점 (0) | 2026.03.19 |
| OpenSearch 성능을 10배 끌어올리는 설계 전략: 인덱스, 샤딩, 쿼리 최적화까지 실무 가이드 (0) | 2026.03.19 |
| OpenSearch와 MinIO로 보는 오픈소스 인프라의 진화: 배경, 성능, 그리고 커뮤니티까지 실무 관점에서 고찰 (0) | 2026.03.19 |
| MSA에서 MinIO가 필요한 이유: 파일 저장을 서비스에서 분리하는 아키텍처 설계 (0) | 2026.03.19 |
