날씨 정보를 불러오는 중...

Redis 소개와 이중화(HA) 구성 가이드 - Redis 2대 + Sentinel 1대 (RHEL 기준)

2026-09-02 06:36 · IT기술 · 조회 42
Redis 이중화 구성 가이드

Redis 소개와 이중화(HA) 구성 가이드

오늘은 캐시 서버로 가장 많이 쓰이는 Redis에 대해 소개하고, RHEL 계열(RHEL/Rocky Linux/CentOS Stream) 서버 기준으로 Redis 2대 + Sentinel 1대 구조의 이중화(HA) 구성을 설치 명령어와 함께 정리해봅니다.

intro Redis란?

Redis(Remote Dictionary Server)는 메모리 상에 데이터를 저장하는 오픈소스 인메모리 key-value 스토어입니다. 디스크 기반 RDBMS와 달리 데이터를 RAM에 두고 처리하기 때문에 응답 속도가 마이크로초 단위로 매우 빠른 것이 특징입니다.

  1. 단순 캐시 그 이상 — String뿐 아니라 List, Hash, Set, Sorted Set, Stream 등 다양한 자료구조를 지원한다.
  2. 영속성 지원 — RDB(스냅샷)와 AOF(Append Only File) 방식으로 메모리 데이터를 디스크에 백업할 수 있어 재시작 시에도 데이터를 복구할 수 있다.
  3. 복제(Replication)와 고가용성 — Master-Replica 복제, Sentinel(자동 장애조치), Cluster(샤딩) 구성을 표준으로 제공한다.
  4. 싱글 스레드 이벤트 루프 — 명령어가 원자적으로 처리되어 동시성 문제가 적고, 락(lock) 없이도 안전하게 카운터/큐 등을 구현할 수 있다.

usecase Redis는 언제, 어떻게 사용할까?

Redis는 "빠른 읽기/쓰기가 필요하지만 데이터가 유실되어도 원본(DB)에서 복구 가능한" 영역에 주로 사용됩니다.

cache 1. 캐시(Cache) — 가장 대표적인 용도

  1. DB 조회 결과를 Redis에 TTL(만료시간)과 함께 저장해두고, 같은 요청이 오면 DB 대신 Redis에서 즉시 응답한다.
  2. 예: 게시글 조회수, 상품 상세 정보, 자주 조회되는 통계 데이터 등

2. 세션 클러스터링(Session Store)

  1. WAS(톰캣 등)가 여러 대로 스케일아웃될 때, 로그인 세션을 각 WAS 메모리 대신 Redis에 중앙 저장해서 어느 서버로 요청이 가도 로그인 상태가 유지되게 한다.

3. 메시지 큐 / Pub-Sub

  1. List 자료구조로 간단한 작업 큐(Job Queue)를 구현하거나, Pub/Sub 기능으로 실시간 알림/채팅 브로드캐스트에 사용한다.

4. 분산 락(Distributed Lock) / Rate Limiting

  1. SETNX, EXPIRE 조합으로 여러 서버 간 동시 실행을 막는 분산 락을 구현하거나, API 호출 횟수를 제한하는 Rate Limiter를 구현한다.

5. 실시간 랭킹/집계

  1. Sorted Set으로 실시간 순위表(랭킹), 인기글 집계 같은 기능을 빠르게 처리한다.

반대로, 영구 보관이 반드시 필요한 원본 데이터(정산, 계약 정보 등)는 RDBMS에 두고 Redis는 어디까지나 "빠른 보조 저장소"로 쓰는 것이 정석입니다.

arch 이중화 구성 개요 (Redis 2대 + Sentinel 1대)

Redis 단일 서버는 그 서버가 죽으면 서비스 전체에 영향을 주는 SPOF(단일 장애점)가 됩니다. 이를 막기 위해 Master-Replica 복제 + Sentinel 자동 장애조치 구조로 이중화를 구성합니다.

  1. redis-01 (Master) — 실제 쓰기(write)를 받는 주 서버. 예시 IP: 192.168.10.11
  2. redis-02 (Replica) — Master 데이터를 실시간 복제받는 예비 서버. 예시 IP: 192.168.10.12
  3. sentinel-01 — Master/Replica 상태를 감시하다가 Master 장애 시 Replica를 새 Master로 승격시키는 감시자. 예시 IP: 192.168.10.13

동작 방식: 클라이언트는 평소 Sentinel에게 "지금 Master가 누구냐"를 물어보고 그 주소로 접속합니다. Sentinel이 Master의 장애를 감지하면 Replica를 새 Master로 승격(failover)시키고, 이후 클라이언트 조회 시 새 Master 주소를 알려줍니다.

주의 참고: Sentinel 1대 구성의 한계

  1. Sentinel은 원래 장애 판단(quorum)을 위해 홀수로 3대 이상 두는 것이 정석입니다. Sentinel이 1대뿐이면 그 Sentinel 자체가 죽었을 때 자동 장애조치가 아예 동작하지 않는 SPOF가 됩니다.
  2. 이번 가이드는 요청하신 대로 Redis 2대 + Sentinel 1대 최소 구성으로 진행하되, quorum 값을 1로 설정합니다. 운영 환경에서 안정성을 더 높이려면 Sentinel을 3대로 늘리는 것을 권장합니다.

prep 사전 준비 작업 (3대 서버 공통)

실습 환경: RHEL 9 / Rocky Linux 9 (RHEL 8 계열도 명령어 동일, 모듈명만 차이가 있을 수 있음)

1) hosts 파일 등록 (3대 모두)

sudo tee -a /etc/hosts <<EOF
192.168.10.11 redis-01
192.168.10.12 redis-02
192.168.10.13 sentinel-01
EOF

2) 방화벽 포트 개방 (3대 모두)

# Redis: 6379, Sentinel: 26379
sudo firewall-cmd --permanent --add-port=6379/tcp
sudo firewall-cmd --permanent --add-port=26379/tcp
sudo firewall-cmd --reload

3) SELinux 컨텍스트 확인 (기본 포트 사용 시 별도 조치 불필요, 포트 변경 시에만 필요)

# Redis 포트를 기본값(6379)이 아닌 값으로 바꿀 경우에만 필요
sudo semanage port -a -t redis_port_t -p tcp <변경할포트>
# semanage가 없다면: sudo dnf install -y policycoreutils-python-utils

4) 커널 파라미터 튜닝 (Redis 2대에서만, 공식 권장 설정)

# overcommit 설정 (fork 시 메모리 부족 경고 방지)
echo 'vm.overcommit_memory = 1' | sudo tee /etc/sysctl.d/redis.conf
sudo sysctl -p /etc/sysctl.d/redis.conf

# Transparent Huge Pages 비활성화 (레이턴시 저하 방지)
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
sudo tee /etc/systemd/system/disable-thp.service <<EOF
[Unit]
Description=Disable Transparent Huge Pages (THP)
[Service]
Type=oneshot
ExecStart=/bin/sh -c "echo never > /sys/kernel/mm/transparent_hugepage/enabled"
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl enable --now disable-thp

install Redis 서버 설치 (redis-01, redis-02 공통)

1) Redis 패키지 설치

# RHEL 9 / Rocky 9 기본 AppStream 저장소에 redis 모듈 포함
sudo dnf install -y redis

# 설치된 버전 확인
redis-server --version

※ 더 최신 버전(7.x)이 필요하면 Remi 저장소를 추가해서 설치할 수 있습니다.

sudo dnf install -y https://rpms.remirepo.net/enterprise/remi-release-9.rpm
sudo dnf module reset redis -y
sudo dnf module enable redis:remi-7.2 -y
sudo dnf install -y redis

2) redis-01 (Master) 설정 — /etc/redis/redis.conf 수정

sudo vi /etc/redis/redis.conf
# 외부 접속 허용 (실제 운영에서는 필요한 IP만 명시 권장)
bind 0.0.0.0 -::1
protected-mode yes

# 인증 비밀번호 설정 (Sentinel, Replica와 동일하게 맞춰야 함)
requirepass RedisStr0ngP@ss

# 데몬으로 실행
daemonize no
supervised systemd

# 영속성: AOF 활성화 권장 (데이터 유실 최소화)
appendonly yes
appendfsync everysec

# 로그/PID 경로는 패키지 기본값 사용
logfile /var/log/redis/redis.log

3) redis-02 (Replica) 설정 — /etc/redis/redis.conf 수정

sudo vi /etc/redis/redis.conf
bind 0.0.0.0 -::1
protected-mode yes
requirepass RedisStr0ngP@ss

# Master 인증 비밀번호 (Master의 requirepass와 동일하게)
masterauth RedisStr0ngP@ss

# 이 서버를 redis-01의 Replica로 지정
replicaof 192.168.10.11 6379

daemonize no
supervised systemd
appendonly yes
appendfsync everysec
logfile /var/log/redis/redis.log

4) 서비스 시작 및 부팅 시 자동 시작 (redis-01, redis-02 각각)

sudo systemctl enable --now redis
sudo systemctl status redis

5) 복제 상태 확인

# redis-01(Master)에서 확인
redis-cli -a RedisStr0ngP@ss INFO replication
# role:master
# connected_slaves:1
# slave0:ip=192.168.10.12,port=6379,state=online,...

# redis-02(Replica)에서 확인
redis-cli -a RedisStr0ngP@ss INFO replication
# role:slave
# master_host:192.168.10.11
# master_link_status:up

6) 복제 동작 테스트

# redis-01(Master)에서 데이터 입력
redis-cli -a RedisStr0ngP@ss SET greeting "hello-redis"

# redis-02(Replica)에서 즉시 조회 (읽기 전용)
redis-cli -a RedisStr0ngP@ss GET greeting
# "hello-redis" 가 출력되면 복제 정상

sentinel Sentinel 서버 설치 및 설정 (sentinel-01)

Sentinel은 Redis 패키지에 함께 포함되어 있어 별도 패키지 설치 없이 설정 파일만 구성하면 됩니다.

1) Redis 패키지 설치 (Sentinel 실행 파일 포함)

sudo dnf install -y redis

2) Sentinel 설정 — /etc/redis/sentinel.conf 수정

sudo vi /etc/redis/sentinel.conf
bind 0.0.0.0 -::1
protected-mode yes
port 26379

# 데몬으로 실행
daemonize no
supervised systemd

# 감시할 Master 이름(mymaster), IP, 포트, quorum(장애 판단에 필요한 최소 동의 수)
sentinel monitor mymaster 192.168.10.11 6379 1

# Master/Replica 접속 비밀번호 (redis.conf의 requirepass와 동일해야 함)
sentinel auth-pass mymaster RedisStr0ngP@ss

# Master가 응답 없을 때 장애로 판단하기까지 대기 시간(ms)
sentinel down-after-milliseconds mymaster 5000

# 승격 시 동시에 재동기화할 Replica 수
sentinel parallel-syncs mymaster 1

# 장애조치 전체 타임아웃(ms)
sentinel failover-timeout mymaster 10000

logfile /var/log/redis/sentinel.log

3) 서비스 시작

sudo systemctl enable --now redis-sentinel
sudo systemctl status redis-sentinel

4) Sentinel 동작 확인

# 현재 Master 정보 조회
redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
# 192.168.10.11
# 6379

# 감시 중인 Master/Replica 상태 요약
redis-cli -p 26379 SENTINEL masters
redis-cli -p 26379 SENTINEL replicas mymaster

failover 장애조치(Failover) 테스트

실제로 Master를 내려서 Sentinel이 Replica를 새 Master로 자동 승격시키는지 확인합니다.

  1. redis-01(Master) 서비스 중지
    # redis-01에서 실행
    sudo systemctl stop redis
  2. sentinel-01 로그에서 장애 감지 확인
    sudo tail -f /var/log/redis/sentinel.log
    # +sdown master mymaster 192.168.10.11 6379
    # +odown master mymaster 192.168.10.11 6379
    # +failover-state-select-slave ...
    # +switch-master mymaster 192.168.10.11 6379 192.168.10.12 6379
  3. 새 Master 확인
    redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
    # 192.168.10.12
    # 6379  (← redis-02가 새 Master로 승격됨)
  4. 기존 redis-01 복구 시 자동으로 새 Master의 Replica로 재편입
    # redis-01에서 다시 서비스 시작
    sudo systemctl start redis
    # Sentinel이 redis-01을 redis-02(신규 Master)의 Replica로 자동 전환시킴
    redis-cli -a RedisStr0ngP@ss -p 6379 INFO replication

tip 운영 팁 및 주의사항

  1. 비밀번호 통일 — redis.conf의 requirepass, masterauth와 sentinel.conf의 auth-pass는 반드시 동일한 값으로 맞춰야 한다. 하나라도 다르면 복제/장애조치가 실패한다.
  2. 애플리케이션 연결은 Sentinel 경유 — 애플리케이션(Jedis, Lettuce 등 클라이언트 라이브러리)은 Redis IP를 직접 바라보지 말고 Sentinel 목록을 등록해서 현재 Master를 동적으로 조회하도록 구성해야 failover가 무의미해지지 않는다.
  3. Sentinel은 홀수 대수 권장 — 위에서 언급했듯 운영 환경에서는 Sentinel을 3대 이상 홀수로 구성해 quorum 기반 오탐(false positive)을 줄이는 것이 정석이다.
  4. 영속성 백업 — appendonly(AOF) 외에도 정기적으로 RDB 스냅샷이나 AOF 파일을 별도 스토리지에 백업해두면 두 대가 동시에 장애가 나는 최악의 상황에도 복구할 수 있다.
  5. 메모리 관리 — maxmemory와 maxmemory-policy(예: allkeys-lru)를 설정해 메모리 초과 시 오래된 캐시부터 자동 축출되도록 구성한다.

wrap 마무리

Redis는 빠른 인메모리 저장소이자 캐시, 세션 저장소, 메시지 큐 등 다양한 용도로 활용되는 인프라 핵심 컴포넌트입니다. 오늘 정리한 Master-Replica + Sentinel 구조는 Redis 공식 문서에서 제공하는 표준 HA 패턴이며, 실제 운영에서는 Sentinel 대수를 늘리거나 Redis Cluster(샤딩)로 확장하는 것도 고려해볼 수 있습니다.

더 자세한 내용은 Redis 공식 Sentinel 문서를 참고하세요. 버전별로 설정 파라미터나 기본 경로가 다를 수 있으니 실제 적용 전 설치된 Redis 버전 문서를 함께 확인하시기 바랍니다.


댓글 0

로그인 후 댓글을 작성할 수 있습니다.