Front-end_dev

레디스 샤딩 본문

Database/Redis

레디스 샤딩

Eat2go 2018. 5. 5. 03:07

레디스 샤딩에 대해서....


샤딩은 복제(replication)와는 비슷하지만 각 노드가 전부 master의 역할을 함.

복제같은 경우는 클러스터의 특정 노드에 데이터가 쓰여질때마다 클러스터 내의 다른 노드들도 동일한 데이터가 쓰여지는 반면, 샤딩은 해싱기반으로 데이터에 따라 노드를 선택하여 저장하며 조회할때 다른노드에있을경우 찾아줌. 

즉, 복제와 달리 동일데이터를 여러번쓰지않고 서로 공유하는 상태.





[설치방법]

샤딩을 실습해보려면 써드파티모듈이 필요함. (여기선 redis-trib.rb 사용함)


1. ruby 2.4 버전 이상 설치 (맥에는 2.0이 기본으로 설치되있어서 2.4로 업데이트해주면됨)


2.  gem install redis 혹은,  http://download.redis.io/redis-stable/src/redis-trib.rb 여기서 직접 다운로드.



클러스에 노드총 3개를 사용하여 실습할 예정


첫번쪠 노드 config 파일

port 7000

cluster-enabled yes

cluster-config-file nodes.conf

cluster-node-timeout 5000

appendonly yes


2번쨰 노드 config 파일

port 7001

cluster-enabled yes

cluster-config-file nodes2.conf

cluster-node-timeout 5000

appendonly yes


3번째 노드 config 파일

port 7002

cluster-enabled yes

cluster-config-file nodes3.conf

cluster-node-timeout 5000

appendonly yes




샤딩 하기위해 써드파티모듈로 스크립트실행 

ruby redis-trib.rb create --replicas 0 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002

샤딩이 잘 됬는지 확인해보면 역시 모든노드가 다 마스터로되있고, 앞에 해쉬값이 나와있으며 맨뒤에는 각 노드가 데이터를 쓸 영역임 (0-5460, 5461-10922, 10923-16383)



redis-stat으로 실시간 노드 모니터링 



테스트 스크립트 작성후 각 노드 상태확인

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
const redis = require("redis"),
    client = redis.createClient({
        host : '127.0.0.1',
        port : '7000',
    });
let t1,t2;
let str ='';
 
for(let i=0; i<1; i++) {
    t1 = +new Date;
    for(let j=0; j<10; j++
        str += String.fromCharCode(parseInt(Math.random()*26+ 97);
    
    client.set(str,str);
    t2 = +new Date;
    str ='';
    if(t2 - t1 > 1// output if t2-t1 is less than 1ms
        console.log(t2-t1);
}
 
client.on('connect', () => {
    console.log('connected ! ');
})
 
 
 
cs








각각의 데이터가 해쉬값에 따라 노드에 저장된걸 확인 한 후, 조회해보기 ( 클러스터구성했기떄문에 redis-cli에서 -c옵션(cluster option)을 줘야함 안주면 에러~)




7000포트에 연결되있는 노드에서 7001번에 저장되있는 키에 조회를 했는데 리다이렉트되면서 조회된걸 확인해볼수있음.