Redis 클러스터를 로컬에서 실행하기 위해 Docker를 설치하는 것이 첫 단계예요. Dcoker가 설치되어 있지 않다면 Docker 공식 사이트를 방문하여 설치한 뒤, 실행 가능한 상태인지 확인합니다. 설치가 완료되면 Redis 이미지를 내려받아야 해요. Redis의 최신 버전을 사용하려면 다음 명령어를 실행해야 합니다.
docker pull redis:latest
먼저 Redis 클러스터를 구성하기 위한 기본 디렉터리 구조를 설정해야 해요.
이를 위해 “redist-cluster”라는 각 노드의 클러스터 디렉터리를 만들고, 그 안에 서로 독립적으로 작동하는 node1, node2, node3이라는 디렉터리를 생성합니다.
mkdir redis-cluster
cd redis-cluster
mkdir node1 node2 node3
그다음 각 노드 디렉터리에 redis.conf 파일을 생성해야 해요.
vi node1/redis.conf
vi node2/redis.conf
vi node3/redis.conf
이 설정 파일은 Redis 노드의 동작을 정의합니다.
port 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
bind 0.0.0.0
protected-mode no
cluster-announce-ip {ip주소}
cluster-announce-port 7001
cluster-announce-bus-port 17001
예를 들어, port 옵션은 노드가 수신할 포트를 지정하며, cluster-enabled yes는 이 노드가 클러스터 모드로 작동하도록 설정합니다.
cluster-config-file nodes.conf는 클러스터 노드 정보를 저장하는 파일명을 지정하고, cluster-node-timeout 5000은 노드 간 통신 타임아웃을 설정합니다. appendonly yes는 데이터를 영구적으로 저장하기 위해 AOF(Append-Only File) 모드를 활성화합니다. 마지막으로, bind 0.0.0.0은 외부 네트워크에서도 연결을 허용하도록 설정하고, protected-mode no는 초기 설정 단계에서 외부 접속 제한을 해제합니다.
외부 spring boot에서 localhost에서 실행되고, Redis는 Docker 네트워크 내부에서 실행되기 때문에 Spring Boot에 애플리케이션은 Docker 내부 IP를 알 수 없습니다. 그렇기 때문에 redis.conf에서 cluster-announce-ip를 호스트의 실제 IP로 설정해야 합니다.
호스트의 실제 IP는 ipconfig을 통해 확인할 수 있어요. 🤓
다음으로 Redis 컨테이너를 관리하기 위한 docker-compose.yml 파일을 생성합니다.
vi docker-compose.yml
이 파일은 Docker Compose를 사용하여 여러 Redis 노드를 동시에 실행할 수 있도록 설정을 정의합니다. 각각의 서비스는 Redis 이미지를 기반으로 하며, 컨테이너 이름, 포트 매핑, 설정 파일 경로 등을 지정합니다. 예를 들어, “redis-node1” 서비스는./node1./node1 디렉터리를 컨테이너의 /usr/local/etc/redis로 마운트하고, 7001 포트를 외부로 노출합니다. 모든 노드는 동일한 네트워크(“redist-cluster-net”)를 공유하도록 설정하여 서로 통신할 수 있게 합니다. 이렇게 설정하면 Docker Compose를 통해 간단히 Redis 클러스터 환경을 재현할 수 있습니다.
version: "3.8"
services:
redis-node1:
image: redis:latest
container_name: redis-node1
volumes:
- ./node1:/usr/local/etc/redis
ports:
- "7001:7001"
- "17001:17001"
command: redis-server /usr/local/etc/redis/redis.conf
networks:
- redis-cluster-net
redis-node2:
image: redis:latest
container_name: redis-node2
volumes:
- ./node2:/usr/local/etc/redis
ports:
- "7002:7002"
- "17002:17002"
command: redis-server /usr/local/etc/redis/redis.conf
networks:
- redis-cluster-net
redis-node3:
image: redis:latest
container_name: redis-node3
volumes:
- ./node3:/usr/local/etc/redis
ports:
- "7003:7003"
- "17003:17003"
command: redis-server /usr/local/etc/redis/redis.conf
networks:
- redis-cluster-net
networks:
redis-cluster-net:
driver: bridge
이제 Docker Compose를 사용하여 컨테이너를 실행합니다. docker-compose up -d 명령어를 실행하면 백그라운드에서 각 Redis 노드가 실행됩니다.
docker-compose up -d
실행 상태를 확인하려면 docker ps 명령어를 사용합니다.
docker ps
컨테이너가 정상적으로 실행되었다면 Redis Cluster를 생성하는 단계로 넘어갑니다. 클러스터를 생성하려면 docker exec -it redis-node1 redis-cli --cluster create 명령어를 사용합니다.
docker exec -it redis-node1 redis-cli --cluster create \
{IP}:7001 {IP}:7002 {IP}:7003 \
--cluster-replicas 0
이 명령어는 클러스터에 포함될 노드의 IP와 포트를 지정하고, 각 노드에 할당된 슬롯 범위를 자동으로 계산하여 클러스터를 구성합니다. 예를 들어, 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003은 각각의 노드를 나타냅니다. --cluster-replicas 0은 복제본 없이 마스터 노드만 설정하겠다는 뜻이에요.
클러스터 생성 중 문제가 발생할 수 있으므로, 출력 메시지를 주의 깊게 확인하고, 필요한 경우 yes를 입력하여 설정을 진행합니다.
이제는 값을 넣어 데이터가 어디로 저장되는지 확인해 보겠습니다. 다음 명령어를 입력해서 Redis 클라이언트를 실행합니다.
redis-cli -c -p 7001
여기서 -c 옵션은 클러스터 모드에서 작동하기 위해 필요합니다. 예를 들어, set key1 value1 명령어를 실행하면 클러스터는 해시 슬롯 알고리즘에 따라 key1이 특정 노드에 저장됩니다. 다른 키도 마찬가지로 분배됩니다. 이후 get key1 명령어를 사용하여 키가 올바르게 저장되었는지 확인할 수 있습니다.
set mykey1 "hello redis cluster"
set mykey2 "hello redis cluster"
set mykey3 "hello redis cluster"
코드를 보면 mykey1은 7001번 노드에 저장됐습니다. 그러면 실제로 저장되었는지 확인해 봐야겠죠?
정상적으로 Replication이 된 것을 확인할 수 있습니다.
'DevOps > Docker' 카테고리의 다른 글
[Docker] 도커로 ELK8버전 사용하기 - 컴도리돌이 (4) | 2024.10.02 |
---|---|
[Docker] 도커 컨테이너(Docker Container)와 도커 이미지(Docker Image)에 대해서 - 컴도리돌이 (2) | 2024.04.26 |
[Docker] 도커 엔진(Docker Engine)에 대해서 - 컴도리돌이 (0) | 2024.04.25 |