돈을 쓰는 법
서버 증설
온프레미스 방식일 경우, 서버를 scale - up scale - out 한다면 확실하게 해결된다. 단 scale - up의 경우 하드웨어의 한계가 명확하다.
보통 scale - out을 하고, ups 등과 같은 백업 전원 시설까지 한다면 더욱 안정성이 높아지겠다.
클라우드 자원 증설
더 좋은 인스턴스를 차용하는 것이 도움이 될것 같다(사실 아직 잘 모르겠다 이 부분은)
기술적 해결
캐시 사용
- 자주 쓰는 데이터를 캐시에서 꺼내 쓰도록 한다.
로드 밸런싱
로드 밸런싱이란, 적절한 인스턴스에 트래픽을 적절하게 분산시켜 어느한쪽에 부하가 일어나지 않도록 하는 것이다.
많은 양의 트래픽이 일어 났을 떄 앞서 말한 scale - out을 한 다면 여러 개의 서버가 처리할 수 있을 것이다. 이때 그냥 공평하게 나눠서 주는게 아니라, 적절한 알고리즘으로 트래픽을 서버에 나눈다면 더 좋은 효율을 낼 수 있다. 이를 로드 밸런싱이라고 한다. 여러가지 로드 밸런싱 알고리즘이 있다.
DB 튜닝
- 쿼리 최적화
(1) 인덱스 활용
인덱스 추가: 자주 조회되는 컬럼(WHERE 조건, JOIN, ORDER BY)에 인덱스를 생성합니다.
복합 인덱스: 여러 컬럼을 함께 조회할 때 복합 인덱스를 사용하여 성능을 개선합니다.
예: CREATE INDEX idx_user_order ON users (user_id, order_date);
인덱스 과다 사용 주의: 과도한 인덱스는 쓰기 성능을 저하시킬 수 있습니다.
(2) 쿼리 리팩토링
불필요한 SELECT 제거: 필요한 컬럼만 SELECT.
JOIN 최소화: 필요 없는 JOIN 제거, 하위 쿼리로 대체.
GROUP BY 최적화: 그룹핑이 필요한 경우 인덱스를 활용.
(3) 실행 계획 분석
EXPLAIN 또는 EXPLAIN ANALYZE 명령어를 사용해 쿼리 실행 계획을 확인하고, 병목 지점을 식별합니다.
예: EXPLAIN SELECT * FROM orders WHERE user_id = 100;
- 데이터베이스 구조 최적화
(1) 정규화와 비정규화
정규화: 중복 데이터를 제거하여 저장 공간 절약 및 데이터 무결성 유지.
비정규화: 조회 성능을 높이기 위해 중복 데이터를 허용하거나 테이블을 결합.
예: 조회 성능이 중요한 경우 JOIN을 줄이기 위해 데이터 복제.
(2) 파티셔닝 (Partitioning)
데이터를 논리적으로 분할하여 대용량 데이터에 대한 쿼리를 효율적으로 처리.
수평 파티셔닝: 특정 조건에 따라 행을 분리 (예: 날짜별).
수직 파티셔닝: 컬럼을 분리 (예: 자주 사용하는 컬럼과 그렇지 않은 컬럼 분리).
- 캐싱
(1) 애플리케이션 레벨 캐싱
Redis, Memcached와 같은 캐시 시스템을 사용하여 DB 부하를 줄임.
예: 자주 조회되는 데이터를 캐시에 저장.
(2) 쿼리 결과 캐싱
데이터베이스 내에서 자주 실행되는 쿼리의 결과를 캐싱.
일부 DBMS(MySQL, PostgreSQL 등)에서는 쿼리 결과를 캐시로 활용 가능.
- 데이터 처리 기법
(1) 배치 처리
실시간 처리가 필요하지 않은 작업은 배치로 처리하여 DB 부하를 분산.
예: 야간에 데이터 집계.
(2) Sharding
데이터를 물리적으로 여러 데이터베이스에 분산 저장.
예: 사용자 ID를 기준으로 DB를 분리 (DB1: ID 11000, DB2: ID 10012000).
- 시스템 자원 활용
(1) 커넥션 풀
데이터베이스 연결 수를 제한하여 과도한 연결로 인한 성능 저하 방지.
(2) I/O 최적화
데이터 파일과 로그 파일을 별도의 디스크에 저장하여 디스크 I/O 병목 제거.
SSD 사용으로 디스크 성능 향상.
(3) 메모리 튜닝
적절한 Buffer Pool 및 Cache 크기 설정으로 읽기/쓰기 성능 최적화.
- DBMS 특화 기능 활용
(1) MySQL
Query Cache: MySQL의 쿼리 캐시 활용.
InnoDB Tuning: innodb_buffer_pool_size 조정을 통해 메모리 사용 최적화.
(2) PostgreSQL
Parallel Query: 대용량 쿼리를 병렬 처리.
Vacuum/Analyze: 정기적으로 테이블을 최적화.
(3) Oracle
Partitioning, Index-Organized Tables: 대용량 테이블 처리 성능 향상.
Optimizer Hints: 실행 계획을 수동으로 조정.
- 모니터링 및 지속적인 개선
모니터링 도구 활용:
pg_stat_activity (PostgreSQL), Performance Schema (MySQL).
APM(Application Performance Monitoring) 도구 (예: New Relic, Datadog).
성능 모니터링 후 병목 구간을 주기적으로 수정.