Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- jwt
- lambda
- SQL
- select_type
- cache
- DDL
- DI
- static
- docker
- 필드 주입
- KEVISS
- MSA
- Spring
- Test
- 생성자 주입
- 열 속성
- equals
- StringBuilder
- 바이너리 카운팅
- 인덱스
- stream
- jpa
- 테스트 코드
- java
- AOP
- hashcode
- 조합
- VUE
- redis
- 재정의
Archives
- Today
- Total
백엔드 개발자 블로그
Redis 장애 상황과 대응 본문
Master-Replica 전환 후 Client의 인식오류
시나리오
- Client 는 Master에는 Write, Replica에는 Read request를 날림
- 어떤 이유로 Master-Replica(Slave) 전환
- Client 는 새로 바뀐 정보가 아닌 예전 Master/Replica 정보를 계속 참조하며 Write 가 불가하다는 메세지가 발생됨
- 실제 MSG : READONLY You can't write against a read only replica
해결책
- 도메인의 Routing 정책
- 헬스 정보를 토대로 Switch 하자
- Cluster 환경에서는 꼭 Refresh Option 설정해주자클라이언트 빠르게 재부팅
- Lettuce : ClusterTopologyRefreshOptions로 refresh 주기 설정
full sync 실패로 인한 장애유발
- full sycn 작동 순서
- sync 끊어짐 발생
- 네트워크 장애, 서버 부하, 재부팅
- 부분 동기화 시도 - partial sync (손실된 operation)
- Master에서 진행됐던 operation copy
- 전체 동기화 시도 - full sync (rdb 요청)Master가 디스크에 저장한 rdb를 요청함
- 부분 동기화가 실패하면 함
- Master는 BGSAVE 통해 rdb 생성
- rdb를 Replica에 전달
- 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 증가, 데이터 삭제
- 시나리오
- 데이터 요청(HGET, HGETALL)
- Data 조회하여 return 시도
- Client 에서 Inbound 가 막혀서 Client에서는 timeout 발생
- 네트워크 장애나, inbound 규칙 대문에 발생
- 반환되지 못한 Data가 Memory상에 임시보관됨
- 임시 보관 Data 가 누적되면서 Redis에 할당된 공간을 차지
- 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-output-buffer-limit normal 수정버퍼의 최대 메모리와 데이터 유지시간을 설정하면 됨
그 외 장애들
- 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 |