Redis Cluster 구성도
간단하게 정리하면.
- 각 서버 별로 Redis 3대를 설치. Master 1개, Slave 2개로 구성하여 Replication을 지원할 수 있도록 Cluster를 구성하였습니다.
- 각 서버 별로 Sentinel 3대를 설치. 양대비 원리에 맞추어 홀수개로 설정 하였습니다.
- 각각의 서버의 Sentinel 3대가 서버의 Master Redis를 감시합니다. (Failover 대기)
- Redis Cluster를 서버 3대에 설치. Data Sharding을 하기 위해 저장소를 3개로 분리하였습니다.
- HAProxy로 분산 처리 구축. 5000, 5002, 5004번 포트는 각 서버의 Master Redis를 바라봅니다.
- 5001, 5003, 5005번 포트는 각 서버의 Slave Redis 2대씩 바라봅니다.
지금부터 Redis Cluster를 어떻게 설치 하였는지 설치 과정에 대해 알아보도록 하겠습니다.
Docker를 이용한 Redis Cluster 설치
Redis-Cluster를 설치하는 순서는 아래와 같습니다. (CentOS 7기준으로 설치 하였습니다.)
- Git 설치 (미리 올려둔 Docker file들을 다운받기 위함)
- Docker 설치
- Docker-Compose 설치
- Docker Build
Git 설치 + Docker file 다운로드
1 | # git설치 |
Docker 설치
1 | #docker 설치 |
Docker를 yum으로도 설치가 가능하지만 버전이 낮아 Docker-compose를 설치 할 수 없습니다.
차후에 update까지 필요하니 위 url에서 제공하는 shell script를 실행하여 설치하도록 합니다.
※ 위 Script는 sudo 명령 또는 root 권한을 필요로 합니다.
Docker 설치 내용은 2장에서 기술한 내용을 참고하시길 바랍니다.
Docker-Compose 설치
1 | #docker 공식 github에서 다운로드 |
Docker-Compose 설치 내용은 4장에서 기술한 내용을 참고하시길 바랍니다.
Docker build
1 | # redis-cluster home 이동 |
- -f 옵션으로 docker-compose.yml 파일을 설정합니다.
(docker-compose.yml 파일은 github redis-cluster 설치파일을 받을때 다운 받았습니다. ) - up 명령으로 docker container를 실행합니다.
- –build 옵션으로 build후 container를 실행합니다.
- -d 옵션으로 background로 실행되도록 합니다.
(-d 옵션을 빼면 redis의 로그가….나오며 exit하는 순간 container가 stop됩니다.)
Redis Cluster를 빌드하기 위한 docker-compose.yml 파일
1 | version: '3' |
Redis Container의 Network모드가 Host인 이유
Redis 공식 홈페이지의 cluster-tutorial에서 발췌한 내용입니다.Redis Cluster and Docker
Currently Redis Cluster does not support NATted environments and in general environments where IP addresses or TCP ports are remapped.
Docker uses a technique called port mapping: programs running inside Docker containers may be exposed with a different port compared to the one the program believes to be using.
This is useful in order to run multiple containers using the same ports, at the same time, in the same server.In order to make Docker compatible with Redis Cluster you need to use the host networking mode of Docker.
Please check the –net=host option in the Docker documentation for more information.Redis Cluster에서는 NAT환경과 IP주소 또는 TCP포트가 재 매핑되는 환경을 지원하지 않는다고 합니다.
따라서 Docker에서 Redis Cluster를 호환되게 하기 위해서는 Host 모드로 사용할 것을 권고하고 있습니다.
Redis Container 생성을 위한 Dockerfile 작성
Docker-Compose build를 사용하면서 Dockerfile에는 Redis Container를 구성하는 공통적인 로직을 담았습니다.
주로 내부에서 file을 생성하거나 Host OS의 파일을 Container가 생성하는 시점에 복사하기 위한 로직이 주로 들어있습니다.
그리고 접근권한이 막혀 파일이 실행되지 않는 문제를 해결하기 위해 접근권한을 변경하였습니다.
1 | FROM redis:5.0-alpine //redis 이미지를 기반으로 빌드됨을 의미합니다. |
Redis Cluster 설정
Redis Cluster에 대한 Replication 설정에 대해 알아보겠습니다.
설정 방법은 redis.conf 파일을 각 Container로 복사하여 공통적인 설정을 하였습니다.
각 redis.conf 파일에 대한 변경사항은 docker-entrypoint.sh
파일을 통해 redis.conf 파일 정보를 replace하였습니다.
1 |
|
Redis Cluster 실행 결과
Redis.log
로그에서 0 clients connected (2 slaves) 라는 로그가 보입니다.
Redis에 접속한 클라이언트 수는 0 client이며
2개의 slave redis와 연결하고 있습니다.
중간부분 로그에서 로그를 보면 slave로 설정한 Redis와 연동이 되는 것을 확인 할 수 있습니다.
redis-cli > info replication
redis-cli에서 info replication 명령을 실행하였을 때, 조회되는 내용입니다.
slave0, slave1에 대한 참조를 가지고 있는 것을 확인 할 수 있습니다.