일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 컴퓨터구조
- 네트워크
- c언어
- C
- design pattern
- OS
- 디자인 패턴
- redis
- Kafka
- JavaScript
- 백준
- mongoDB
- Proxy
- 자바
- MySQL
- spring webflux
- Algorithm
- Java
- Galera Cluster
- 운영체제
- Data Structure
- Heap
- IT
- 알고리즘
- 파이썬
- JPA
- 자료구조
- MSA
- Spring
- react
Archives
- Today
- Total
시냅스
Redis 설치부터 Cluster 구성까지 본문
이 글에서는 Cent OS 를 기준으로 Redis 설치부터 Redis Cluster 구성까지 살펴봅니다.
실제로 운영하며 겪었던 TroubleShooting 및 중요사항에 대해 설명합니다.
Redis 설치
- 공식 release 링크
- 위 링크를 통해 원하는 버전의 redis 를 download 받습니다.
wget http://download.redis.io/releases/redis-{version}.tar.gz
- 다운로드 받은 tar 를 해제한 후 해당 폴더 내부에서
make
를 실행합니다.- 이때 필요한 package 는
make
,pkg-config
,gcc
입니다. - 우선 같은 폴더의
deps
로 들어간 뒤make hdr_histogram hiredis jemalloc linenoise lua
를 실행하여 컴파일합니다. make distclean
이후make
를 해주면 정상적으로 작동 가능합니다.
- 이때 필요한 package 는
- 같은 위치에서
make install
을 실행합니다. redis-cli
,redis-server
명령어를 실행하며 테스트합니다.- 만약 전역으로 명령어가 실행되지 않는다면 같은 위치에서
sudo cp src/redis-cli /usr/bin
을 실행합니다.
- 만약 전역으로 명령어가 실행되지 않는다면 같은 위치에서
Redis Cluster 구성
redis 설정 파일
# 설정을 위한 주요 옵션...
bind 0.0.0.0
port 7000
pidfile /var/run/redis_7000.pid
logfile "/home/redis/redis_7000/logs/redis.log"
dir /home/redis/redis_7000/data
cluster-enabled yes
cluster-config-file /home/redis/redis_7000/nodes-7000.conf
# ...
- clustering 설정에 주요한 옵션은 위와 같습니다.
- 현재 관리를 위한 dir 를
/home/redis/redis_{PORT}
로 설정하고, log, config-file, data 를 설정합니다.- 위에서 설정한 모든 dir 는 사전에 생성되어 있어야 합니다.
- redis-cluster 는 비교적 설정이 간단하여 scale-out 에 유리합니다.
- 현재 관리를 위한 dir 를
- 이후
redis-server
명령어를 통해 방금 만든 설정파일을 사용하여 각 node 들을 실행해줍니다.redis-server redis_{PORT}.conf
- 실행이 완료되었다면
redis-cli
를 사용하여 접속해봅니다. redis-cli -h {HOST} -p {PORT}
- 정상적으로 기동되었다면 log file 에서
Running in cluster mode
문구를 발견하실 수 있습니다.
- clustering 구성은 총 6대로 계획하였고, HA 구성을 위해 각 master-slave node 는 physical 위치를 다르게 구성하였습니다.
- 172.31.0.49 (HA-1)
- 7000 -> master
- 7001 -> HA-2 slave
- 172.31.10.85 (HA-2)
- 7000 -> master
- 7001 -> HA-3 slave
- 172.31.10.90 (HA-3)
- 7000 -> master
- 7001 -> HA-1 slave
- 참고
- redis cluster 는 cluster bus 로
1 + 사용하는 포트
의 포트를 사용합니다.- cluster bus 는 장애 감지, 구성 업데이트, failover 승인 등에 사용됩니다.
- 위에서 설정한대로,
17000
,17001
,7000
,7001
을 방화벽 해제해주어야 통신이 가능합니다.
- redis cluster 는 cluster bus 로
- 172.31.0.49 (HA-1)
- 위에서는 단순히 node 들을 실행만 하였으므로 clustering 설정을 위해 아래와 같은 절차를 따릅니다.
- master 를 먼저 설정해줍니다.
redis-cli --cluster create 172.31.0.49:7000 172.31.10.85:7000 172.31.10.90:7000
- 이 명령어는 한 군데에서만 실행해도 됩니다.
- 이후 위에서 설계한대로 slave 를 설정해줍니다.
redis-cli --cluster add-node 172.31.0.49:7001 172.31.10.85:7000 --cluster-slave
redis-cli --cluster add-node 172.31.10.85:7001 172.31.10.90:7000 --cluster-slave
redis-cli --cluster add-node 172.31.10.90:7001 172.31.0.49:7000 --cluster-slave
- 설정이 정상적으로 끝났다면 redis dir 에 들어가서
nodes-7000.conf
를 확인합니다.- 위 설정파일은 redis 에서 자동으로 만들어주는 파일로, cluster 구성에 대해 보여줍니다.
- 임의로 작성/수정해서는 안됩니다.
redis-cli -h {HOST} -p {PORT} cluster nodes
로도 cluster 구성을 확인할 수 있습니다.
- master 를 먼저 설정해줍니다.
Redis Cluster 실행
- Redis Cluster 의 실행은 위에서 살펴봤듯, 모든 Node 를 실행시킨 뒤 clustering 설정을 통해 합니다.
Redis Cluster 중지
- Redis Cluster 의 중지는
redis-cli -h ${HOST} -p ${PORT} shutdown
명령어는 통해 합니다.- 이 때 down 된 node 가 master 라면 slave 로 설정한 node 가 master 로 failover 되는지 확인이 필요합니다.
- failover 는 config file 에 정의한
cluster-node-time-out
시간이 지나면 수행합니다. - failover 가 되었다면 중지된 master 대신 slave 가 master 의 역할을 대신하게 됩니다.
- slave 가 down 되었다면 master에 영향 없이 slave 로 보내던 Replication 을 멈춥니다.
Redis Cluster 재기동
redis-server /{REDIS_CONF_DIR}/redis_{PORT}.conf
로 실행합니다.- 만약 master-slave 구조를 맞추고 싶다면, 각 서버의 master 를 먼저 wake up 한 뒤 slave 를 순차적으로 up 시킵니다.
- 이렇게하면 자연스럽게 master - slave 구조를 맞출 수 있습니다.
- 이렇게 재기동 했을 때에는 기존에 설정했던
nodes_{PORT}.conf
로 원래의 clustering 설정을 따라갑니다. - 따라서 clustering 설정을 변경하고 싶다면,
nodes_{PORT}.conf
file 을 삭제하거나, redis config file 에서cluster-config-file
옵션을 변경하면 됩니다.
- 만약 master-slave 구조를 맞추고 싶다면, 각 서버의 master 를 먼저 wake up 한 뒤 slave 를 순차적으로 up 시킵니다.
- 만약, 재기동시 의도했던 master 가 slave 로 확인된다면, 해당 node 의 slave 를
cluster-node-time-out
시간만큼 중지한 후 재기동합니다.- 재기동 이후 master-slave 역할이 잘 수립되었는지 확인합니다.
참고 - Redis Cluster 의 동작 방식
- redis cluster 는 데이터를 hashing 한 후 sharding 하는 정책을 취합니다.
- 따라서 redis cluster 는 하나의 몸체이지만, 데이터는 해싱값을 기준으로 각각의 master에 나눠져서 들어갑니다.
- 이때 slave 는 master 의 모든 데이터를 replication 하고 만약 master 에 장애가 발생한 경우 slave 로 failover 됩니다.
- 클라이언트에서 redis cluster 에 data 요청을 하면 먼저 연결된 node 와 연결을 수립하고, 만약 데이터가 없는 경우 redis cluster는 'MOVED {HOST}' 오류와 함께 올바른 주소로 redirection 하여 데이터를 가져오도록 유도합니다.
- Spring Data Redis 도 동일하게 동작합니다.
- 따라서 redis cluster 는 하나의 몸체이지만, 데이터는 해싱값을 기준으로 각각의 master에 나눠져서 들어갑니다.
- Master - Slave Replication 과정
- 첫 node 가 slave 로 설정되었을 때는 master 에서 현재 메모리 상태 스냅샷을 기준으로 RDB 파일을 생성해서 slave 로 전송합니다.
- 위처럼 모든 데이터를 받는 것을
Full Replication
이라고 합니다.
- 위처럼 모든 데이터를 받는 것을
- 일시적인 중지 이후 데이터를 동기화 하는 경우 변경 사항만을 마스터로부터 받아들입니다.
- 이 방식을
Partial Replication
- slave 는 마지막으로 받았던 데이터의 offset 을 master 에게 알려줍니다.
- 이 offset 을 기준으로 master 는 slave 에게 아직 전송하지 않은 변경사항을 찾아서 명령 로그(
REPLBACKLOG
) 형태로 전송합니다.- offset 이 버퍼에 없거나, REPLBACKLOG 의 크기가 너무 작을 때 등은
Full Replication
을 재수행합니다.
- offset 이 버퍼에 없거나, REPLBACKLOG 의 크기가 너무 작을 때 등은
- 이 방식을
- 실시간으로 동기화 하기 위해서 모든 쓰기 명령을 명령어의 형태로 slave 에게 보냅니다.
- 첫 node 가 slave 로 설정되었을 때는 master 에서 현재 메모리 상태 스냅샷을 기준으로 RDB 파일을 생성해서 slave 로 전송합니다.
- Single Thread? Multi Thread?
- Redis 명령의 실행 자체는 Single Thread 로 동작합니다.
- Network IO / Disk IO 에 대해서 Redis 6++ 부터 Multi Threading 을 지원합니다.
- Thread IO, Replication, AOF(Append Only File) & RDB(Redis DataBase)에 한해서는 Multi Threading 을 지원합니다.
- Thread IO Multi Thread 적용 부분
- 클라이언트가 전송한 명령을 네트워크로 읽어서 파싱하는 부분
- 명령이 처리된 결과 메시지를 클라이언트에게 네트워크로 전달하는 부분
- 데이터를 조작하는 것은 빠져있으므로 여전히 Redis 의 CRUD는 Atomic 속성을 지원합니다.
- RDB (Data 파일 Snapshot), AOF (명령 구문 파일 Snapshot)
- RDB 와 AOF 는 In-Memory Storage 인 Redis 의 영구적 데이터 보존에 대한 단점을 보완하기 위한 메커니즘입니다.
- 실제 수행은 다르지만, 두 방식 모두 복구를 위한 Data 를 Disk 에 백업한다는 것은 동일합니다.
- 두 방식은 Disk IO 를 유발하기 때문에, 각각을
rdb-save-incremental-fsync
,aof-rewrite-incremental-fsync
옵션을 활성화하여 Multi Threading 을 적용할 수 있습니다.
- RDB 와 AOF 는 In-Memory Storage 인 Redis 의 영구적 데이터 보존에 대한 단점을 보완하기 위한 메커니즘입니다.
- Replication
- 주로 Replication Data 를 읽거나, Network로 전송할 때에 Multi Threading 이 지원됩니다.
io-threads-do-reads
옵션을 활성화하게 되면 복제 과정 중 데이터를 읽고 슬레이브에 전송하는 작업을 여러 thread 가 처리합니다.
- Thread IO Multi Thread 적용 부분
- Thread IO, Replication, AOF(Append Only File) & RDB(Redis DataBase)에 한해서는 Multi Threading 을 지원합니다.
끝!
'데이터베이스 > Redis' 카테고리의 다른 글
Redis 공식문서 기반 정리 ( +Spring 에서의 용례 ) (0) | 2022.10.25 |
---|
Comments