개발
Lettuce Redis Cluster 적용
ka0oll
2021. 11. 21. 17:17
redis의 클러스터를 이용해 데이터들을 샤딩 할수 있다.
스프링 부트에서 기본 레디스 라이브러리는 lettuce 이다.
lettuce의 cluster connection 관리
- lettuce는 클러스터에 모든 노드를 조회해와 노드마다 connection을 가진다.
- slot 마다 어느 노드 인지 관리를 한다.
- 키를 이용해 slot을 알아내고, 해당 slot의 노드 커넥션을 이용해 command를 날린다.
- 응답이 moved ask 일경우 노드를 redirection을 한다.
노드에 대한 failover 설정 방법
노드가 role change가 되거나, maintenance, 신규 노드가 추가 될경우 커넥션의 갱신이 필요하다.
다음과 같이 설정을 할수 있다.
@Configuration
class RedisConfiguration {
@Bean
fun lettuceClientConfigurationBuilderCustomizer(): LettuceClientConfigurationBuilderCustomizer {
return LettuceClientConfigurationBuilderCustomizer(){
@Override
fun customize(clientConfigurationBuilder: LettuceClientConfigurationBuilder){
val clusterTopologyRefreshOptions = ClusterTopologyRefreshOptions.builder()
.dynamicRefreshSources(true)
.enablePeriodicRefresh(Duration.ofSeconds(60))
.enableAllAdaptiveRefreshTriggers()
.adaptiveRefreshTriggersTimeout(Duration.ofSeconds(30))
.build()
clientConfigurationBuilder.clientOptions(
ClusterClientOptions.builder()
.topologyRefreshOptions(clusterTopologyRefreshOptions)
.build()
)
}
}
}
....
dynamicRefreshSources
- 기본 true
- 노드들을 discovery할건지, 안할경우 전달한 노드의 호스트만 사용
enablePeriodicRefresh
- 기본 false
- 지정한 시간마다 클러스터 구성 정보를 가져와서 업데이트한다. 노드가 추가/삭제되었거나, 노드 다운으로 역할 변경(마스터 -> 클론), 슬롯이 이동했을 경우 등 클러스터 구성 정보가 변경되었을 경우 최신 정보로 업데이트해야 한다. 노드가 많을 경우 너무 짧은 시간을 지정하면 refresh 부하가 발생할 수 있다.
enableAllAdaptiveRefreshTriggers
- 기본은 아무런 이벤트에 반응하지 않음
- 특정 이벤트 발생시(command의 응답)에 반응하여 refresh를 한다. 하지만 너무 빈번하게 일어날수 있어 rate limit을 걸수 있다.
- 이벤트 : MOVED, ASK , UNKOWN_NODE, UNCOVERD_SLOT 등등
- adaptiveRefreshTriggersTimeout 을 이용해 특정 시간동안에 한번만 connection 갱신 할수 있도록 할수있다.
- 기본은 30초이다.