백엔드 개발자 블로그

Redis 장애 상황과 대응 본문

DB/Redis

Redis 장애 상황과 대응

backend-dev 2024. 3. 15. 20:58

Master-Replica 전환 후 Client의 인식오류

시나리오

  1. Client 는 Master에는 Write, Replica에는 Read request를 날림
  2. 어떤 이유로 Master-Replica(Slave) 전환
  3. Client 는 새로 바뀐 정보가 아닌 예전 Master/Replica 정보를 계속 참조하며 Write 가 불가하다는 메세지가 발생됨
    • 실제 MSG : READONLY You can't write against a read only replica

 

 

해결책

  1. 도메인의 Routing 정책
  2. 헬스 정보를 토대로 Switch 하자
    • Cluster 환경에서는 꼭 Refresh Option 설정해주자클라이언트 빠르게 재부팅
    • Lettuce : ClusterTopologyRefreshOptions로 refresh 주기 설정

full sync 실패로 인한 장애유발

  • full sycn 작동 순서
    1. sync 끊어짐 발생
    2. 네트워크 장애, 서버 부하, 재부팅
    3. 부분 동기화 시도 - partial sync (손실된 operation)
    4. Master에서 진행됐던 operation copy
    5. 전체 동기화 시도 - full sync (rdb 요청)Master가 디스크에 저장한 rdb를 요청함
    6. 부분 동기화가 실패하면 함
    7. Master는 BGSAVE 통해 rdb 생성
    8. rdb를 Replica에 전달
    9. replica는 rdb file 처리
  • 문제 원인
    • rdb가 큰 경우 rdb 생성 과정에서 실패로 인한 full sync 실패 반복 => Load, Latency 증가
    • 보통 slave 256mb 64mb 60 설정 되어 있음 : 256Mb가 한번에 메모리에 올라가거나 64mb이상이 60초 이상 메모리에 올라가면 stop
  • 해결안
    • redis 설정에서 Client-output-buffer-limit slave 수정 : set client-output-buffer-limit slave [x] [y] [z]

통신불가로 인해 Buffer 증가, 데이터 삭제

  • 시나리오
    1. 데이터 요청(HGET, HGETALL)
    2. Data 조회하여 return 시도
    3. Client 에서 Inbound 가 막혀서 Client에서는 timeout 발생
      • 네트워크 장애나, inbound 규칙 대문에 발생
    4. 반환되지 못한 Data가 Memory상에 임시보관됨
    5. 임시 보관 Data 가 누적되면서 Redis에 할당된 공간을 차지
    6. memory 정책에 따라 write가 불가해지거나, 지워지는 현상 발생
  • 해결안
    • client-output-buffer-limit normal 수정버퍼의 최대 메모리와 데이터 유지시간을 설정하면 됨
      • `config set client-output-buffer-limit "normal [최대메모리] [메모리] [시간]"`
    • maxmemory-policy를 설정해서 tradeoff가 있는 해결이 가능하긴함 => 비추
      • noeviction : 데이터를 지우지 않음 → memory full → 입력불가
      • volatile-lru, lfu, allkey-lru : 정해진 규칙에 의해 삭제 → memory full → 기존 데이터 삭제

그 외 장애들

  • Client 무한 증가
    • redis timeout 설정을 해도 특정 library에서는 주기적으로 신호를 보내어 idle connection으로 인식되지 않아 close 되지 않음
    • client 단에서 close를 꼭해주거나, tcp를 임의로 kill 하는 작업이 필요함
  • AOF 쓰기 작업
    • AOF는 Client에서 보내는 명령을 모두 hard disk에 기록하는 파일이다.
    • 이를 너무 자주하거나하는 경우 부하를 준다. 관련 설정 (appendfsync : everysec) -> 보통 1초마다함
    • 오래걸리는 경우도 문제가 발생한다. 관련 설정 (no-appendfsync-on-rewrite no)
  • KEYS, HGETALL 등 과도한 요청
    • Redis는 single Thread 이므로 최대한 지양하자.
    • rename command를 통해 실행되지 않게 조정 가능
  • Cache

 

'DB > Redis' 카테고리의 다른 글

Redis 설치 및 설정  (0) 2024.03.15
Redis UI Tools  (0) 2024.03.15
Redis CLI  (0) 2024.02.19
Redis 개념  (0) 2024.02.19