이전 게시글1 - Jwt 인증 + Redis BlackList
이전 게시글2 - Redis Master-Slave
port 7000
#cluster 사용 여부
cluster-enabled yes
#cluster 설정 파일 이름
cluster-config-file node.conf
#timeout 시간 지정 (ms)
cluster-node-timeout 5000
#failover된 redis node 재실행 시 이전 데이터를 다시 로드해올 수 있음
appendonly yes
node1:
container_name: node1
image: redis
volumes:
- ./redis/redis1.conf:/usr/local/etc/redis/redis.conf
command: redis-server /usr/local/etc/redis/redis.conf
ports:
- 7000:7000
- 7001:7001
- 7002:7002
- 7003:7003
- 7004:7004
- 7005:7005
node2:
network_mode: "service:node1"
container_name: node2
image: redis
volumes:
- ./redis/redis2.conf:/usr/local/etc/redis/redis.conf
command: redis-server /usr/local/etc/redis/redis.conf
node3:
network_mode: "service:node1"
container_name: node3
image: redis
volumes:
- ./redis/redis3.conf:/usr/local/etc/redis/redis.conf
command: redis-server /usr/local/etc/redis/redis.conf
node4:
network_mode: "service:node1"
container_name: node4
image: redis
volumes:
- ./redis/redis4.conf:/usr/local/etc/redis/redis.conf
command: redis-server /usr/local/etc/redis/redis.conf
node5:
network_mode: "service:node1"
container_name: node5
image: redis
volumes:
- ./redis/redis5.conf:/usr/local/etc/redis/redis.conf
command: redis-server /usr/local/etc/redis/redis.conf
node6:
network_mode: "service:node1"
container_name: node6
image: redis
volumes:
- ./redis/redis6.conf:/usr/local/etc/redis/redis.conf
command: redis-server /usr/local/etc/redis/redis.conf
redis-cluster-entry:
network_mode: "service:node1"
image: redis
container_name: redis-cluster
command: redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1 --cluster-yes
depends_on:
- node1
- node2
- node3
- node4
- node5
- node6
--cluster-replicas 1
는 cluster를 구성할 때 master-slave 구성을 한다는 의미다. 1은 slave의 개수이다. 또한 slave는 cluster를 만들 때 사용한 명령어에 적힌 순서대로 redis가 자동으로 나눠서 붙여준다.--cluster-yes
는 클러스터 관리자에게 자동으로 응답하도록 지시한다. "예" 명령 프롬프트에 추가하여 비대화형 모드에서 실행할 수 있도록 한다. 이 옵션이 없으면 Redis Cluster를 생성할 때 각 서버에 대해 사용자에게 "yes"를 입력하라는 메시지가 표시된다. 즉, yes 입력을 자동으로 해줌redis:
cluster:
nodes:
- 127.0.0.1:7000
- 127.0.0.1:7001
- 127.0.0.1:7002
- 127.0.0.1:7003
- 127.0.0.1:7004
- 127.0.0.1:7005
@RequiredArgsConstructor
@Configuration
@EnableRedisRepositories
public class RedisRepositoryConfig {
@Bean
public RedisConnectionFactory redisConnectionFactory() {
LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
.readFrom(ReadFrom.REPLICA_PREFERRED)
.build();
RedisClusterConfiguration clusterConfiguration = new RedisClusterConfiguration();
List<RedisNode> redisNodes = IntStream.rangeClosed(7000, 7005)
.mapToObj(port -> new RedisNode("127.0.0.1", port))
.collect(Collectors.toList());
clusterConfiguration.setClusterNodes(redisNodes);
return new LettuceConnectionFactory(clusterConfiguration, clientConfig);
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(redisConnectionFactory());
return redisTemplate;
}
}
clusterConfiguratoin.clusterNode("127.0.0.1", 7000);
이런식으로 redis의 host와 port를 지정하면 RedisNode 객체가 생성되고 clusterNodes에 추가가 되는 구조였다.clusterConfiguratoin.clusterNode("127.0.0.1", 7000);
clusterConfiguratoin.clusterNode("127.0.0.1", 7001);
clusterConfiguratoin.clusterNode("127.0.0.1", 7002);
...
clusterConfiguratoin.clusterNode("127.0.0.1", 7005);
그러면 test3@naver.com이 저장된 7002번 노드가 만약에 알 수 없는 장애로 꺼져버리거나 중단이 되었을 경우를 가정해보자. 7002번 노드는 7003번과 Master-Slave 관계를 가지고 있기에 7003번 노드가 Master로 승격을 해서 고가용성을 확보해야한다.
Cluster State changed:ok
가 뜨고 Master 노드로 승격한 것을 확인할 수 있었다. test3@naver.com, test4@naver.com의 값을 확인해보니 토큰을 잘 가져오는 것을 확인하면서 잘 작동이 됨을 알 수 있었다. -> 고가용성Background AOF rewite finished successfully
가 뜨면서 AOF를 통해 저장된 데이터를 가져왔음을 알 수 있었다. -> 확장성