[Redis] Cluster

Cluster

레디스 클러스터는 Master-Slave로 구축된 클러스터 시스템이며 Sentinel은 필요로 하지 않는다. cluster 구축을 통해 샤딩을 수행할 수 있다. 또한 MSET과 같은 명령을 수행할 수 없다.

Redis Cluster Architecture

레디스 클러스터는 node to node구조로 이루어진다. 모든 노드가 클러스터 슬롯 할당 정보를 가지고 있으며 클라이언트도 어느 노드든 접속해서 클러스터 슬롯 할당 정보를 가져와서 보유하게 된다. 입력되는 key에 따라 해당 노드에 접속해서 처리하게 되며 일부 노드가 다운되어도 다른 노드에 영향을 주지 않는다. 일정 수 이상의 노드가 다운되면 레디스 클러스터는 멈춘다.

Partition

Range Assignment

key의 범위로 노드를 할당한다. key의 범위로 할당하기 때문에 key값에 의존적이게 되며 Hot Region이 발생할 가능성이 높다.

Hash Assignment

key값에 hash를 적용시켜 노드를 할당한다. range assignment보다 안정적이게 분산처리가 가능하다.

CLUSTER-REQUIRE-FULL-COVERAGE

앞서 일정 수 이상의 노드가 다운되면 레디스 클러스터는 멈춘다 라고 추상적이게 말을 했다. 이는 CLUSTER-REQUIRE-FULL-COVERAGE 옵션의 설정에 따라 달려있다. CLUSTER-REQUIRE-FULL-COVERAGE가 yes일 경우엔 슬레이브가 없는 마스터 노드 중 어느 하나라도 다운되면 클러스터가 다운된다. CLUSTER-REQUIRE-FULL-COVERAGE가 no일 경우에는 슬레이브가 없는 마스터 노드가 다운되더라도 클러스터는 다운되지 않고 살아있다. 다운된 노드의 슬롯은 에러가 나지만 다른 노드의 슬롯은 정상동작한다. 단 no 옵션의 경우 과반수의 노드가 다운되면 클러스터도 다운된다.

Sharding

샤딩에는 hashslot이라는 개념을 도입해서 동작하게 된다. 최대 100대의 노드까지 확장할 수 있도록 설계되었고 노드의 추가,삭제시 클러스터의 중지가 필요 없고 키 이동시에 해당 키에 대해서만 잠시 멈출수 있다. 노드에 데이터를 할당할 때는 CRC16(key) % 16384의 값을 계산해 노드에 분산시킨다. 레디스 클러스터는 16384개의 슬롯을 사용하기 때문에 해쉬를 통해서 균등하게 분배할 수 있다.

Author: Song Hayoung
Link: https://songhayoung.github.io/2020/07/19/Redis/cluster/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.