Redis 운영 중 발생하는 주요 문제와 최적화 방안

fork 작업으로 인한 고성능 요청 지연

RDB 스냅샷 생성이나 AOF 재작성 시 디스크 I/O 작업이 발생하며 메인 프로세스가 하위 프로세스를 fork합니다. 이때 하위 프로세스는 상위 프로세스의 메모리 페이지 테이블을 복제하는데, 10GB 메모리 기준 약 200ms가 소요될 수 있습니다. info statslatest_fork_usec로 마지막 fork 시간을 확인 가능합니다. 초당 수만 건 처리 환경에서 이 지연은 요청 처리 시간을 1초 이상으로 늘릴 수 있습니다.

# 최적화 방안
redis-server --maxmemory 10gb  # 메모리 제한 설정
slaveof master_ip 6379         # 10GB 이하 슬레이브에서 전체 복제 수행

AOF 블로킹 문제

everysec 설정 시 2초 이상 fsync 지연 발생하면 쓰기 작업이 차단됩니다. AOF 버퍼에 데이터 기록 후 별도 스레드가 fsync를 실행하지만, 메인 스레드는 fsync 간격을 모니터링하여 지연 시 블로킹을 유발합니다.

# 최적화 방안
# SSD 저장장치 사용 권장
# 설정 파일 수정
appendfsync everysec
appendfilename "ssd_aof.log"

복제 지연 모니터링

마스터-슬레이브 간 복제 지연이 발생할 수 있으며, info replicationoffset 차이로 지연량을 계산합니다. 임계값 초과 시 알림 시스템을 구현해야 합니다.

# 지연 감지 스크립트 예시
master_offset=$(redis-cli -h master info replication | grep offset)
slave_offset=$(redis-cli -h slave info replication | grep offset)
if (( master_offset - slave_offset > 10000 )); then
  send_alert "Replication Lag Alert"
fi

복제 스톰 현상

다중 슬레이브가 동시에 전체 복제를 요청하면 네트워크 대역폭 포화 상태가 발생합니다. 슬레이브가 여러 개인 경우 스타 구조보다 트리 구조를 권장합니다.

vm.overcommit_memory 설정

fork 실패 방지를 위해 값 설정이 필요합니다:

# 권장 설정 값
sudo sysctl vm.overcommit_memory=1
echo "vm.overcommit_memory=1" | sudo tee -a /etc/sysctl.conf

swappiness 조정

커널 버전별 설정 차이:

# 커널 버전 확인
uname -r
# 3.5 미만: 
echo 0 | sudo tee /proc/sys/vm/swappiness
# 3.5 이상: 
echo 1 | sudo tee /proc/sys/vm/swappiness

파일 핸들 제한 상향

운영체제별 설정 방법:

# Linux 시스템 예시
ulimit -n 65535
echo "* soft nofile 65535" | sudo tee -a /etc/security/limits.conf

TCP 백로그 설정

# 커널 파라미터 조정
echo 2048 | sudo tee /proc/sys/net/core/somaxconn
sysctl -w net.core.somaxconn=2048

태그: Redis RDB AOF 복제 fork

5월 22일 02:27에 게시됨