본문 바로가기
JAVA/서버작업

docker-compose / redis+sentinel+haproxy 세팅하기

by 2세1의 행복한 개발 2021. 5. 31.
반응형

1. 실패 

처음엔 원래 세팅을 AWS linux2 arn으로 세팅하려고 했으나

arn으로 세팅시 docker, docker-compose는 정상적으로 설치되나

추가 image를 받아올 때 arn이미지 쪽에서 문제가 발생함

그래서 AWS linux2 64로 했습니다

 

linux2 arn의 이점은 aws에서 t4g를 사용할수 있습니다

t4g랑 t3a의 가격을 비교해보면

t4g.medium 0.0416 USD 2 4 GiB EBS 전용 최대 5기가비트
t3.medium 0.052 USD 2 4 GiB EBS 전용 최대 5기가비트
t3a.medium 0.0468 USD 2 4 GiB EBS 전용 최대 5기가비트

약 15프로 가량 저렴하며 가능하면 t4g를 사용하는게 좋다고 판단 했으나

아직 지원하지 않는곳이 많으므로 확인이 필요했습니다

 

 

도커 설치

yum install docker
systemctl start docker
systemctl enable docker

 

docker-compose 설치

curl -L https://github.com/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

 

docker-compose.yml 작성

version: '2'

networks:
  app-tier:
    driver: bridge

services:
  redis:
    image: 'bitnami/redis:latest'
    environment:
      - REDIS_REPLICATION_MODE=master
      - ALLOW_EMPTY_PASSWORD=yes
    volumes:
      - ./data/redis:/bitnami/redis
    networks:
      - app-tier
    ports:
      - 6379:6379
  redis-slave-1:
    image: 'bitnami/redis:latest'
    environment:
      - REDIS_REPLICATION_MODE=slave
      - REDIS_MASTER_HOST=redis
      - ALLOW_EMPTY_PASSWORD=yes
    volumes:
      - ./data/rediss1:/bitnami/redis
    ports:
      - 6479:6379
    depends_on:
      - redis
    networks:
      - app-tier
  redis-slave-2:
    image: 'bitnami/redis:latest'
    environment:
      - REDIS_REPLICATION_MODE=slave
      - REDIS_MASTER_HOST=redis
      - ALLOW_EMPTY_PASSWORD=yes
    volumes:
      - ./data/rediss2:/bitnami/redis
    ports:
      - 6579:6379
    depends_on:
      - redis
    networks:
      - app-tier

  redis-sentinel:
    image: 'bitnami/redis-sentinel:latest'
    environment:
      - REDIS_SENTINEL_DOWN_AFTER_MILLISECONDS=3000
      - REDIS_MASTER_HOST=redis
      - REDIS_MASTER_PORT_NUMBER=6379
      - REDIS_MASTER_SET=mymaster
      - REDIS_SENTINEL_QUORUM=2
    depends_on:
      - redis
      - redis-slave-1
      - redis-slave-2
    ports:
      - 26379:26379
    networks:
      - app-tier

  redis-sentinel-2:
    image: 'bitnami/redis-sentinel:latest'
    environment:
      - REDIS_SENTINEL_DOWN_AFTER_MILLISECONDS=3000
      - REDIS_MASTER_HOST=redis
      - REDIS_MASTER_PORT_NUMBER=6379
      - REDIS_MASTER_SET=mymaster
      - REDIS_SENTINEL_QUORUM=2
    depends_on:
      - redis
      - redis-slave-1
      - redis-slave-2
    ports:
      - 26380:26379
    networks:
      - app-tier

  redis-sentinel-3:
    image: 'bitnami/redis-sentinel:latest'
    environment:
      - REDIS_SENTINEL_DOWN_AFTER_MILLISECONDS=3000
      - REDIS_MASTER_HOST=redis
      - REDIS_MASTER_PORT_NUMBER=6379
      - REDIS_MASTER_SET=mymaster
      - REDIS_SENTINEL_QUORUM=2
    depends_on:
      - redis
      - redis-slave-1
      - redis-slave-2
    ports:
      - 26381:26379
    networks:
      - app-tier

저장소로 사용할 공간 생성

mkdir /data/redis/data

chmod 777 /data/redis/data

 

compose 실행

docker-compose up -d

새로운 폴더가 생성되며 해당 폴더에 권한 오류가 발생함

docker-compose down

새로운 폴더에 권한 부여

chmod -R 777 /data/redis/data

재시작

docker-compose up -d

redis 접속

docker run -it --network docker_app-tier --rm redis redis-cli -h {ip} -p 6479

sentinel 접속

docker run -it --network docker_app-tier --rm redis redis-cli -h {ip} -p 26379

{ip}부분을 설정하신 ip로 수정하신 후 접속하시면 됩니다

docker_app_tier는 위에서 설정한 네트워크입니다

 

정상 동작 확인

redis 접속 후 info

slaves = 2

sentinels = 3 확인

172.19.0.2가 master인걸 확인

sentinul 명령어

SENTINEL get-master-addr-by-name mymaster
1) "172.19.0.2"
2) "6379"

 

docker run -it --network docker_app-tier --rm redis redis-cli -h {ip} -p 6379 DEBUG sleep 30

docker 해당 ip 6379 port에  sleep을 줘 강제로 master를 바꿈

SENTINEL get-master-addr-by-name mymaster
1) "172.19.0.3"
2) "6379"
docker logs -f redis_redis_1

1:S 31 May 2021 05:21:09.010 * MASTER <-> REPLICA sync: receiving 197 bytes from master to disk
1:S 31 May 2021 05:21:09.010 * MASTER <-> REPLICA sync: Flushing old data
1:S 31 May 2021 05:21:09.010 * MASTER <-> REPLICA sync: Loading DB in memory
1:S 31 May 2021 05:21:09.012 * Loading RDB produced by version 6.2.3
1:S 31 May 2021 05:21:09.012 * RDB age 1 seconds
1:S 31 May 2021 05:21:09.012 * RDB memory usage when created 1.71 Mb
1:S 31 May 2021 05:21:09.012 * MASTER <-> REPLICA sync: Finished with success

 

docker container 자동 실행 등록

crontab -e 
@reboot docker-compose -f /data/redis/docker-compose.yml up -d

 

haproxy 설정

내부에 있는 포트를 관리하여 특정 포트를 이용해 항상 master를 유지해줌

yum install haproxy
vi /etc/haproxy/haproxy.cfg

haproxy.cfg

global
  log 127.0.0.1 local0
  log 127.0.0.1 local1 notice

defaults REDIS
mode tcp
timeout connect 4s
timeout server 15s
timeout client 15s
# timeout tunnel 365d

frontend front_redis_master1
 bind *:5000 name redis                 #5000번 포트에 대한 bind 정보입니다.
 default_backend back_redis_master1     #5000번 포트로 신호가 들어오면 backend를 실행

backend back_redis_master1
        option tcp-check
        tcp-check connect
        tcp-check send PING\r\n
        tcp-check expect string +PONG
        tcp-check send info\ replication\r\n
        tcp-check expect string role:master
        tcp-check send QUIT\r\n
        tcp-check expect string +OK
        server redis_6379 {ip}:6379 check inter 1s
        server redis_6479 {ip}:6479 check inter 1s
        server redis_6579 {ip}:6579 check inter 1s
frontend front_redis_slave1
bind *:5001 name redis                #5001번 포트에 대한 bind 정보입니다.
default_backend back_redis_slave1

backend back_redis_slave1
        option tcp-check
        tcp-check connect
        tcp-check send PING\r\n
        tcp-check expect string +PONG
        tcp-check send info\ replication\r\n
        tcp-check expect string role:slave
        tcp-check send QUIT\r\n
        tcp-check expect string +OK
        server redis_6379 {ip}:6379 check inter 1s
        server redis_6479 {ip}:6479 check inter 1s
        server redis_6579 {ip}:6579 check inter 1s

#Listen on all IP's on port 9000 //9000 포트로 접근 시, Web Console에 진입할 수 있습니다.
listen stats
   bind 0.0.0.0:9000
   mode http
   balance
   timeout client 5000
   timeout connect 4000
   timeout server 30000

   #This is the virtual URL to access the stats page
   stats uri /haproxy_stats //URL주소는 ip:9000/haproxy_stats입니다.
   #Authentication realm. This can be set to anything. Escape space characters with a backslash.
   stats realm HAProxy\ Statistics

   #The user/pass you want to use. Change this password!
   stats auth admin:1234 #Web Console에 접근하는 계정/암호 설정

   #This allows you to take down and bring up back end servers.
   #This will produce an error on older versions of HAProxy.
   stats admin if TRUE

재시작

service haproxy restart

{ip}:9000/haproxy_stats

접속하여 모니터링 가능

댓글