docker-compose로 Redis cluster 만들기

jiholee·2022년 11월 6일
0

회사에서 개발 환경은 mac을 사용하는 데 재택을 할 때는 window 노트북에 붙어야 한다. 처음에는 재택을 할 때 일부러 개발 위주가 아닌 일 위주로 했는데 코드 리뷰를 받을 때도 윈도 노트북에 붙어야 했다.. WSL도 깔고 윈도 local에 이것저것 깔면서 무수한 오류를 만났고 구글링을 하다 보니 이런 경우에 docker를 쓰면 좋다는 글을 보고 도커를 공부해보기로 했다. (그동안은 딱히 필요하지 않아서 공부할 때 너무 어렵기만 했는데 지금은 필요해서 하다보니 확실히 이해가 잘 되는 느낌이다..🙄)

레디스를 잘 설명해주는 블로그는 아주 많아서 정보를 쉽게 찾을 수 있다.


아키텍쳐

평소 레디스 공부할 때 자주 참고했던 블로그에 그림으로 잘 정리되어 있어서 가져왔다. 나는 여기서 Predixy 포트를 7300으로 사용한다.

출처: 5분 안에 구축하는 Redis Predixy

클러스터 환경 설정을 위한 redis.conf 파일

port 6300
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 3000
appendonly yes

클러스터 설정을 위해 최소 3개 이상의 레디스 노드가 있어야 하고, 각각 슬레이브 노드를 두기 위해 6개 노드를 사용하였다. 마스터 포트: 6300, 6301, 6302 / 슬레이브 포트: 6400, 6401, 6402 포트만 다르게 해서 conf 파일을 6개 생성해준다.

predixy.conf 파일

포트를 7300으로 설정해주고, Include cluster.conf가 꼭 필요하다.

################################### GENERAL ####################################
## Predixy configuration file example

## Specify a name for this predixy service
## redis command INFO can get this
Name PredixyExample

## Default is 0.0.0.0:7617
Bind 0.0.0.0:7300

## Worker threads
WorkerThreads 4

MaxMemory 0

ClientTimeout 300

Log /etc/logs/predixy.log

LogVerbSample 0
LogDebugSample 0
LogInfoSample 10000
LogNoticeSample 1
LogWarnSample 1
LogErrorSample 1


################################### AUTHORITY ##################################
Include auth.conf

################################### SERVERS ####################################
Include cluster.conf
# Include sentinel.conf
# Include try.conf

################################### LATENCY ####################################
## Latency monitor define, see latency.conf
Include latency.conf

predixy/cluster.conf

## redis cluster server pool define

ClusterServerPool {
    MasterReadPriority 60
    StaticSlaveReadPriority 50
    DynamicSlaveReadPriority 50
    RefreshInterval 1
    ServerTimeout 1
    ServerFailureLimit 10
    ServerRetryTimeout 1
    KeepAlive 120
    Servers {
        + redis-node1:6300
        + redis-node2:6301
        + redis-node3:6302
        + redis-node4:6400
        + redis-node5:6401
        + redis-node6:6402
    }
}

Servers에 클러스터로 연결할 노드 ip와 포트를 적어 준다. 도커 컴포즈 환경에서 따로 가지는 ip를 적어 주어야하고 ip는 변동되기 때문에 container 이름으로 적어야 한다.

docker-compose.yml

version: "3"

services:
  predixy:
    image: hanndol/predixy
    build:
	    context: predixy/
    container_name: predixy
    hostname: predixy
    volumes:
      - ./predixy/conf:/etc/predixy/conf
    ports:
      - "127.0.0.1:7300:7300"

  redis-node1:
    image: redis:latest
    container_name: redis-node1
    volumes:
      - ./redis_6300.conf:/usr/local/etc/redis_6300.conf
			- ./start.sh:/start.sh
    command: redis-server /usr/local/etc/redis_6300.conf
    ports:
      - "127.0.0.1:6300:6300"

  redis-node2:
    image: redis:latest
    container_name: redis-node2
    volumes:
      - ./redis_6301.conf:/usr/local/etc/redis_6301.conf
    command: redis-server /usr/local/etc/redis_6301.conf
    ports:
      - "127.0.0.1:6301:6301"

  redis-node3:
    image: redis:latest
    container_name: redis-node3
    volumes:
      - ./redis_6302.conf:/usr/local/etc/redis_6302.conf
    command: redis-server /usr/local/etc/redis_6302.conf
    ports:
      - "127.0.0.1:6302:6302"

  redis-node4:
    image: redis:latest
    container_name: redis-node4
    volumes:
      - ./redis_6400.conf:/usr/local/etc/redis_6400.conf
    command: redis-server /usr/local/etc/redis_6400.conf
    ports:
      - "127.0.0.1:6400:6400"

  redis-node5:
    image: redis:latest
    container_name: redis-node5
    volumes:
      - ./redis_6401.conf:/usr/local/etc/redis_6401.conf
    command: redis-server /usr/local/etc/redis_6401.conf
    ports:
      - "127.0.0.1:6401:6401"

  redis-node6:
    image: redis:latest
    container_name: redis-node6
    volumes:
      - ./redis_6402.conf:/usr/local/etc/redis_6402.conf
    command: redis-server /usr/local/etc/redis_6402.conf
    ports:
      - "127.0.0.1:6402:6402"

networks: 
  redis-net: 
    driver: bridge

구글링과 주변에 물어물어 작성된 도커 컴포즈 파일이다
레디스 노드 포트는 redis-stat으로 모니터링 해보기 위해서 열어두었다.

아직 저 상태로는 클러스터 설정이 완료된것은 아니다.

docker exec -it redis-node1 bash 

이 명령어로 redis-node1의 bash를 실행시키고 마스터-슬레이브 관계를 맺어 주어야 한다.

#!/bin/bash
src/redis-server redis_6300.conf
src/redis-server redis_6301.conf
src/redis-server redis_6302.conf
src/redis-server redis_6400.conf
src/redis-server redis_6401.conf
src/redis-server redis_6402.conf

redis-cli --cluster call 127.0.0.1:6300 flushall
redis-cli --cluster call 127.0.0.1:6300 cluster reset

# 6300, 6301, 6302 마스터 설정하기
redis-cli --cluster create 127.0.0.1:6300 127.0.0.1:6301 127.0.0.1:6302

# 6400 ,6401, 6402 슬레이브 등록하기
redis-cli --cluster add-node 127.0.0.1:6400 127.0.0.1:6300 --cluster-slave
redis-cli --cluster add-node 127.0.0.1:6401 127.0.0.1:6301 --cluster-slave
redis-cli --cluster add-node 127.0.0.1:6402 127.0.0.1:6302 --cluster-slave

# 노드만 만들고 클러스터 구성 안 한 상태로 Master-slave 한번에 구성하기
# redis-cli --cluster create 127.0.0.1:6300 127.0.0.1:6301 127.0.0.1:6302 127.0.0.1:6400 127.0.0.1:6401 127.0.0.1:6402 --cluster-replicas 1


#predixy
predixy predixy/conf/predixy.conf &

# redis-stat
java -jar redis-stat-0.4.14.jar localhost:6300 localhost:6301 localhost:6302 localhost:6400 localhost:6401 localhost:6402 --server=8888

이 부분도 자동화하고 싶은데 아직 생각대로 잘되지 않고 있다 ...

도커 컴포즈 cli 명령어

# 실행
docker-compose up

# 백그라운드에서 실행
docker-compose up -d

# 서비스 중지
docker-compose stop

# 서비스 다운
docker-compose down

# 실행중인 서비스 확인하기
docker-compose ps

# 서비스 로그 확인하기
docker-compose logs

# 서비스 로그 지속적으로 확인하기
docker-compose logs -f

# 서비스 로그 지정해서 확인하기
docker-compose logs <서비스이름> <서비스이름> ...

궁금해서 chatGPT에 물어보니 나온 도커 컴포즈 파일

version: "3"

services:
  redis-master1:
    image: redis:6-alpine
    command: ["redis-server", "--port", "6379", "--cluster-enabled", "yes", "--cluster-config-file", "/data/nodes.conf", "--cluster-node-timeout", "5000", "--appendonly", "yes"]
    volumes:
      - redis-data:/data
    networks:
      - redis-net

  redis-master2:
    image: redis:6-alpine
    command: ["redis-server", "--port", "6380", "--cluster-enabled", "yes", "--cluster-config-file", "/data/nodes.conf", "--cluster-node-timeout", "5000", "--appendonly", "yes"]
    volumes:
      - redis-data:/data
    networks:
      - redis-net

  redis-master3:
    image: redis:6-alpine
    command: ["redis-server", "--port", "6381", "--cluster-enabled", "yes", "--cluster-config-file", "/data/nodes.conf", "--cluster-node-timeout", "5000", "--appendonly", "yes"]
    volumes:
      - redis-data:/data
    networks:
      - redis-net

  redis-slave1:
    image: redis:6-alpine
    command: ["redis-server", "--port", "6382", "--cluster-enabled", "yes", "--cluster-config-file", "/data/nodes.conf", "--cluster-node-timeout", "5000", "--appendonly", "yes", "--slaveof", "redis-master1 6379"]
    volumes:
      - redis-data:/data
    networks:
      - redis-net

  redis-slave2:
    image: redis:6-alpine
    command: ["redis-server", "--port", "6383", "--cluster-enabled", "yes", "--cluster-config-file", "/data/nodes.conf", "--cluster-node-timeout", "5000", "--appendonly", "yes", "--slaveof", "redis-master2 6380"]
    volumes:
      - redis-data:/data
    networks:
      - redis-net

  redis-slave3:
    image: redis:6-alpine
    command: ["redis-server", "--port", "6384", "--cluster-enabled", "yes", "--cluster-config-file", "/data/nodes.conf", "--cluster-node-timeout", "5000", "--appendonly", "yes", "--slaveof", "redis-master3 6381"]
    volumes:
      - redis-data:/data
    networks:
      - redis-net

  predixy:
    image: predixy/predixy
    command: ["predixy", "/etc/predixy/predixy.conf"]
    volumes:
      - ./predixy.conf:/etc/predixy/predixy.conf
    ports:
      - "6379:6379"
      - "6380:6380"
      - "6381:6381"
      - "16379:16379"
      - "16380:16380"
      - "16381:16381"
    depends_on:
      - redis-master1
      - redis-master2
      - redis-master3
    networks:
      - redis-net

volumes:
  redis-data:

networks:
  redis-net:

0개의 댓글