HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
✍🏻
Learnary (learn - diary)
/
Docker Redis Cluster 구성 [docker]

Docker Redis Cluster 구성 [docker]

progress
Done
Tags
DevOps
Build UpWhat특징WhyHow REFER

Build Up


Replication(이중화 및 다중화)
  • 시스템 일부분중 장애가 발생했을 경우를 대비하여 예비 장치를 백업으로서 배치해 운용하는 기법이다.
  • High Avaliablity를 위함이다.
  • 서버, 데이터베이스, 캐시 등을 할 수 있다.

What


클러스터란 여러대의 서버를 하나로 묶어서 1개의 시스템처럼 작동하게 하는 것을 의미한다.
 
notion image
  • Full Mesh구조이다.
  • 모든 마스터와 복제 노드는 서로 연결되어 있으며 가십 프로토콜을 이용하여 통신한다.
  • 샤딩까지 가능해졌다.(여러대의 데이터를 분산해서 저장)
 
 

특징

 
샤딩→ 확장 및 성능향상에 용이
notion image
1개의 테이블의 데이터를 물리적으로 여러 파티션에 나누어 저장하고 조회, 저장, 삭제 등등 성능이 크게 향상
 
  • 애플리케이션으로부터 들어오는 모든 데이터는 해시 슬롯에 저장된다.
  • 총 16384개의 슬록을 가지며 슬롯을 나누어서 저장한다.
  • 마스터 노드가 세게일 때 실제 환경을 구성하고 조회해본 결과이다.
notion image
  • 입력 되는 모든 키는 슬롯에 매핑되며 이런 알고리즘을 사용한다.
    • HASH_SLOT = CRC16(key) mod 16384
  • 해시슬롯은 마스터 노드 내에서 자유롭게 옮겨질 수 있으며 다운 타임이 필요하지 않다. 따라서 새로운 노드를 추가하거나 기존 노드를 삭제할 때, 해시 슬롯을 이동시키기만 하면 되므로 확장이 용이하다.
 
FailOver → 가용성
  • 센티넬과는 다르게 센티널 프로세스가 필요하지 않고 모든 노드가 서로 감시한다는 점에 차이가 있다.
  • 만약 가용성이 중요한 서비스에서 레디스 클러스터 구성을 이용할 때 노드 하나를 더 추가할 수 있는 여유가 있다면, 아무 마스터에 복제 노드를 하나 더 연결시키는 것을 추천한다고 한다.
    • 복제 노드중 하나가 다운되었을 때, 두개의 복제노드를 마스터에서 하나 때어 죽은 노드로 대체시켜 사용자의 개입이 발생하지 않기 때문이다.
      • notion image
       
       
Client Redirection → 확장 용이
Q. 클러스터 구조에서 데이터는 마스터 노드에 분할되어 저장된다고 했을 때, 애플리케이션은 분할된 데이터 노드를 어떻게 알 수 있을까?
  • 해당 슬롯에 존재하지 않는다면 포워딩하지 않고 해당 노드는 리다이렉트 메시지를 반환한다.
  • 그렇기 때문에, 애플리케이션은 슬롯 여부에 따른 노드를 알 필요 없다.
    • notion image
 
 
 
 
 

Why


  • Sentinel에 더해 샤딩까지 가능하다.
  • 확장성, 고성능, 고가용성이 뛰어나다.
    • 데이터셋 여러 노드에 자동으로 분산 → 확장성, 고성능
    • 일부 노드 다운되어도 계속 사용가능 → 고가용성
notion image
 
 
이전 구조
  1. Master - slave
  • 만약 Master 까지만 데이터가 입력된 후 노드가 죽는다면 데이터의 유실이 발생할 수 있다.
  • Master를 수동으로 바꿔주어야 한다. 그 사이에도 유실이 발생할 수 있다.
notion image
  1. Sentinel
  • 적어도 3개의 인스턴스가 필요하다.
  • 결국 master-slave에서 감시자노드가 추가된 형태이다
    • notion image

How


  1. docker-compose 구성
  1. 각 레디스 conf 파일 구성
패키지 구조
notion image
각 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
 
  1. docker로 실행된 redis 안으로 들어간다.
      • docker exec -it redis-cluster sh 입력 [“ redis-cluseter” : service 이름이다.]
  1. 입력해 레디스 커멘드를 입력 할 수 있는 곳으로 들어간다.
      • redis-cli 입력
  1. 클러스터 정보를 확인해본다.
      • cluster info 입력 후 확인
      • cluster nodes 입력 후 확인
>> 1,2,3 번 전체 실행 예제
notion image
 
issue
  • 이안에서 key를 저장하려고 하면 에러가 발생한다.
notion image
  • 이전에는 redis-cli로 들어갔기 때문이다.
  • redis-cli -c -p ${클러스터 포트번호 : {6379, 6380, 6381 중 하나 선택}} 해서 들어간다.
    • redis-cli -c -p 6379 입력후 키를 저장해본다.
notion image
  • 터미널 창을 새로 연뒤 이번에 6380으로 들어가본다
    • 그러면 지정된 값이 있는 노드로 redirected 되는 것을 알 수 있다.
    • 애플리케이션은 해당 노드가 슬롯에 포함되는지 알필요없는 것이다.
    • notion image
 
 
여기에서는 간단히 클러스터 모드 설정만을 다루었다. 실제로 AutoFailOver를 제공하지 않으므로 또 다른 설정이 필요하다.
Redis Cluster Auto FailOver 설정

 REFER


개발자를 위한 레디스 튜토리얼 03 : NHN Cloud Meetup
지금부터는 레디스의 `HA`(High Availability)에 대해서 알아보겠습니다. 레디스는 **Master - Replica** 형태의 복제를 제공합니다.
개발자를 위한 레디스 튜토리얼 03 : NHN Cloud Meetup
https://meetup.toast.com/posts/226
개발자를 위한 레디스 튜토리얼 03 : NHN Cloud Meetup
  • 노드 추가 방법
Redis Cluster usage
앞에서 Redis cluster를 구성해보았다. Redis cluster구성의 정보가 필요하다면 다음 링크를 참고하면 된다. 본 장에서는 실제 데이터의 저장과 노드 추가, 장애 시뮬레이션 등을 알아볼 것이다. 테스트를 위해 3개의 master로 이루어진 cluster를 구성하였다.
Redis Cluster usage
https://velog.io/@rivernine/Redis-Cluster-usage
Redis Cluster usage
Docker로 Redis 클러스터 구성하기
Redis는 대표적인 인 메모리 데이터 스토어로 매우 빠른 데이터 액세스 시간을 보장합니다. key-value 형식으로 데이터를 저장하며 다른 key-value 스토어와는 다르게, 사용할 수 있는 데이터 구조가 많습니다. (Strings, Lists, Sets, Sorted Sets, Hashes, ...) 또한 레디스는 Pub/Sub 표준을 지원하여 이벤트 기반 실시간 작업을 고성능으로 처리할 수 있습니다.
Docker로 Redis 클러스터 구성하기
https://hwasurr.io/redis/cluster/
Docker로 Redis 클러스터 구성하기