Study/Redis

[Redis] Redis Sentinel

black6765 2022. 11. 21. 20:05

Redis Sentinel

  • Redis의 인스턴스는 Master와 Slave로 구성됨
    • Master는 원본
    • Slave는 Master(원본)에 대한 복제본
  • Master에 문제가 발생하면 Slave를 Master로 승격시켜 사용 : Failover
  • Sentinel은 Failover를 자동으로 해주는 기능
    • Master와 Slave를 감시하고, Master에 문제가 발생했을 때 Slave 중 적절한 노드를 선택
    • 해당 노드를 Master로 승격시킴
    • 이 때 Sentinel 간의 투표 과정에서 과반수를 초과하여 득표를 얻은 노드를 승격시킴
    • 이러한 이유로 Sentinel 인스턴스는 3개 이상의 홀 수로 구성되어야 함

Sentinel Configuration

Step 1. sentinel.conf 파일 복사

  • redis의 홈 디렉토리에 sentinel.conf 파일이 존재함
    • 이제부터 redis 홈 디렉토리를 $REDIS_HOME으로 표기
  • $REDIS_HOME/sentinel.conf 파일을 포트 번호를 구분한 파일명으로 복사
    • ex) $REDIS_HOME/sentinel_26379.conf
    • 해당 설정 파일에 대한 설정을 마친 후, 센티널 노드 개수만큼 복사하여 사용

 

Step 2. 복사한 conf 파일 설정

  • vim 또는 다른 파일 편집기를 이용해 아래의 설정을 적절하게 변경
    • port <변경할 포트 번호>
    • sentinel monitor mymaster 127.0.0.1 <마스터 노드>
      • 여기서 quorum은 failover 시에 몇 개 이상의 센티널 노드가 찬성해야 하는지에 대한 값
      • ex) 센티널 노드가 3개일 때 해당 값을 2로 설정하면 2개 이상의 센티널 노드가 failover에 찬성해야 failover가 실행됨
    • pidfile /var/run/redis-sentinel_”포트 번호”.pid
    • logfile /var/log/sentinel_”포트 번호”.log
    • sentinel auth-pass <마스터 이름> <패스워드>
      • 마스터 노드는 패스워드를 가져야 함
      • 센티널에 의해 슬레이브 노드 또한 마스터로 승격될 수 있으므로 슬레이브 노드에도 모두 설정
      • 해당 설정을 하게 되면 redis-cli로 접속 시 auth 명령을 이용해 인증이 필요
  • 아래는 디폴트가 설정되어 있어서 변경하지 않아도 되는 설정들
    • sentinel down-after-milliseconds mymaster “타임아웃 시간”
      • 마스터에 문제가 생겼을 시 해당 시간(단위: ms) 이후에 failover을 실행
    • sentinel failover-timeout mymaster “타임아웃 시간”
      • failover 작업에 대한 타임아웃(단위: ms)
    • sentinel parallel-syncs mymaster “slave 노드 개수”
      • 마스터로 동기화하는 slave 노드 개수

 

Step 3. conf 파일을 센티널 개수 만큼 복사 및 포트에 맞게 설정

  • 방금 수정한 $REDIS_HOME/sentinel_”포트 번호”.conf 파일을 센티널 개수 만큼 복사
  • 그리고 포트 번호에 따라 파일 내용 수정 및 파일명 수정
  • vim을 사용할 경우 :%s/”대상 문자열”/”변경할 문자열”로 바꾸면 빠르게 수행 가능

 

Step 4. Slave 노드 설정

  • slave 노드가 마스터 노드로 변경될 가능성이 있기 떄문에 slave 노드에 패스워드를 설정해야 함
  • /etc/redis/”슬레이브의 포트 번호”.conf 파일의 임의의 위치에 다음 문구를 추가
    • masterauth “설정한 패스워드”
    • requirepass “설정한 패스워드”
    • slaveof 127.0.0.1 “마스터의 포트 번호”
    • slave-read-only yes
    • 위에서 slave를 replica로 변경 할 수 있음
      • ex) replicaof 127.0.0.1 “마스터의 포트 번호”
  • master 노드로 접속하여 info 실행 시 아래와 같이 slave 노드의 정보가 출력되어야 함
  • # Replication role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6381,state=online,offset=600999,lag=1 slave1:ip=127.0.0.1,port=6380,state=online,offset=601132,lag=0

 

Step 5. Sentinel 실행

  • sudo redis-sentinel $REDIS_HOME/sentinel_”포트 번호”.conf를 실행하여 모든 센티넬을 실행시킨다.
  • 전체 센티넬을 백그라운드로 실행하기 위해서는 다음과 같이 입력한다.
    • sudo redis-sentinel $REDIS_HOME/sentinel_”포트 번호1”.conf & sudo redis-sentinel $REDIS_HOME/sentinel_”포트 번호2”.conf & sudo redis-sentinel $REDIS_HOME/sentinel_”포트 번호3”.conf &
    • 센티넬은 다른 노드와 같이 redis-cli 명령어를 통해 접속할 수 있다.
      • ex) redis-cli -p 26379 → shutdown

Sentinel Failover 테스트

Step 1. 각 노드 기동 중지 및 실행 방법

  • 노드 중지
    • redis-cli로 중지할 노드 접속 → shutdown
    • auth 설정이 되어 있다면 auth → 패스워드 입력 후 shutdown
  • 노드 실행
    • sudo redis-server /etc/redis/”포트 번호”.conf
      • 설정 파일 이름은 다르게 설정했을 경우 다를 수 있음
      • redis-server “설정파일”과 같이 실행

 

Step 2. tail -f 명령어로 로깅

  • failover를 확인하기 위해서는 Slave 노드의 로그를 확인해야 함
  • 이때 tail -f /var/log/redis_”포트 번호”.log 명령어를 이용하면 로그를 추적할 수 있음
  • 마스터 노드를 기동 중지하기 전에 위의 명령어를 통해 로깅을 시작

 

Step 3. 마스터 노드 기동 중지

  • Step 1.을 참고하여 redis-cli로 마스터 노드에 접속하여 shutdown
  • 로깅을 하고 있다면, connection 관련 로그들이 출력되고 설정한 timeout 시간이 지나면 새로운 노드가 마스터가 됨
  • 기존의 마스터 노드를 다시 실행시켜 info를 확인해보면 아래와 같이 되어 있는 것을 확인 가능
# Replication
role:slave
master_host:127.0.0.1
master_port:"마스터 노드의 포트 번호"
  • 이와 같이 동작 했다면, failover 기능이 정상적으로 작동한 것임
  • failover 기능이 작동하면 하나의 노드는 master가 되고, 그 나머지 노드는 master가 된 node를 바라보게 됨(/etc/redis/”포트 번호”.conf에서 설정이 변경되어 있음)
    • 마스터로 승격한 노드는 슬레이브 관련 설정이 삭제됨
    • 또한 최신 버전에서 slave 관련 설정은 replica로 치환되어 설정됨

 

참고자료

https://syhwang.tistory.com/47

https://d2fault.github.io/2019/01/24/20190124-install-redis-and-set-master-slave-relationship/