Build Up
Replication(이중화 및 다중화)
- 시스템 일부분중 장애가 발생했을 경우를 대비하여 예비 장치를 백업으로서 배치해 운용하는 기법이다.
- High Avaliablity를 위함이다.
- 서버, 데이터베이스, 캐시 등을 할 수 있다.
What
클러스터란 여러대의 서버를 하나로 묶어서 1개의 시스템처럼 작동하게 하는 것을 의미한다.

- Full Mesh구조이다.
- 모든 마스터와 복제 노드는 서로 연결되어 있으며 가십 프로토콜을 이용하여 통신한다.
- 샤딩까지 가능해졌다.(여러대의 데이터를 분산해서 저장)
특징
샤딩→ 확장 및 성능향상에 용이

1개의 테이블의 데이터를 물리적으로 여러 파티션에 나누어 저장하고 조회, 저장, 삭제 등등 성능이 크게 향상
- 애플리케이션으로부터 들어오는 모든 데이터는 해시 슬롯에 저장된다.
- 총 16384개의 슬록을 가지며 슬롯을 나누어서 저장한다.
- 마스터 노드가 세게일 때 실제 환경을 구성하고 조회해본 결과이다.

- 입력 되는 모든 키는 슬롯에 매핑되며 이런 알고리즘을 사용한다.
HASH_SLOT = CRC16(key) mod 16384
- 해시슬롯은 마스터 노드 내에서 자유롭게 옮겨질 수 있으며 다운 타임이 필요하지 않다. 따라서 새로운 노드를 추가하거나 기존 노드를 삭제할 때, 해시 슬롯을 이동시키기만 하면 되므로 확장이 용이하다.
FailOver → 가용성
- 센티넬과는 다르게 센티널 프로세스가 필요하지 않고 모든 노드가 서로 감시한다는 점에 차이가 있다.
- 만약 가용성이 중요한 서비스에서 레디스 클러스터 구성을 이용할 때 노드 하나를 더 추가할 수 있는 여유가 있다면, 아무 마스터에 복제 노드를 하나 더 연결시키는 것을 추천한다고 한다.
- 복제 노드중 하나가 다운되었을 때, 두개의 복제노드를 마스터에서 하나 때어 죽은 노드로 대체시켜 사용자의 개입이 발생하지 않기 때문이다.
.png?table=block&id=dcd27e7d-fdf6-444e-8805-2568e4991d73&cache=v2)
Client Redirection → 확장 용이
Q. 클러스터 구조에서 데이터는 마스터 노드에 분할되어 저장된다고 했을 때, 애플리케이션은 분할된 데이터 노드를 어떻게 알 수 있을까?
- 해당 슬롯에 존재하지 않는다면 포워딩하지 않고 해당 노드는 리다이렉트 메시지를 반환한다.
- 그렇기 때문에, 애플리케이션은 슬롯 여부에 따른 노드를 알 필요 없다.

Why
- Sentinel에 더해 샤딩까지 가능하다.
- 확장성, 고성능, 고가용성이 뛰어나다.
- 데이터셋 여러 노드에 자동으로 분산 → 확장성, 고성능
- 일부 노드 다운되어도 계속 사용가능 → 고가용성
.png?table=block&id=6ba907da-5c78-4e68-a898-37cf245f6d99&cache=v2)
이전 구조
- Master - slave
- 만약 Master 까지만 데이터가 입력된 후 노드가 죽는다면 데이터의 유실이 발생할 수 있다.
- Master를 수동으로 바꿔주어야 한다. 그 사이에도 유실이 발생할 수 있다.
.png?table=block&id=fa57ad36-d3cd-4d8b-b06d-42bd5d076254&cache=v2)
- Sentinel
- 적어도 3개의 인스턴스가 필요하다.
- 결국 master-slave에서 감시자노드가 추가된 형태이다
.png?table=block&id=c9ebe29e-8945-4351-a292-3d40acf7b191&cache=v2)
How
- docker-compose 구성
- 각 레디스 conf 파일 구성
패키지 구조

각 conf(포트만 다르게 구성한다)
port ${사용자 선택} cluster-enabled yes cluster-config-file node.conf cluster-node-timeout 5000 # AOF 를 통해 failover 된 레디스 노드 재 시작시 이전 데이터를 다시 로드해 올 수 있습니다. appendonly yes
docker-compose file
version: "3.8" services: redis-cluster: platform: linux/x86_64 # m1 MacOS의 경우 image: redis:6.2 container_name: redis-cluster volumes: # 작성한 설정 파일을 볼륨을 통해 컨테이너에 공유 - ./redis.conf:/usr/local/etc/redis/redis.conf command: redis-server /usr/local/etc/redis/redis.conf ports: - "6380:6380" - "6381:6381" - "6379:6379" redis-node-1: network_mode: "service:redis-cluster" platform: linux/x86_64 image: redis:6.2 container_name: redis-test1 volumes: - ./redis1.conf:/usr/local/etc/redis/redis.conf # 마운트 command: redis-server /usr/local/etc/redis/redis.conf redis-node-2: network_mode: "service:redis-cluster" platform: linux/x86_64 image: redis:6.2 container_name: redis-test2 volumes: - ./redis2.conf:/usr/local/etc/redis/redis.conf command: redis-server /usr/local/etc/redis/redis.conf ## 이친구는 cluster 만들어주기 위한 장치일 뿐이다. redis-cluster-entry: network_mode: "service:redis-cluster" platform: linux/x86_64 image: redis:6.2 container_name: redis-cluster-entry command: redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 --cluster-yes depends_on: - redis-cluster - redis-node-1 - redis-node-2
- docker로 실행된 redis 안으로 들어간다.
- docker exec -it redis-cluster sh 입력 [“ redis-cluseter” : service 이름이다.]
- 입력해 레디스 커멘드를 입력 할 수 있는 곳으로 들어간다.
- redis-cli 입력
- 클러스터 정보를 확인해본다.
- cluster info 입력 후 확인
- cluster nodes 입력 후 확인
>> 1,2,3 번 전체 실행 예제

issue
- 이안에서 key를 저장하려고 하면 에러가 발생한다.

- 이전에는 redis-cli로 들어갔기 때문이다.
redis-cli -c -p ${클러스터 포트번호 : {6379, 6380, 6381 중 하나 선택}}
해서 들어간다.- redis-cli -c -p 6379 입력후 키를 저장해본다.

- 터미널 창을 새로 연뒤 이번에 6380으로 들어가본다
- 그러면 지정된 값이 있는 노드로 redirected 되는 것을 알 수 있다.
- 애플리케이션은 해당 노드가 슬롯에 포함되는지 알필요없는 것이다.

여기에서는 간단히 클러스터 모드 설정만을 다루었다. 실제로 AutoFailOver를 제공하지 않으므로 또 다른 설정이 필요하다.
REFER
- 노드 추가 방법