Sentinel을 이용한 Redis 고가용성 구성
Sentinel을 이용한 Redis 고가용성 구성
개요
Redis는 인메모리 Key-Value 저장소로 성능 향상을 위한 cache로 많이 활용되고 있습니다.
- 데이터가 cache에 있으면 사용
- 데이터가 cache에 없으면 DB 데이터 사용
- DB에서 가져온 데이터를 cache에 저장
또한, WAS Session Clustering 구성 시 Session Data 저장소로 Redis를 많이 사용하고 있습니다. 따라서 Redis에 대한 고가용성 구성이 더 중요하게 되었습니다. 이 문서에서는 Sentinel을 이용해서 Redis 고가용성 구성 및 동작에 대해 다뤄보겠습니다.
Redis 고가용성 구성 아키텍처 비교
Redis 고가용성 구성하는 아키텍처는 Master-Replica와 Cluster 구성이 있습니다.
Sentinel 아키텍처 및 기능
Sentinel은 Quorum기반 의사결정을 하기 때문에, 고가용성 구성을 위해 기본 3대가 필요합니다. Sentinel은 Redis를 모니터링 하고, Redis Master가 장애가 발생하면, Replica를 새로운 Master로 승격을 하며, Client에게 새로 승격된 Master 정보를 전달해서, 서비스를 지속 할 수 있게 합니다.
주요 기능은 아래와 같습니다.
- Monitoring Sentinel은 Master 및 Replica 인스턴스가 예상대로 작동하는지 지속적으로 확인합니다.
- Notification Sentinel은 API를 통해 시스템 관리자나 다른 프로그램(Client)에게 Redis 인스턴스 중 문제가 있음을 알릴 수 있습니다.
- Automatic Failover Master가 예상대로 작동하지 않으면 Sentinel은 Replica를 Master로 승격시키고, 다른 추가 Replica가 있으면 새 Master를 사용하도록 재구성되며, Redis 서버를 사용하는 Client가 사용할 새 주소에 대해 알리는 장애 조치 프로세스를 시작합니다.
- Configuration Provider Client는 현재 Master는 주소를 알기위해 Sentinel에 접속해서 확인합니다. 만약 Failover가 발생하면, Sentinel은 새로운 주소를 Client에게 알려줍니다.
Sentinel 주요 설정
sentinel monitor <master-group-name> <ip> <port> <quorum>
: redis cluster name , : Redis Master IP, Port : Master 장애 시 failover 시작 할지 동의해야하는 sentinel 수 일반적으로 Sentinel 을 3대로 구성하고, quorum을 2로 설정합니다.
down-after-milliseconds <millisecond>
설정한 시간동안 Redis Master와 통신이 안되면, Sentine은 Failover를 시작합니다.
Sentinel 구성 확인
sentinel-cli> info sentinel
Sentinel 구성 정보를 확인 할 수 있습니다.
- name: myredis (Master Group Name)
- status: ok
- ok : 정상
- sdown : 주관적인 Down
- odown : 객관적인 Down
- address: 192.168.10.5:6378 (Redis Master IP, Port가 표시)
- slaves: 2 (Redis Master에 등록된 Replica 개수 (Down된 Replica 포함))
- sentinels: 3 (Redis를 모니터링하는 Sentinel개수 (Down된 Sentinel 포함))
sentinel-cli> sentinel get-master-addr-by-name <master-group-name>
Redis Master IP/Port 정보를 확인할 수 있습니다.
sentinel-cli> sentinel ckquorum <master-group-name>
현재 Sentinel 구성이 마스터 장애 조치에 필요한 쿼럼에 도달할 수 있는지 확인합니다.
Sentinel Client
Sentinel을 사용하는 경우 Client는 Redis를 바로 접속 하면 안됩니다. 장애 발생 시 Redis Master가 변경 될 수 있기 때문에, 항상 Sentinel 을 통해서 Redis에 접속을 해야합니다. 따라서, Client 설정에 Sentinel 정보를 설정해야 합니다.
대부분의 Client Lib는 Sentinel을 지원합니다. Java 진영에서 가장 많이 사용하는 Redis Client Lib는 Jedis와 Lettuce입니다. 아래 예시 처럼 Redis IP/Port가 아닌 Sentinel IP/Port로 설정을 해야합니다.
/**
* Jedis
*/
@Bean
public RedisConnectionFactory jedisConnectionFactory() {
RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
.master("mymaster")
.sentinel("127.0.0.1", 26379)
.sentinel("127.0.0.1", 26380);
return new JedisConnectionFactory(sentinelConfig);
}
/**
* Lettuce
*/
@Bean
public RedisConnectionFactory lettuceConnectionFactory() {
RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
.master("mymaster")
.sentinel("127.0.0.1", 26379)
.sentinel("127.0.0.1", 26380);
return new LettuceConnectionFactory(sentinelConfig);
}
출처: https://docs.spring.io/spring-data/data-redis/docs/current/reference/html/#redis:sentinel





