개발일지
개발일지 86일차
index.ys
2023. 7. 3. 15:09
Redis 트래픽 분산
Redis도 트래픽이 늘어나면 한 대의 Redis 인스턴스로는 트래픽 처리가 어려운 상황발생가능, Redis의 트래픽을 분산 시키는 방법중 Cluster와 Master/Slave가 존재함,
Redis Cluster
- master 노드를 여러대 두어 트래픽을 분산
- master노드에는 하나 이상의 slave노드를 둘 수 있음
- 하나의 master 노드가 다운되어도 다른 2개의 master 노드가 존재하기 때문에 redis의 가용성을 높힐 수 있음
- 데이터를 저장하는 방식은 해시슬롯 이라는 방식을 사용함. CRC-16 해시 함수를 사용해 key를 정수로 변환하고 해당정수값을 16,385로 모듈 연산한 값 cluster는 총 16384개의 해시슬롯이 있으면 각 master노드에 자유롭게 할당이 가능
- 3개의 마스터 노드가 존재한다고 가정했을때 0 ~ 5460, 5461 ~ 10922 , 10923 ~ 16383까지 해시 슬롯을 할당
- 1개의 master 노드가 다운 되었을때, master노드의 하위에 있던 slave노드를 master로 승격시키고 승격된 master노드의 data를 기준으로 slave노드들의 데이터 정합성을 맞춤
- 각 노드는 master slave 구분없이 read write 동작 수행이 가능함
- scale-out에 해당함 ( 서버를 추가하여 성능을 높힘 )
- 데이터를 여러 노드에 분산하여 저장함
데이터를 백업하는 방식
RDB persistence
- 일정 인터벌로 point-in-time snapshots을 생성함 => 특정시점을 기준으로 저장된 데이터를 파일에 기록함
- 단일 파일로 저장되어 백업하기 용이함
- 부모 프로세스는 자식 프로세스를 fork, fork된 프로세스에서 모든 persis I/O처리
- 다운되었을때 데이터 유실 가능성이 높음
AOF Append Onlye File
- 모든 write operation을 log로 남기고 서버재시작 시점에 replay
- 데이터 양이 많아지면 해당 시점의 데이터셋을 만들어낼 수 있도록 하는 minimum log들만 남김
- 읽기 쉽지만 RDB보다 용량이 크다
- write 리퀘스트가 많을때 RDB보다 반응이느림
요약
RDB는 백업하기 쉽고 재시작 시간이 빠르지만 데이터 손실 가능성이 있습니다. AOF는 데이터 양이 크지만 데이터 유실 가능성이 낮습니다.

Redis로 Cluster구현하기
redis.conf
// 설정파일 복사
$ cp redis.conf redis_3000.conf
$ cp redis.conf redis_3001.conf
$ cp redis.conf redis_3002.conf
$ cp redis.conf redis_4000.conf
$ cp redis.conf redis_4001.conf
$ cp redis.conf redis_4002.conf
// 로그파일 저장 경로
$ mkdir logs
// 설정 수정 (포트를 다르게 넣는 부분 빼고 모두 동일하게 수정한다.)
$ vi redis_3000~3002, 4000~4002.conf
port 3000~3002, 4000~4002
# 백그라운드에서 시작하도록 설정
daemonize yes
# 클러스터를 사용하겠다.
cluster-enabled yes
# 클러스터 구성 내용을 저장한는 파일명 지정 (자동 생성됨)
cluster-config-file nodes-3000~3002, 4000~4002.conf
# 클러스터 노드가 다운되었는지 판단하는 시간 (3s)
cluster-node-timeout 3000
# Appendonly를 yes로 설정하면 rdb에 저장 안되고 aof에 저장됨 (각각 장단점이 있으니 해당 부분은 선택 사항)
appendonly yes
# append only yes 시 해당 부분도 수정
appendfilename appendonly_3000~3002, 4000~4002.aof
# 프로세스 아이디 저장 경로 설정
pidfile /var/run/redis_3000~3002, 4000~4002.pid
# 로그 파일 저장 경로 지정
logfile logs/redis_3000~3002, 4000~4002.log
시작
$ src/redis-server redis_3002.conf
$ src/redis-server redis_3001.conf
$ src/redis-server redis_3002.conf
$ src/redis-server redis_4000.conf
$ src/redis-server redis_4001.conf
$ src/redis-server redis_4002.conf
확인
$ ps -ef | grep 'src/redis'
마스터 노드 설정
$ redis-cli --cluster create 127.0.0.1:6300 127.0.0.1:6301 127.0.0.1:6302
슬레이브 노드 설정
$ redis-cli --cluster add-node 127.0.0.1:4000 127.0.0.1:3000 --cluster-slave
$ redis-cli --cluster add-node 127.0.0.1:4001 127.0.0.1:3001 --cluster-slave
$ redis-cli --cluster add-node 127.0.0.1:4002 127.0.0.1:3002 --cluster-slave
클러스터확인
$ redis-cli --cluster info 127.0.0.1:3000