DevBoi

[Redis] Cluster vs Sentinel 본문

Develop/[Redis]

[Redis] Cluster vs Sentinel

HiSmith 2022. 4. 12. 21:03
반응형

1) Sentinel

 

 

 

기능

모니터링 : Master/Salve 제대로 동작하는지 지속적으로 감시

자동 장애 조치 : 하단

알림 : failover되었을때 pub/sub으로 client에게 알리거나, shell script로 

이메일이나 sms를 보낼 수 있다.

 

동작 방식

-Sentinel 인스턴스 과반수 이상이 Master 장애를 감지하면 Slave 중 하나를 Master로 승격,

기존의 Master는 Slave로 강등 시킨다.

과반수 이상은, 단순 sentinel의 네트워크 문제로 해당 이슈가 발생할 수 있기 때문이다.

 

failOver 감지 방법

SDown : Subjectively down (주관적 다운)

-seninal에서 주기적으로 Master에게 보내는 Ping과 info응답이 3초 동안, 혹은 설정 한 값동안 오지않으면 다운으로 인지

 

ODonw : 객관적 다운

-설정한 센티널 대수 이상의 센티널에서 해당 다운되었다고 인지하면, 객관적 다운으로 인지하고 장애를 조치한다.

 

FailOver 주의사항

-get-master-addr-by-name

Master,Slave 모두 다운되었을때 Sentinel에 접속해, Master서버 정보를 요청하면, 다운된 서버의 정보를 리턴한다.

따라서 마스터 서버의 status를 확인해야한다.

 

-slave -> master승격안되는 경우

slave 다운 -> master 다운-> 다운된 slave 재시작되면 이 서버는 master로 전환되지 않는다.

slave의 redis.conf에 자신이 복제로 되어있기 때문에

slave가 시작할때 master로 전환이 되길 희망한다면, redis.conf에서 slaveof를 삭제하는 것이다.

 

* Quorum : redis 장애 발생시 몇개의 Sentinel이 특정 Redis의 장애 발생을 감지해야 장애라고

판별하는지를 결정하는 기준 값, 보통 redis의 과반 수 이상으로 설정한다.

*Sentinel은 1차 복제만 Master 후보에 오를 수 있다.

* sentienl은 내부적으로 redis 의 Pub/Sub 기능을 사용해서 서로 정보를 주고 받는다.

* 센티널 + 레디스 구조의 분산 시스템은 레디스가 비동기 복제를 사용하기 때문에 장애가 발생하는 동안 썼던 내용들이 유지됨을

보장할 수 없다.

 

 

Cluster

 

* 기능

- 자동 장애조치

- 샤딩 : 데이터를 분산 저장

 

* 동작 방식

- 해시 슬롯을 이용해 데이터를 샤딩한다.

(샤딩 : 데이터를 분산 저장하는 방식, 해시 슬롯 : CRC-16 해시 함수를 이용해 key를 정수로 변환하고 해당 정수값을 모듈 연산한 값)

 

-클러스터는 총 16384개의 해시 슬롯이 있으며 각 Master 노드에 자유롭게 할당 가능

-Master가 죽을 경우 Master의 Slave는 gossip Protocol을 통해 Master의 죽음을 파악하고,

Slave중 하나가 Master로 승격된다 -> 중단없는 서비스 제공

gossip Protocol : 각 redis는 다른 Redis들과 직접 연결하여 상태 정보를 통신한다.

기존 Master가 살아나면 새로운 Master의 Slave가 된다.

 

* 클러스터 레디스는 포트가 두개 필요(클라이언트,노드끼리통신용)

클라이언트가 redis에 데이터를 요청했을때 올바르지 않은 master node에 요청하면, 해당 데이터가 저장된 위치를 알려주고

client는 올바른 주소로 재 요청을 한다.

 

cluster는 스케일 아웃을 통해 증가 가능, 센티널은 스케일 업을 해야한다.

클러스터가 답!

 

 

클러스터 동작 방식

-클러스터 구동시 노드별로 데이터 저장 가능한 해시슬롯을 받게 된다.

데이터 저장시 Redis 자체 해시 알고리즘에 의해 key에 맞는 hashslot이 선택되어 저장된다.

데이터 읽을때도 자체 해시 알고리즘에 의해, 데이터를 읽게된다.

특정 키는 특정 노드에만 저장된다.

 

만약에 클라이언트가 연결된 노드에 없는 값을 요청한다면?

그러면 데이터가 있는 노드로 리다이렉션후에, Read/Writer를 수행하게 된다.

이게 가능한 이유는 모든 노드가 해시알고리즘을 공유하고 있기 때문이다.

 

 

 

반응형

'Develop > [Redis]' 카테고리의 다른 글

[Redis] Redis Pub Sub  (0) 2022.04.13
[Redis] Persistence  (0) 2022.04.13
[Redis] TTL이란  (0) 2022.04.12
[Redis] Eviction 정책  (0) 2022.04.12
[Redis] 지원하는 데이터 유형  (0) 2022.04.12