Redis Cluster
데이터 분산을 제공
일부 노드의 실패나 통신 단절에도 계속 작동하는 가용성
고성능을 보장하면서 선형 확장성을 제공
Redis Cluster 특징
full-mssh 구조(모든 노드가 서로 연결되어 있음)
cluster bus라는 추가 채널 사용(16379가 보통)
gossip protocol 사용(근처 노드 몇개와 통신을 하게 되면 소문처럼 모든 노드에 퍼지게 된다)
hash slot을 사용한 키 관리(데이터를 분산시키는 기준)
DB0만 사용 가능(DB한개만 사용 가능
mulit key 오퍼레이션이 제한됨
클라이언트는 모든 노드에 접속
Sentinel과 차이점
클러스터는 데이터 분사을 제공함
클러스터는 자동 장애조치를 위한 모니터링 노드를 추가 배치할 필요가 없음
클러스터에서는 mulit key 오퍼레이션이 제한됨
Sentinel은 비교적 단순하고 소규모의 시스템에서 HA가 필요할 때 재택
데이터 분산과 key 관리
특정 key의 데이터가 어느 노드에 속할 것인지 결정하는 메커니즘이 있어야 함
보통 분산 시스템에서 해싱이 사용됨
단순 해싱으로는 노드의 개수가 변할 때 모든 매핑이 새로 계산되어야 하는 문제가 있음

Hash Slot
1. redis는 16384의 hash slot으로 key 공간을 나누어 관리
2. 각 키는 CRC16 해싱 후 16384로 modulo 연산을 해 각 hash slot에 매핑
3. hash slot은 각 노드들에게 나누어 분배됨


성능과 가용성
Redis Cluster는 strong consistency를 제공하지 않음(모든 클라이언트가 모든 노드에서 동일한 데이터를 보는것)
(높은 성능을 위해 비동기 복제를 하기 때문)

auto failover

replica migration: replica가 다른 master로 migrate해서 가용성을 높인다

제약사항
DB0만 사용 가능
mulit key 오퍼레이션이 제한: key들이 각각 다른 노드에 저장되므로 MSET과 같은 기능을 기본적으로 사용할 수 없다
같은 노드 안에 속한 key들에 대해서는 가능하다
hash tag 기능을 사용하면 여러 key들을 같은 hash slot에 속하게 할 수 있다
=> key 값중 {} 안에 들어간 문자열에 대해서만 해싱을 수행하는 원리
MSET {user:a}:age 20 {user:a}:city seoul
클라이언트 구현 강제: 모든 노드에 접속해야함, redirect 기능을 구현해야 함