회사에서 개발 환경은 mac을 사용하는 데 재택을 할 때는 window 노트북에 붙어야 한다. 처음에는 재택을 할 때 일부러 개발 위주가 아닌 일 위주로 했는데 코드 리뷰를 받을 때도 윈도 노트북에 붙어야 했다.. WSL도 깔고 윈도 local에 이것저것 깔면서 무수한 오류를 만났고 구글링을 하다 보니 이런 경우에 docker를 쓰면 좋다는 글을 보고 도커를 공부해보기로 했다. (그동안은 딱히 필요하지 않아서 공부할 때 너무 어렵기만 했는데 지금은 필요해서 하다보니 확실히 이해가 잘 되는 느낌이다..🙄)
레디스를 잘 설명해주는 블로그는 아주 많아서 정보를 쉽게 찾을 수 있다.
평소 레디스 공부할 때 자주 참고했던 블로그에 그림으로 잘 정리되어 있어서 가져왔다. 나는 여기서 Predixy 포트를 7300으로 사용한다.
출처: 5분 안에 구축하는 Redis Predixy
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개 생성해준다.
포트를 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
## 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 이름으로 적어야 한다. (이부분을 잘 몰라서.. 고생고생을..)
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 <서비스이름> <서비스이름> ...
master-slave 를 만들어주는 것도 같은 docker-compose에서 service 하나 추가해서 해결하신 다른분들 블로그 글을 본적이 있습니다.(지금 해당 블로그 글 주소를 못찾앗습니다.)
해당 방법 차고하시면 좋을것 같아 남겨놓습니다.
아래는 관련 파일 내용들입니다.
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