코프링에서 Redis Replica 연동

h블로그·2022년 10월 12일

redis

목록 보기
2/3

aws elastiCache 의 생성된 redis 정보를 보니, replica가 있었다. 그래서 읽기는 replica 에서 하도록 설정을 해보려고 한다.

application.yaml

spring:
  redis:
    master:
      host: localhost
      port: 6379
    slave:
      host: localhost
      port: # replica port

사실 로컬에서도 replica 서버를 띄워서 테스트 해보고 싶었으나, redis.conf 변경하여 적용하는게 잘 안되서 실제로 테스트는 elastiCache 에서 했다.

RedisCacheConfig

@Configuration
@EnableCaching
class RedisCacheConfig(
    @Value("\${spring.redis.master.host}")
    private val masterHost: String,
    @Value("\${spring.redis.master.port}")
    private val masterPort: Int,
    @Value("\${spring.redis.slave.host}")
    private val slaveHost: String,
    @Value("\${spring.redis.slave.port}")
    private val slavePort: Int
) {

    @Bean
    fun redisConnectionFactory(): RedisConnectionFactory {
        val clientConfig = LettuceClientConfiguration.builder()
            .readFrom(ReadFrom.REPLICA_PREFERRED)
            .build()

        val masterSlaveConfig: RedisStaticMasterReplicaConfiguration = RedisStaticMasterReplicaConfiguration(masterHost, masterPort)
            .apply { this.addNode(slaveHost, slavePort) }

        return LettuceConnectionFactory(masterSlaveConfig, clientConfig)
    }

    @Bean
    fun cacheManager(): CacheManager {
        val objectMapper = ObjectMapper()
            .registerModule(JavaTimeModule())
            .activateDefaultTyping(BasicPolymorphicTypeValidator.builder()
                .allowIfBaseType(Any::class.java).build(), ObjectMapper.DefaultTyping.EVERYTHING)

        val redisCacheConfiguration: RedisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
            .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(StringRedisSerializer()))
            .serializeValuesWith(RedisSerializationContext.SerializationPair
                .fromSerializer(GenericJackson2JsonRedisSerializer(objectMapper)))
            .entryTtl(Duration.ofMinutes(3L))

        return RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(redisConnectionFactory())
            .cacheDefaults(redisCacheConfiguration).build()
    }
}

기존 구현부에서 redisConnectionFactory() 구현부만 변경되었다.

readFrom

  • UPSTREAM: 현재 master 노드에서만 읽음. (default)
  • UPSTREAM_PREFERRED: master 노드를 우선으로 읽음. 불가능할 경우, replica 노드에서 읽음.
  • REPLICA: replica 노드에서만 읽음.
  • REPLICA_PREFERRED: replica 노드를 우선으로 읽음. 불가능할 경우, master 노드에서 읽음.
  • NEAREST: 가장 latency가 낮은 (가까운) 노드에서 읽음.
  • ANY: 클러스터의 아무 노드에서나 읽음.
  • ANY_REPLICA: 클러스터의 아무 replica 노드에서나 읽음.

참고
https://blog.leocat.kr/notes/2021/08/10/redis-read-from-replica

profile
😎🙈🙈🙈🤓

0개의 댓글