티스토리 뷰

 Redis는 데이터베이스, 캐시 및 메시지 브로커로 사용되는 오픈소스 인메모리 데이터베이스 관리시스템이다. string, hashes, lists, sets, sorted sets 등 다양한 데이터 구조를 지원한다. "키 - 값" 구조의 비정형 데이터를 저장한다.


Redis 클러스터 구축

 VM을 만들 때, 네트워크 설정에 주의해야 한다. 후에 자바 코드에서 클러스터를 구성할 때, 입력하는 IP와 vm에서 클러스터가 구성되는 IP가 같아야 한다.(클러스터 구성시 입력되는 IP) 그래서 VM을 만들 때 네트워크에서 NAT를 선택할 경우, IP가 10.~~ 이런식이 되는데, [어댑터에 브리지]를 선택해서 192.168.~과 같은 IP를 부여받도록 해야 한다. NAT를 선택해서 진행할 경우, 나의 경우 포트포워딩을 통해서도 연결되지 않았다. (Redis 클러스터 구축한 다른 동료의 경우 포트포워딩으로 해결했다고 했지만.) NAT와 브리지의 차이는 여기를 참고하시길.

 본 예시의 경우 마스터 3개, 슬레이브 3개의 경우다.

 그다음 아래의 단계를 진행한다.

# 1. Redis 다운로드 및 설치
# =====================================================
yum install wget # wget이 없다면
wget http://download.redis.io/redis-stable.tar.gz
sudo yum install gcc # 컴파일시 gcc 필수
tar -xvf redis-stable.tar.gz
cd redis-stable
cd deps
make hiredis lua jemalloc linenoise
cd ..
make
sudo make install

# 2. Cluster 구성
# Redis 설정파일 복사(ex: master 3개 , slave 3개)
# =====================================================
cp redis.conf redis_포트번호.conf
cp redis.conf redis_포트번호.conf
cp redis.conf redis_포트번호.conf
cp redis.conf redis_포트번호.conf
cp redis.conf redis_포트번호.conf
cp redis.conf redis_포트번호.conf

# 3. 로그 폴더 생성
# =====================================================
mkdir logs

# 4. 2.Cluster 구성에서 만든 각 설정파일을 열어 내용을 아래와 같이 입력해준다.
# =====================================================
port [포트번호]
# 백그라운드에서 시작하도록 설정
daemonize yes
# 클러스터를 사용.
cluster-enabled yes
# 클러스터 구성 내용을 저장한는 파일명 지정 (자동 생성됨)
cluster-config-file nodes-[포트번호].conf
# 클러스터 노드가 다운되었는지 판단하는 시간 (3s)
cluster-node-timeout 3000
# Appendonly를 yes로 설정하면 rdb에 저장 안되고 aof에 저장됨 (각각 장단점이 있으니 해당 부분은 선택 사항)
appendonly yes
# append only yes 시 해당 부분도 수정
appendfilename appendonly_[포트번호].aof
# 프로세스 아이디 저장 경로 설정
pidfile /var/run/redis_[포트번호].pid
# 로그 파일 저장 경로 지정 logfile logs/redis_[포트번호].log
bind [VM의 IP]

# 5. 기동
# =====================================================
src/redis-server redis_각자포트번호.conf
src/redis-server redis_각자포트번호.conf
src/redis-server redis_각자포트번호.conf
src/redis-server redis_각자포트번호.conf
src/redis-server redis_각자포트번호.conf
src/redis-server redis_각자포트번호.conf

# 6. Cluster 생성
# --cluster-replicas 1 : 마스터는 최소 1개의 slave를 가지고 있어야 한다!
# =====================================================
src/redis-cli --cluster create VM의 IP:port Cluster VM의 IP:port Cluster VM의 IP:port ... --cluster-replicas 1

Redis 클러스터 구축 확인


Jedis를 이용한 자바 연동

 의존성에 Jedis를 추가해주고 아래의 코드로 Jedis로 스프링프로젝트와 VM의 Redis가 연동되는지 확인한다. (본 코드는 깃허브에 올려뒀다.)

package com.example.redis.cluster;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;

import java.util.HashSet;

import java.util.Set;


@Configuration
public class JedisConfig {

    @Bean
    public JedisCluster jedisCluster() {

        try{
            Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();

            jedisClusterNodes.add(new HostAndPort("192.168.30.136", 7000));
            jedisClusterNodes.add(new HostAndPort("192.168.30.136", 7001));
            jedisClusterNodes.add(new HostAndPort("192.168.30.136", 7002));

            return new JedisCluster(jedisClusterNodes);
        }catch (Exception e){
            return null;
        }

    }
}
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import redis.clients.jedis.JedisCluster;
import static org.assertj.core.api.Assertions.assertThat;

@RunWith(SpringRunner.class)
@SpringBootTest
public class ClusterTest {

    @Autowired
    private JedisCluster jedisCluster;

    @Test
    public void connectionTest() {

        String key = "result";
        String value = "success";

        jedisCluster.set(key, value);

        String valueFromCluster = jedisCluster.get(key);

        assertThat(valueFromCluster).isEqualTo(value);

    }

}

 connectionTest()가 성공으로 끝나면 연동된 것이다.


 Jedis로 VM의 Redis와 스프링을 연동할 때 주의점은 첫째, VM의 네트워크를 [어댑터에 브리지]를 선택할 것, 둘째, redis_각자포트번호.conf 파일을 만들 때 bind [VM의 IP]를 입력할 것(Redis가 작동할 IP를 연결하는 것.), 셋째, 클러스터 구축시 IP에 VM의 IP(이미 Redis가 작동하는. ps -ef | grep redis로도 확인할 수 있다.)를 입력할 것, 이상 세 가지다.


 이걸 몰라서 난 엄청 헤맸다... 혹시 Redis 클러스터를 간단히 구축해보고 스프링 프로젝트와 연동해보고 싶은 사람이라면 도움이 되면 좋겠다.

 왜 NAT로 private IP를 부여받아서 진행하면 클러스터가 제대로 작동하지 않는지에 대해서는 나도 잘 모르지만, 클러스터 구축시 입력하는 IP와 스프링 프로젝트에서 JedisCluster를 만들 때 사용하는 Host가 같지 않으면 계속 Redirection하다가 Too Many Redirection Exception가 발생한다고 한다.(나의 경우, cluster retry deadline exceeded. 라고 하면서 연결이 되지 않았다.) 출처: https://hakurei.tistory.com/132 [Reimu's Development Blog]

 본 문제에 관련해서는 여기에서도 확인할 수 있다.


 VM의 네트워크 연결을 브리지 연결로 해두면 VM의 IP가 바뀔 수 있다. 그럴 경우, VM의 /root/redis-stable/ 경로에 있는 nodes-[포트번호].conf와 redis_[포트번호].conf 파일들을 열어서 IP를 새로운 IP로 입력하고 자바 코드의 JedisConfig의 host에 들어가는 IP만 변경해주면 된다.

300x250

'공부흔적' 카테고리의 다른 글

로그와 보안  (0) 2022.01.27
코드리뷰 정리  (0) 2021.08.06
미니쿠베(Minicube)  (0) 2021.06.24
SerialVersionUID  (0) 2021.06.21
RabbitMQ로 객체 전송하기  (0) 2021.06.16
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함