Search

Redis HA

Tags
redis
high-availability
Created
2024/05/04 17:29
Created time
2024/05/04 08:29
category
redis

개요

RHA라는 약어를 자주 접함에 따라 RHA가 무엇인지 탐색
Redis Single Instance / Sentinel / Cluster 세가지 형태가 있는 것은 아는데, RHA라고 하니 Sentinel을 지칭하는 것인지 추측한 부분도 확인

요약

Redis HA는 Redis 다운 등의 실패를 감당할 수 있는지의 범용적인 의미
HA가 실행될 때 데이터 보존 여부는 Master와 Slave 간의 Replication을 구성하여 데이터 동기화를 했는지 여부로 결정
HA 수행으로 Redis 복구하는 과정에서 클라이언트의 Redis 엔드포인트 재수정 배포가 필요한데, 이런 자동화를 수행해주는 것이 Sentinel

Replication

Master / Slave 서버 실행

HA 구성을 위해 서버 2개를 6001, 6002로 실행
** 6001을 Master로 이용
** 6002를 Replication 목적의 Slave로 이용
# Shell 1 redis-server --port 6001 # Shell 2 redis-server --port 6002
Bash
복사

Slave에서 Master의 복제 설정

6002가 Slave였으므로, redis-cli로 접속하여 replicaof로 복제 설정
redis-cli -h 127.0.0.1 -p 6002 # Replication 설정 > replicaof 127.0.0.1 6001 # Replcation 설정 해제 > replicaof no one
Bash
복사
# Replication 정보 확인 > info replication
Bash
복사

Master에서 데이터 주입

복제 설정을 한 상태로 Master에서 데이터 주입
# multi set > mset a jseo b seongtki c hannkim d san # multi get > mget a b c d
Bash
복사

Slave에서 데이터 복제 확인

Slave에서도 복제된 데이터를 확인할 수 있는지 확인
# multi get > mget a b c d
Bash
복사

HA

Master 노드가 완전히 죽은 경우, Slave를 Master로 승격하는 과정이 필요
이를 위해선
1.
기존의 Slave 노드에서의 복제 설정을 해제
replicaof no one을 지정하여 기존 Master에서의 복제를 받지 않도록 설정
2.
Application 상에서의 Redis 엔드포인트를 Master에서 Slave로 변경 필요
→ Slave 엔드포인트로 변경하여 재배포 수행
위 과정을 수작업으로 수행하기엔 시간이 꽤 소요되고, 수행 도중에 데이터 유실 가능성이 존재
따라서 이와 같은 문제를 해결하기 위해 자동으로 Fail Over를 돕는 것이 Sentinel
Sentinel은 다수의 노드로 구성되어 Quorum으로 Fail Over 여부를 결정짓는데, 이 글에서 다루지 않음
경우에 따라 Sentinel을 사용하지 않는 방식의 HA도 있을 수 있음
예를 들어 엔드포인트를 수정하여 재배포 하는 대신에, Master에서 사용하는 도메인 네임을 Slave에 덧씌우는 식의 교체로 HA를 수행할 수도 있을 것임

참고

Redis HA(RHA)에 대해
Redis HA에 대해 모든 저장소가 그렇듯 Redis에서도 High Availability를 지원한다. Replication Node에서 Master 정보에 대해 추가하면 된다. > replicaof 127.0.0.1 6001 # master ip / port 어떻게 Replication이 동작하는가? replicaof 명령어를 받은 master 노드 A는 자식 프로세스를 만들어 백그라운드로 덤프파일을 만든다. 덤프 파일을 네트워크를 통해 Replica 노드인 B에 보낸다. 덤프 파일을 받은 노드 B는 데이터를 메모리로 로드한다. 문제는 없을까? in-memory 저장소라서 Redis 프로세스가 다운되면 메모리 내에 저장됐던 데이터는 유실된다. Replica 노드를 master로 승격해서 사용해야 하는데 이 과정은 아래와 같다. Replica 노드에서 replicaof NO ONE 커맨드를 통해 master 연결 해제 어플케이션 코드에서 레디스 연결 설정을 변경 (master -> replica) 배포 이를 간단하고 빠르게 해결하기 위해 등장한 기술이 sentinel이다. Sentinel master, replica 노드를 모니터링하고 문제가 생기는 경우 자동 fail-over를 진행한다. notification 설정하는 것도 가능하다. 최소 세 개의 Sentinel 인스턴스가 필요하다. master를 선정하는 과정에서 투표하는 과정을 거치기 때문 어플리케이션은 master - replica에 연결되는 것이 아니라 sentinel에 연결한다. 실행하는 방법은 다음과 같다. redis-sentinel /path/to/sentinel.conf redis-server /path/to/sentinel.conf --sentinel 아래의 구조로 sentinel을 구성하면 어떨까? master와 2개의 replica 각각 서버에 sentinel을 포함한다. 네트워크가 이상이 없을때는 문제가 없다. +----+ | M1 | | S1 | +----+ | +----+ | +----+ | R2 |----+----| R3 | | S2 | | S3 | +----+ +----+ Configuration: quorum = 2 네트워크가 끊어지는 경우 과반수로 결정할 수 없는 상황이 발생하기 때문에 추천하지 않는다고 한다. +----+ | M1 | | S1 | <- C1 (writes will be lost) +----+ | / / +------+ | +----+ | [M2] |----+----| R3 | | S2 | | S3 | +------+ +----+ Sentinel, Master, Replica 모두 분리하는 상황 +----+ +----+ | M1 |----+----| R1 | | | | | | +----+ | +----+ | +------------+------------+ | | | | | | +----+ +----+ +----+ | C1 | | C2 | | C3 | | S1 | | S2 | | S3 | +----+ +----+ +----+ Configuration: quorum = 2 Redis Cluster 많은 데이터와 높은 TPS를 필요하다면 Cluster를 고려해볼만 하다. 최소 3 개의 Master 노드가 필요하다. 샤딩으로 모든 데이터를 노드에 맞게 분배하여 저장한다. 각 노드는 16384개의 슬롯을 가지고 있다. Sentinel 프로세스 대신 레디스 Node 끼리 모니터링한다. 샤딩키를 잡기 위해서는 Consistent Hashing을 사용한다. Reference - Consistent Hashing 사용자는 어느 노드에 데이터가 있는지 없는지 알 수 있을까? Redis 특정 노드에 데이터를 찾았을 때 데이터가 없는 경우 Client에게 Redirect 결과를 반환한다. Client는 Redirect된 Node로 다시 결과를 요청한다. Client에서 Redirect 처리가 안되어있다면 데이터를 찾을 수 없다. Client에 의존적이다. Couchbase에서는? Client쪽에서 Shard Info 정보를 들고 있어 실제로 바로 데이터가 담긴 Node로 요청하는 방법이 있다. 아마도 Redis Client쪽에서 Cache를 들고 있지 않을까? Failover Coordinator 기반 Failover Zookeeper, consul등의 Coordinator 개발이 필요하지만 관리 비용은 낮은 장점이 있다. VIP / DNS 기반 Failover 각 Layer DNS 캐시를 주의하며 사용하자. Redis Cluster 사용 Reference https://meetup.toast.com/posts/226 https://brunch.co.kr/@springboot/218 https://www.youtube.com/watch?v=mPB2CZiAkKM