[Redis] Master 이외의 Replica(slave)로 부터 읽기

by 스뎅(thDeng) on

master-replica(master-slave) 구조로 HA 구성을 해둔 Redis에서, 일반적으로 read/write 작업을 하게 되면 master에서만 동작을 하게 된다. 사실 replica가 여러개 있어도 성능에 도움이 되지 못 하는 형태이다.

Replication lag을 감안해도 되는 경우라면 read 작업은 replica(slave)에서 해도 되는 경우가 많다. 일부 master 서버에만 몰리는 트래픽을 분산시킬 수도 있다. single thread이기 때문에 발생할 수 있는, read 작업이 몰릴 때 master에서 다른 요청이 끝나기를 기다리는 경우를 피할 수도 있다.

읽기 작업을 reaplica에서 하려면 각 드라이버에서 간단한 설정으로 가능하다.

Lettuce ReadFrom 설정

Lettuce 드라이버는 ReadFrom 설정으로 어디에서 읽어올지 선택이 가능하다.

RedisURI masterUri = RedisURI.Builder.redis("master-host", 6379).build();
RedisClient client = RedisClient.create();

StatefulRedisMasterReplicaConnection<String, String> connection = MasterReplica.connect(
            client,
            StringCodec.UTF8,
            masterUri);

connection.setReadFrom(ReadFrom.REPLICA);

connection.sync().get("key"); // Replica read

connection.close();
client.shutdown();

ReadFrom에 설정 가능한 값은:

Redisson ReadMode 설정

Redisson 드라이버는 readMode 설정으로 읽어올 노드 선택이 가능하다.

Config config = new Config();
config.useMasterSlaveServers()
    // use "rediss://" for SSL connection
    .setMasterAddress("redis://127.0.0.1:6379")
    .addSlaveAddress("redis://127.0.0.1:6389", "redis://127.0.0.1:6332", "redis://127.0.0.1:6419")
    .addSlaveAddress("redis://127.0.0.1:6399")
    .setReadMode(ReadMode.SLAVE);

yaml 파일로 설정하는 경우 아래처럼 readMode를 설정하면 된다.

clusterServersConfig:
  nodeAddresses:
  - "redis://127.0.0.1:7004"
  - "redis://127.0.0.1:7001"
  - "redis://127.0.0.1:7000"
  readMode: "SLAVE"
  slaveConnectionMinimumIdleSize: 24
  slaveConnectionPoolSize: 64
  masterConnectionMinimumIdleSize: 24
  masterConnectionPoolSize: 64

ReadMode로 설정이 가능한 값은:

Jedis

Jedis는 replica(slave)에서 읽어오는 기능이 안 되는 것으로 알고 있다.

참고

별도로 명시하지 않을 경우, 이 블로그의 포스트는 다음 라이선스에 따라 사용할 수 있습니다: Creative Commons License CC Attribution-NonCommercial-ShareAlike 4.0 International License