Sentinel
앞글에서 수동으로 failover를 한것을 sentinel을 이용하여 자동으로 failover를 하는 방법을 알아보겠습니다.
기존 클러스터에 sentinel을 추가하여 실행해보자.
cd redis/replica-multi-node-sentinel
docker-compose up

1 - main 3 - secondary 3 - sentinel

replication이 잘 되는것을 알수 있다.
이제 role을 확인해보자.
role

이제 main을 죽여보자.
docker-compose stop redis-main


자동으로 redis-secondary-1이 master로 failover가 된것을 알수 있다.
이제 다시 main을 살려보자.

slave로 역할이 바뀌어 있는걸 알수 있다.
결론
auto failover가 잘 동작한다.
추가 노드 실패
위에 설명한대로 replication이 3이면 1개의 노드는 죽어도 문제가 없다 그러나 2개가 죽으면 문제가 된다.
5개면 2개가 죽어도 문제가 없다. 그러므로 일단 1개를 더 추가해보자.
redis-secondary-4:
image: 'bitnami/redis:7.2'
container_name: redis-secondary-4
depends_on:
- redis-main
ports:
- 6383:6379
environment:
- REDIS_REPLICATION_MODE=slave
- REDIS_MASTER_HOST=redis-main
- ALLOW_EMPTY_PASSWORD=yes
올려보자.
docker-compose up -d


get mykey
> myvalue
여기에서 2개 노드를 죽여보자.
docker-compose stop redis-secondary-1
docker-compose stop redis-secondary-2

2개의 노드가 망가졋는데도 문제없이 실행된다.
하나를 더 망가뜨려보자.
docker-compose stop redis-secondary-3
여전히 동작한다. 음 뭐지?
하나를 더 망가뜨려보자.
docker-compose stop redis-secondary-4
그래도 된다..
노드가 한개라도 있기만 하면 된다. 이상하네..
모든 노드를 다 올리자.
docker-compose up -d
이제 모든 노드에서 다 동작한다.
redis replica는 1개만 있어도 동작을 한다.
sentinel 쿼럼
sentinel을 죽여보자. 그러면 어떻게 될까?
docker-compose stop redis-sentinel-1
이제 main을 죽여보자.
docker-compose stop redis-secondary-4
master가 다른곳으로 이전이 잘됨.
다시 sentinel을 하나더 죽여보자. 이론적으로라면 3개의 sentinel이므로 1개의 에러만 허용함. 2개가 되면 main이 다른곳으로 안넘어가야함.
docker-compose stop redis-sentinel-1
docker-compose stop redis-main
하나 더 죽엿고 main이 다른곳으로 넘어가는지 확인해보자.
그렇다 안넘어간다.
sentinel이 최소 2개는 잇어야 failover를 시킬수 있다.
결론2
sentinel은 가급적이면 5개를 사용하여 2개의 에러를 허용하도록 하자.
추가작업
이제 모든 노드를 다 올리면 어덯게 될가 클러스터는 복구가 될것인가?
docker-compose up -d
마지막으로 문제를 만들엇던 redis-main은 복구가 되었다 그러나 secondary-4는 복구가 안됨.

완전 지우고 다시 시작해보자.
docker-compose stop redis-secondary-4
docker-compose rm redis-secondary-4
docker-compose up -d

main에 잘 연결된걸 알수있다.
결론3
sentinel을 다 올리고 다시 올리면 마지막 master가 복구가 되면서 모든것이 정상으로돌아온다.
기존에 마스터역할을 했던 노드는 에러 노드로 남는다.
이걸 완전히 지우고 새로운 노드로 올려주면 다시 클러스터에 접속이 된다.
결론4
새로운 마스터 노드 선출까지 약 2초 이내에 처리되었으며, 그 동안 client에서는 마스터노드 접근에 오류가 발생함.
Last updated
Was this helpful?