본문 바로가기

Docker

Redis master-slave sentinel 도커로 올리기

728x90
반응형

Docker로 redis master-slave를 올리면서 sentinel을 적용해봤다.

 

version: '3.8'

services: 
    redis1:
        image: bitnami/redis
        environment:
            - REDIS_REPLICATION_MODE=master  # 복제보드 master/slave 
            - REDIS_MASTER_HOST=redis1 # host의 이름이나 IP 
            - REDIS_MASTER_SET=master # master이름
            - REDIS_MASTER_PASSWORD=1234qwer # master 인증을 위한 비밀번호 
            - REDIS_PASSWORD=1234qwer # redis 비밀번호 
            - REDIS_TIMEOUT=0 # 클라이언트가 접속을 끊는 시간 (0은 끊지 않음)
            - REDIS_AOF_ENABLED=no # 데이터를 파일에 쓸지 여부를 결정 
            - REDIS_REPLICA_IP=172.19.198.56 # 복제 IP 기본은 컨테이너 IP이고 host ip쓰면 host ip반환
            - REDIS_REPLICA_PORT=6379 # published port
            - TZ=UTC
        ports:
            - target: 6379
              published: 6379
              protocol: tcp
              mode: host
        volumes: 
            - /mnt/d/sentinel-redis2:/bitnami
        logging:
            driver: "syslog"     
        deploy:
            placement:
                constraints: [node.labels.redis1 == true]

    redis2:
        image: bitnami/redis
        environment:
            - REDIS_REPLICATION_MODE=slave
            - REDIS_MASTER_HOST=redis1
            - REDIS_MASTER_SET=master
            - REDIS_MASTER_PASSWORD=1234qwer
            - REDIS_PASSWORD=1234qwer
            - REDIS_TIMEOUT=0
            - REDIS_AOF_ENABLED=no
            - REDIS_REPLICA_IP=172.19.198.56
            - REDIS_REPLICA_PORT=6378
            - TZ=UTC
        ports:
            - target: 6379
              published: 6378
              protocol: tcp
              mode: host
        volumes:
            - /mnt/d/sentinel-redis1:/bitnami
        logging:
            driver: "syslog"
        deploy:
            placement:
                constraints: [ node.labels.redis2 == true ]

    redis3:
        image: bitnami/redis
        environment:
            - REDIS_REPLICATION_MODE=slave
            - REDIS_MASTER_HOST=redis1
            - REDIS_MASTER_SET=master
            - REDIS_MASTER_PASSWORD=1234qwer
            - REDIS_PASSWORD=1234qwer
            - REDIS_TIMEOUT=0
            - REDIS_AOF_ENABLED=no
            - REDIS_REPLICA_IP=172.19.198.56
            - REDIS_REPLICA_PORT=6377
            - TZ=UTC
        ports:
            - target: 6379
              published: 6377
              protocol: tcp
              mode: host
        volumes:
            - /mnt/d/sentinel-redis3:/bitnami
        logging:
            driver: "syslog"
        deploy:
            placement:
                constraints: [ node.labels.redis3 == true ]

    sentinel:
        image: bitnami/redis-sentinel
        environment:
            - REDIS_MASTER_HOST=redis1 # master의 hostname 
            - REDIS_MASTER_SET=master
            - REDIS_MASTER_PASSWORD=1234qwer
            - REDIS_SENTINEL_QUORUM=2 # 마스터 다운에 대한 동의를 해야하는 sentinel 수 
            - REDIS_SENTINEL_PASSWORD=1234qwer
            - REDIS_SENTINEL_DOWN_AFTER_MILLISECONDS=3000 # sentinel이 마스터노드 장애여부 판단하는 시간 
            - REDIS_SENTINEL_ANNOUNCE_IP=172.19.198.56
            - TZ=UTC
        depends_on: 
            - redis1
            - redis2
            - redis3
        ports:
            - '26379:26379'
        logging:
            driver: "syslog"
        deploy:
            replicas: 3
            placement:
                constraints: [node.labels.sentinel == true]

redis 세대를 올렸을 때 컨테이너의 IP는 각각 172.28.5.71, 172.28.5.61, 172.28.5.74이다.

REDIS_REPLICA_IP에  host ip (wsl의 ip)를 설정하면 어플리케이션에서 마스터로 커넥션을 시도할 때 sentinel에서 wsl ip를 전달한다.

 

 

 

로그를 보면 wsl ip랑 포트로 바인딩된 걸 확인할 수 있다. 

 

마스터를 확인할 때 docker container에 접속해서 확인할 수 있다.

$redis-cli -p 6379
auth {비밀번호}
info replication

마스터일 경우 role에 master를 확인할 수 있다.

 

 

마스터 redis를 내려보겠다.

redis2번으로 연결된 걸 확인할 수 있다.

redis2번을 내려보겠다.

 

연결할 수 없다고 뜬다.

 

그 사이 새로 올라온 redis1번 서버와 접속한다.

728x90
반응형