본문 바로가기

Software Engineering/Redis

[Redis] replication, sentinel HA 적용을 위한 사전 지식

사진: Unsplash 의 Marek Piwnicki

 

Redis HA 구성을 위해서는 replication, sentinel 구성이 필요합니다. 실제 서버 적용에 앞서 replication이 어떻게 동작하는지, sentinel을 어떻게 구성해야하는지 정리해보았습니다. 내용은 실제 수행 순서와는 상관이 없습니다.

Replication의 개념

실제 운영에 사용되는 메인 레디스 인스턴스를 master, 복제 인스턴스를 replica라고 하겠습니다.

  • redis replication은 replica 인스턴스가 master를 구독하는 형태로 설정된다.
  • 즉, replication 설정은 replica 인스턴스에서 진행한다.
  • replica 인스턴스는 오직 하나의 master만을 가질 수 있다.
  • replica 인스턴스는 또 다른 인스턴스의 master가 될 수 있다.
  • replica 인스턴스에서 slaveof <master ip> <masterport> 명령어로 설정 할 수 있다.
  • conf 파일을 동일하게 수정하여 설정하는 방법도 있다.
  • master에 연결된 replica 인스턴스에서 run time에 cli를 사용하여 replicaof no one 명령어를 실행하면 replication이 중단된다.
  • master에 장애가 발생한 경우 replica의 연결을 끊고 master를 초기화 해야한다. 그렇지 않으면 초기화 명령도 전파가 된다.
  • replication이 수행되면 master 서버에서는 항상 fork를 수행하여 백그라운드에서 동기화를 수행한다.
  • 이로 인해 master 서버에서는 RDB 설정과 상관 없이 replication으로 인한 메모리 사용량이 최대 2배까지 증가할 수 있다.
  • replica는 read-only 옵션이 기본으로 설정되어, replica 상태에서 write 동작을 수행할 수 없다. (replica-read-only yes)

Replication을 사용한 무중단 migration 전략

replicaof, replica-read-only 항목을 사용하여 최대한 서비스 중단 없이 migration을 할 수 있는 방법에 알아보겠습니다.

  • 현재 서비스 중인 인스턴스를 master, 이동하려는 신규 인스턴스를 replica로 설정합니다.
  • replication을 설정하여 master의 데이터를 replica로 지속 전달합니다.
  • replica의 replica-read-only 옵션을 no로 변경하여 replica 인스턴스의 쓰기 동작을 허용 합니다.
  • client가 replica에 접속하도록 변경합니다. 이때 publisher는 master에 데이터를 생성 중입니다.
  • publisher가 replica에 데이터를 입력하도록 변경합니다.
  • slave의 salveof 설정을 no one으로 변경합니다.
  • master 인스턴스를 제거하고, replica를 새로운 master로 사용합니다.

위 순서대로 작업을 진행하면, 서비스 중단 없이 redis 서버의 마이그레이션이 가능합니다.

sentinel이 하는 일

sentinel을 redis 서버의 상태를 확인하여 fail-over 동작을 수행합니다. 크게 3가지의 세부 기능으로 구분 할 수 있습니다.

  • master 인스턴스의 장애를 판단한다.
  • replica 인스턴스 중 1개를 선택하여 master로 변경한다.
  • master 인스턴스가 변경되었음을 클라이언트에게 알린다. (pub/sub)

sentinel이 master 장애를 판단하는 방법

  • sentinel은 master 인스턴스에 ping 명령을 전송하고, 응답 시간을 확인하여 장애를 판단한다.
  • 순간적인 네트워크 문제로 응답 지연이 발생할 경우, master를 장애로 판단하지 않도록 다수개의 sentinel을 구성하고 장애 판단 정족수 이상이 master를 장애로 판단할 경우 fail-over 프로세스를 수행한다.
  • 정족수는 실제 센티낼의 수 보다 작아야 하며, 전체 센티낼 개수의 과반 수 이상으로 설정한다.
  • 하나의 센티넬이 장애로 진단한 경우를 SDOWN 상태 (subjectively down), 정족수 이상이 장애로 진단한 경우를 ODOWN 상태 (objectively down)이라고 한다.
  • SDOWN은 master 인스턴스의 마지막 응답(last_avail_time) 부터 doen_after_period 시간 동안 응답이 없는 경우 설정된다.

sentinel 운영을 위한 config

기본적으로 설정해야하는 내용은 아래와 같습니다. 센티넬은 하나의 인스턴스가 여러개의 cluster를 모니터링 하도록 설정 할 수 있습니다.

  • port 26379
  • sentinel monitor <cluster name> <master ip> <master port> <정족수>
  • sentinel auth-pass <cluster name> <password>    # master redis 비밀번호
  • sentinel down-after-milliseconds <cluster name> <밀리초>
  • sentinel failover-timeout <cluster name> <밀리초>    # fail-over 타임아웃
  • sentinel can-failover <clouster name> <yes or no>    # fail-over 사용 우무
  • sentinel parallel-sync <cluster name> <slave 숫자>    # fail-over 후 몇 개의 slave가 동기화 된 후 클라이언트에게 알릴 것인가

sentinel 기본 정보

  • sentinel 설정 파일의 기본 경로는 /etc/redis/sentinel.conf 이다.
  • 실행 명령 /usr/bin/redis-sentinel /etc/redis/sentinel.conf
  • 필요시 서비스로 등록 (유의 해야함)

sentinel 동작 상태 확인을 위한 명령어

  • sentinel master <cluster name>
  • sentinel replicas <cluster name>
  • sentinel sentinels <cluster name>
  • sentinel get-master-addr-by-name <cluster name>    # 현재 마스터의 주소 확인하기

client 접속 주소

클라이언트는 구성된 sentinel의 주소 중 한 곳으로 접속해야합니다. 대부분의 클라이언트 드라이버는 내부적으로 sentinel을 인식하여, get-master-addr-by-name 명령을 수행하고 반환된 현재 master의 주소로 접속을 시도 합니다.

from redis.sentinel import Sentinel
import time

# Sentinel 구성
sentinel = Sentinel([('127.0.0.4', 5000), ('127.0.0.5', 5001), ('127.0.0.6', 5002)])

# 'my-master'에 대한 Redis 연결 객체 가져오기
master = sentinel.master_for('my-master', socket_timeout=0.1)

# 키-값 세팅 및 확인
try:
    master.set('key', 'initial_value')
    print('Initial value:', master.get('key'))
except Exception as e:
    print(f"Error during initial write: {e}")

# 마스터 장애가 발생한 경우 fail-over 처리 확인
print("Simulating master fail-over...")
time.sleep(10)  # Fail-over가 진행되도록 충분한 시간 대기

try:
    # 새 마스터에 연결되어 있는지 확인
    master.set('key', 'new_value')
    print('New value after fail-over:', master.get('key'))
except Exception as e:
    print(f"Error during fail-over write: {e}")

참고 문서

 

High availability with Redis Sentinel

High availability for non-clustered Redis

redis.io

 

Redis 운영 관리 - 예스24

Redis는 데이터를 빠르게 처리한다는 성능적인 장점과 함꼐 큰 기업에서 사용할 정도로 안정성이 검증되어 많은 곳에서 사용하고 있다. 하지만 Redis를 어떻게 사용하는지 제대로 알지 못한 상태

www.yes24.com