레디스 마스터-슬레이브 모드 구성 가이드

클라우드 서버 환경에서는 간헐적인 연결 중단 문제가 발생할 수 있으며, 이로 인해 레디스 기반 기능이 예기치 않은 오류를 겪을 수 있습니다. 이를 방지하기 위해 레디스 마스터-슬레이브 모드 구성이 필요합니다. 다음은 구현 방법입니다.

단일 레디스 연결 설정


@Bean
public RedisConnectionFactory redisConnectionFactory() {
    // 연결 풀 설정
    RedisPoolConfig poolConfig = new RedisPoolConfig();
    poolConfig.setMaximumIdleConnections(5);
    poolConfig.setMinimumIdleConnections(1);
    poolConfig.setTestOnBorrow(true);
    poolConfig.setTestOnReturn(true);
    poolConfig.setTestWhileIdle(true);
    poolConfig.setNumTestsPerEvictionRun(10);
    poolConfig.setTimeBetweenEvictionRunsMillis(60000);

    // 단일 인스턴스 설정
    RedisInstanceConfiguration instanceConfig = new RedisInstanceConfiguration();
    instanceConfig.setHostName(redisServerHost);
    instanceConfig.setPort(redisServerPort);
    instanceConfig.setDatabaseIndex(0);

    return new JedisConnectionFactory(instanceConfig, poolConfig);
}

센티널(Sentinel) 기반 설정


@Bean
public RedisConnectionFactory sentinelConnectionFactory() {
    // 연결 풀 설정
    RedisPoolConfig poolConfig = new RedisPoolConfig();
    poolConfig.setMaximumIdleConnections(5);
    poolConfig.setMinimumIdleConnections(1);
    poolConfig.setTestOnBorrow(true);
    poolConfig.setTestOnReturn(true);
    poolConfig.setTestWhileIdle(true);
    poolConfig.setNumTestsPerEvictionRun(10);
    poolConfig.setTimeBetweenEvictionRunsMillis(60000);

    // 센티널 설정 - 여러 개의 센티널을 추가할 수 있음
    RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
        .setMasterName("primary-master")
        .addSentinel(sentinelHost1, sentinelPort1)
        .addSentinel(sentinelHost2, sentinelPort2);
    
    return new JedisConnectionFactory(sentinelConfig, poolConfig);
}

이 구성을 사용하면 마스터 노드가 다운될 때, 슬레이브 노드가 자동으로 마스터로 승격됩니다. 그 후 애플리케이션은 새로운 마스터 노드로 자동으로 연결 풀을 재설정합니다.

마스터 노드 장애 시 로그 예시:


2023-05-15 14:23:45,128 [MasterListener-primary-master-[192.168.1.100:26379]] INFO redis.clients.jedis.JedisSentinelPool - Created JedisPool to master at 192.168.1.101:6379

센티널 노드가 다운되면, 로그에 "Lost connection to Sentinel" 메시지가 표시됩니다. 이 경우 레디스 연결 풀이 즉시 끊기지 않아 현재 작업에는 영향을 주지 않지만, 마스터 노드가 응답하지 않을 때 자동 장애 조치가 작동하지 않습니다. 이를 방지하려면 여러 센티널 노드를 구성하거나 센티널 구성 파일을 사용해야 합니다. 센티널 노드가 다운되면 운영팀에 알림을 보내는 것이 좋습니다.

센티널 노드 장애 시 로그 예시:


2023-05-15 14:35:22,445 [MasterListener-primary-master-[192.168.1.100:26379]] ERROR redis.clients.jedis.JedisSentinelPool - Lost connection to Sentinel at 192.168.1.100:26379. Sleeping 5000ms and retrying.
2023-05-15 14:35:27,446 [MasterListener-primary-master-[192.168.1.100:26379]] ERROR redis.clients.jedis.JedisSentinelPool - Lost connection to Sentinel at 192.168.1.100:26379. Sleeping 5000ms and retrying.

태그: Redis Redis Sentinel Failover high-availability distributed-systems

7월 13일 19:05에 게시됨