docker-compose로 Redis cluster 만들기

jiholee·2022년 10월 12일
1

회사에서 개발 환경은 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를 실행시키고 마스터-슬레이브 관계를 맺어 주어야 한다.

# 마스터 노드 등록
redis-cli --cluster create redis-node1:6300 redis-node2:6302 redis-node3:6301

# 각각 슬레이브 노드 등록
redis-cli --cluster add-node redis-node4:6400 redis-node1:6300 --cluster-slave
redis-cli --cluster add-node redis-node5:6401 redis-node2:6301 --cluster-slave
redis-cli --cluster add-node redis-node6:6402 redis-node1:6302 --cluster-slave

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

도커 컴포즈 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 <서비스이름> <서비스이름> ...

1개의 댓글

comment-user-thumbnail
2022년 11월 12일

master-slave 를 만들어주는 것도 같은 docker-compose에서 service 하나 추가해서 해결하신 다른분들 블로그 글을 본적이 있습니다.(지금 해당 블로그 글 주소를 못찾앗습니다.)
해당 방법 차고하시면 좋을것 같아 남겨놓습니다.

  1. docker-compose에 마스터 슬레이브를 묶어주기 위한 docker service를 1개 더 추가.
  2. 추가된 service에 depends_on을 통해 service 실행순서를 조정하기
  3. 위 depends_on은 서비스가 생성되기만 하면 작동하기 때문에 작동 완료체크를 하지 않아 오류 발생 가능하여 wait-for-it.sh 파일을 이용해 노드 상태 체크 이후 clustering 진행

아래는 관련 파일 내용들입니다.

docker-compose 파일

services:
...
redis-cluster-service:
...
build:
context: .
dockerfile: Dockerfile_rcs # redis 이미지 가져온 이후 해당 docker-container에 wait-for-it.sh 파일 추가하는 dockerfile
command: ["./wait-for-it.sh redis-node-1:6400 -- redis-cli --cluster create redis-node-1:6400 redis-node-1:6401 redis-node-1:6402 redis-node-1:6500 redis-node-1:6501 redis-node-1:6502 --cluster-yes --cluster-replicas 1"] # --cluaster-yes: 클러스터링 여부 자동 yes 입력, --cluster-replicas 슬레이브 개수 1개
depends_on:
- redis-node-1
- redis-node-2
- redis-node-3
- redis-node-1-slave
- redis-node-2-slave
- redis-node-3-slave

Dockerfile_rcs 파일

FROM redis:6.2.7
COPY wait-for-it.sh wait-for-it.sh
RUN chmod +x wait-for-it.sh

답글 달기